8
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【MATLAB】Excel ファイルのセル幅自動調整

Last updated at Posted at 2020-07-05

やったこと

Excel ファイルに書き出した時にセル幅が残念な場合があります。これを自動調節してみました。ただ、残念ながら MATLAB 側の機能ではできそうにないので、MATLAB から Excel の機能を使います。

公式ページとしてはこちら:Excel をオートメーション サーバーとして使用したスプレッドシート データの読み取り

xlswrite を使っている方は「なんで xlswrite が非推奨?」の項がお勧めです。

Livescript 版(MATLAB)は GitHub: ActiveX-Excel-MATLAB1 に置いてあります。

セル幅調整?具体的には

例えば table 型で

Code
data = ["fileEnsembleDatastore","ds","datastore"];
data = array2table(data)
data1 data2 data3
1 "fileEnsembleDatasto... "ds" "datastore"

というデータを Excel に書き出してみます。

Code
filename = 'undisiredFormat.xlsx';
writetable(data,filename);

Excel で開くと多少残念な気持ちになります。

image_0.png

これを

Code
autoFitCellWidth(filename);

image_1.png

とデータの長さに合わせてセル幅を調整させるというお話。

余談:Excel に書き出すための関数

MATLAB から Excel ファイルに出力する関数としては xlswrite 関数が長らく使われていましたが、最近は

などが推奨されています。同様に csvwrite 関数も「非推奨」の文字が出るようになりました。

なんで xlswrite が非推奨?

書き出し速度が段違いです。この例では 100 倍以上違います。

Code
data = rand(10,10);
tic
xlswrite('test_xlswrite.xlsx',data);
toc
Output
経過時間は 8.999516 秒です。
Code
tic
writematrix(data,'test_writematrix.xlsx');
toc
Output
経過時間は 0.071814 秒です。

かなり違います。

xlswrite 関数は Excel を起動しているので時間がかかります。さらに都合が悪いことに、何度も呼び出すとそのたびに Excel 起動して閉じてを繰り返すので大変時間がかかります。write* 系を使いましょう。

セル幅調整

さて本題。関数の中身を見た方が速いですね。VBA に詳しい方ならピンとくると思いますが、、どうでしょう。

Code(Display)
function autoFitCellWidth(filename)

    % Excel ファイルへの絶対パスを取得
    filepath = which(filename);
    
    % Excel に対して ActiveX を開く
    h = actxserver('excel.application');
    wb = h.WorkBooks.Open(filepath);
    
    % UsedRange: データが入っている範囲の
    % EntireColumn: 列全体を
    % AutoFit: データに合わせた幅にします
    wb.ActiveSheet.UsedRange.EntireColumn.AutoFit;
    
    % 指定したファイル名で保存しエクセルを閉じる
    wb.SaveAs(filename);
    wb.Close;
    h.Quit;
    h.delete;
    % 注意:この辺キッチリ Close/Quit/delete しておかないとあとでややこしいです。
    %(ほかのアプリで使われていて開けない・消せないなど起こります)
    % PC 再起動すれば大丈夫です。
end

ActiveSheet やら UsedRange やら EntireColumn などは Excel 側のコマンド。同じ要領で他にも Excel ができることはできちゃう、、はず。

その他の編集作業例

範囲を指定して同じ作業をするなら

Code(Display)
    range = 'A1:H5';
    wbrange = wb.ActiveSheet.get('Range',range);
    wbrange.EntireColumn.AutoFit;

とか、セル幅を決め打ちで行くなら

Code(Display)
    wbrange.EntireColumn.ColumnWidth = 20;

など。

あとセルの塗りつぶしや文字の色を変えるなら

Code(Display)
    % セルの塗りつぶし
    wb.ActiveSheet.UsedRange.Interior.Color=hex2dec('00FF00'); % 緑
    % フォントの色
    wb.ActiveSheet.UsedRange.Font.Color=hex2dec('0000FF'); % 赤
    % 色は16進数の BGR の組み合わせで指定
    % 赤: 0000FF
    % 青: FF00FF
    % 緑: 00FF00
    % 黒: 000000
    % 白: FFFFFF

こんな感じです。他にも MATLAB Answers にもいくつか例がありますのでもし必要があればぜひ。

参考

Appendix: autoFitCellWidth 関数

Code
function autoFitCellWidth(filename)

    % Excel ファイルへの絶対パスを取得
    filepath = which(filename);
    
    % Excel に対して ActiveX を開く
    h = actxserver('excel.application');
    wb = h.WorkBooks.Open(filepath);
    
    % UsedRange: データが入っている範囲の
    % EntireColumn: 列全体を
    % AutoFit: データに合わせた幅にします
    wb.ActiveSheet.UsedRange.EntireColumn.AutoFit;
    
    % 指定したファイル名で保存しエクセルを閉じる
    wb.SaveAs(filename);
    wb.Close;
    h.Quit;
    h.delete;
    % 注意:この辺キッチリ Close/Quit/delete しておかないとあとでややこしいです。
    %(ほかのアプリで使われていて開けない・消せないなど起こります)
    % PC 再起動すれば大丈夫です。
end

  1. Livescript から markdown への変換は livescript2markdown​: MATLAB's live scripts to markdown を使っています。

8
10
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?