目次
はじめに
画像を読み込む
列番号をExcelに対応させる
背景色番号を抽出
Cell型に変換
MATLABからExcelを操作しよう
使用した関数
数字をExcelの列に対応する関数
背景を塗りつぶす関数
結果
おわりに
はじめに
こんにちは、HerniaBabyです。
皆さんExcel大好きですよね?世間ではネ申Excelといわれるものが世の中にはびこるくらい日本人はExcel大好きだと思っています。
もはやExcelは和の心、大和魂…。
そんなわけで今回は画像を別の形式に変換するクソアプリをMATLABでやっていきたいと思います。
画像を読み込む
まずは画像を読み込みましょう。
このときに方眼に色を書き込むんですが、画像がデカいとずっと計算が終わらないのでimresizeで小さくしていきます。
clc,close all,clear;
I = imread('chacha.jpeg');
I = imresize(I,[150 150]);
imshow(I)
画像は愛犬チャチャです。かわいいね( *´艸`)
ここで画像の範囲を抜き出します。
[row, col] = size(I,1,2);
列番号をExcelに対応させる
Excelは列がA...AA...AAAのような英語になっています。
列番号をこれに対応させる必要があります。
MATLABで数字をExcelの列名に変換でMATLABアンバサダーの方が紹介してくれてますが、今回はMATLAB Answersのものを拾って使ってます。
I need to convert a number into its column name equivalent
col_e = arrayfun(@int2xlcol, (1:col));
ImgString = col_e + string((1:row)');
背景色番号を抽出
RGB値を抜き出してExcelで使えるようにします。
最初は Cody を参考にHex Stringに直してたんですが、結局hex2decに直してたのでそのままdouble型で出してます。
ExcelはBGRなので注意してください
How to set excel cell color to red from Matlab?
I_d = im2double(I);
[R,G,B] = imsplit(I_d);
bgrColor = (B.*256^2 + G.*256 + R).*255;
Cell型に変換
forループを使うとMATLABフリークスがマジギレするのでcellfunを使います。
そのためcell配列に変換します。
ImgCells = cellstr(ImgString);
bgrColorCell = num2cell(bgrColor);
MATLABからExcelを操作しよう
こいつのドキュメント本当に少なくて苦労しました。
MathWorksさん!Excelは大和魂ぞ?!充実させてください(白目)
今回は色んなところからかき集めたので説明していきます。
まずはパスを指定します。
%Obtain the full path name of the file
filePath = fullfile(pwd, 'Book1.xlsx');
ExcelをActiveXで起動させます。
%Open an ActiveX connection to Excel
h = actxserver('excel.application');
Excelファイルを開きます。
%Open an excel file
wb = h.Workbooks.Open(filePath,0,false);
ここで各セルに背景色を書き込みます。
cellfun(@(x,y) xlscolor(h, x, y), ImgCells, bgrColorCell)
行の高さと列の幅を正方形にします。
ハンドルプロパティどこあるのか苦労しました。
列幅はQiita(【MATLAB】Excel ファイルのセル幅自動調整)にあったんですよね。高さが…。
ちなみに正方形の調整は以下を参考にしました。
range = ImgString(1,1)+":"+ImgString(end,end);
wbrange = wb.ActiveSheet.get('Range',range);
wbrange.EntireColumn.ColumnWidth = 1.88;
wbrange.EntireRow.RowHeight = 15;
最後に上書き保存してExcelを閉じます。
% save the file with the given file name, close Excel
wb.Save;
wb.Close;
h.Quit;
h.delete;
disp('完了')
完了
使用した関数
数字をExcelの列に対応する関数
function str = int2xlcol(num)
raw = 'A':'Z';
str = raw(1+rem(num-1,26));
tmp = fix((num-1)/26);
while any(tmp)
str = [raw(1+rem(tmp-1,26)),str]; %#ok<AGROW>
tmp = fix((tmp-1)/26);
end
str = string(str);
end
背景を塗りつぶす関数
function xlscolor(h, range, Color)
ran = h.Activesheet.get('Range',range);
ran.interior.Color = Color;
end
結果
けっこうよくないですか?!
アップするとこんな感じです↓
てことで完成です。
おわりに
今回は業務に関連するものではなく気ままに作りました。
応用すると昔流行ったExcelでBadAppleなんかも出来そうですね。
cellfun使ったんですがやり方が悪いのか計算が遅いんですよね。
誰か行列を指定して一気に背景色反映させる方法知りません?
知ってたら教えてください。
2023.12.07追記
MATLAB Answersでも聞いてみましたが、値(Value)のみが一括で変更できるみたいです。
MATLABからExcelの背景色を一括で変えたい
2023.12.11追記
目次でアルファベット入れる場合はリンクのものを小文字にする必要があるんですね。
目次にアルファベットを打っても効果なしですか?
2023.12.11追記
GitHubにも掲載しました。
何気に初めてやりました。