パワポのリンク切れグラフを救うMATLAB術


こんにちは、HerniaBabyです。
今回はPowerPointの資料を引き継いだ時あるあると対処法やっていきたいと思います。

# 目次
- [はじめに](#はじめに)
- [準備](#準備)
- [中身を見てみよう](#中身を見てみよう)
- [データを救出](#データを救出)
- [エクセルに保存](#エクセルに保存)
- [終わりに](#終わりに)
- [おまけ](#おまけ)

  
# はじめに

皆さん、こんなことありませんか？

パワーポイントの資料にあるグラフを使いたい…
![image_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/781521/2733fbaa-6cb5-6ced-8024-da4e442bea0e.png)


  

右クリックしてデータの編集を押しますよね？
![image_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/781521/8f0b59fa-b4b8-4f18-401f-6133001e0282.png)


  

そしたらこれ
![image_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/781521/63e5fa51-d04d-6c2c-9804-18260a9800a1.png)


  
![image_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/781521/36ea63e5-7d22-abb8-92d7-f977431b1959.png)

ここでだいたい諦めると思いますが、今回はそれを救出しましょう。

  
# 準備

まずはパワポのデータをコピーして拡張子をzip形式にします。
![image_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/781521/97d317bc-1022-caca-4c9d-dd4f6eb1ce02.png)


  
# 中身を見てみよう

以下の手順で chart1.xml を探します。
![image_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/781521/156440b9-e83a-0e7d-b09d-1125d06dd3e3.png)


VSCodeで中身を見てみると・・・
![image_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/781521/be682a8f-10ef-1003-2f59-30c6d67e6833.png)


どうも < c:v > と < /c:v > の間に数字が埋まってそうです。

  
# データを救出

まずはデータを読み込みます。

```matlab:Code
fname   = 'chart1.xml';
txt     = fileread(fname);
```

次に < c:numCache > と < /c:numCache > の間をとります。

```matlab:Code
startPat    = '<c:numCache>';
endPat      = '</c:numCache>';
T = extractBetween(txt,startPat,endPat)
```

```text:Output
T = 2x1 cell    
'<c:formatCode>General</c:formatCode><c:ptCount val="26"/><c:pt idx="0"><…  
'<c:formatCode>General</c:formatCode><c:ptCount val="26"/><c:pt idx="0"><…  

```

x軸とy軸のデータがとれそうですね。

  

ここからそれぞれの数字をとってみましょう。

```matlab:Code
startPat    = '<c:v>';
endPat      = '</c:v>';
C = extractBetween(T,startPat,endPat)'
```

```text:Output
C = 26x2 cell    
'0'          '0.46535735484144181'
'1'          '0.24058892718565272'
'2'          '0.38828185922115804'
'3'          '0.14205571372730461'
'4'          '0.74214061125431341'
'5'          '1.1921126247527463' 
'6'          '1.1255206724949594' 
'7'          '0.11089586657166785'
'8'          '1.3045562710033081' 
'9'          '0.21587902699026487'

```

ここでまだやったーとはなりません。

中身を見ると文字として抜き出してます。

```matlab:Code
class(C{1})
```

```text:Output
ans = 'char'
```

数値に変えましょう。

```matlab:Code
C = str2double(C)
```

```text:Output
C = 26x2    
         0    0.4654
    1.0000    0.2406
    2.0000    0.3883
    3.0000    0.1421
    4.0000    0.7421
    5.0000    1.1921
    6.0000    1.1255
    7.0000    0.1109
    8.0000    1.3046
    9.0000    0.2159

```

```matlab:Code
plot(C(:,1),C(:,2),'ko-','Color',[.3 .3 .3])
```

![figure_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/781521/f8089df5-b1cd-b063-588b-e80f8c26f3e5.png)


エクセルだと曲線プロットになってましたが、MATLABではジグザグしてます。

でもなんかとれてそうですね。

# エクセルに保存

保存して中身をプロットしてみましょう。

```matlab:Code
writematrix(C,'data.xlsx')
```
![image_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/781521/508a8da7-0a22-91f2-d07d-7d117e7687d8.png)


  

うん、できてますね。

ちなみに横軸日付の場合はシリアル値で書かれます。

datetimeなどで形を変えて保存しましょう。

  
# 終わりに
画像からだいたいの数値を持ってくる方法もあるけど、今回は厳密に欲しいということでやってみました。

この方法は[パワポのリンク切れグラフから値を探したかったのでchart1.xmlを探ってみた](https://ken3memo.hatenablog.com/entry/2023/01/07/222541)を参考にしました。

勉強になりました。


  
# おまけ

今回は[Table of Contents の追加：Live Script から Markdown への自動変換](https://qiita.com/eigs/items/ad27da605753cdce0a3e) を参考に作成しました。

いつもとても非常に助かっております。