フォルダダイアログか​ら複数ファイルを読み​込みグラフ化してエク​セルに保存

21 views (last 30 days)
fk
fk on 24 Sep 2021
Edited: Atsushi Ueno on 28 Sep 2021
拡張子なしのコンマ区切りファイルを複数選択し、選択したファイルに処理を加えた後にエクセルファイルに保存したいです。 具体的な処理は以下の通りです。 ①フォルダダイアログを開く ②複数ファイル(拡張子なし、カンマ区切りで2列データが入っている)を選択する →一つのセルにカンマ区切りで2つの数値が入っているデータが、1000行以上あります。行数はファイルによって変化します。 ③2列目のデータに、100をかけて3列目に保存 ④1列目と3列目をグラフ化する ⑤.xlsxファイルに保存する
以上の流れをコードで書きたいです。 uigetfile関数を使用してファイルを読み込むことは可能なのですが、その後の処理がわかりません。 わかる方がいましたらご教授いただきたいです。
  2 Comments
Atsushi Ueno
Atsushi Ueno on 24 Sep 2021
Edited: Atsushi Ueno on 24 Sep 2021
>一つのセルにカンマ区切りで2つの数値が入っているデータ
という表現が気になります。「コンマ区切りファイル」と言えばcsvファイル等のテキスト(ASCII)形式ファイルだろうと想定しますが、「セル」という用語が出てくると、拡張子が消えてしまったExcelファイルなのかな?と疑問が湧きます。
Atsushi Ueno
Atsushi Ueno on 24 Sep 2021
あと「グラフ化」はMATLABのグラフをExcelに貼り付けるのではなく、Excelファイル上でデータを指定してグラフ描画したものが必要なんだろうと察します。MATLABからでもCOM経由でVBAさながらの操作が出来ます

Sign in to comment.

Answers (1)

Atsushi Ueno
Atsushi Ueno on 24 Sep 2021
Edited: Atsushi Ueno on 28 Sep 2021
手元のPCにMicrosoft Excelが無くkingsoft officeでは挙動が変になり動作確認できていません。
サンプル通りなので多分行けると思いますが、とても危険なのでバックアップを取ったファイルで実行してください。
% ①フォルダダイアログを開く
[files,path] = uigetfile('*', 'ファイルを複数選択', 'MultiSelect', 'on');
if isequal(files,0) % ファイルを1つも選択しなかった場合
return; % 終了する
elseif ~iscell(files) % ファイルを1つしか選択しなかった場合
files = {files}; % 1つでもセルで包む
end
% Excelサーバの準備
excelapp = actxserver('Excel.Application');
wkbk = excelapp.Workbooks;
% 複数のファイル毎に処理する
for i=1:numel(files)
% ②複数ファイル(拡張子なし、2列データが入っている)を選択する
fid = fopen([path files{i}], 'rt');
filebycolumn = textscan(fid, '%f%f', 'Delimiter', ' ', 'MultipleDelimsAsOne', 1);
fclose(fid);
A = horzcat(filebycolumn{:});
% ③2列目のデータに、100をかけて3列目に保存
A(:,3) = A(:,2).* 100;
% ⑤.xlsxファイルに保存する
[~,file_wo_ext,~] = fileparts(files{i}); % 拡張子があったら除く
xlswrite([path file_wo_ext '.xlsx'], A);
% Excelサーバで開く
wdata = Open(wkbk, [path '/' file_wo_ext '.xlsx']);
sheets = wdata.Sheets;
sheet1 = Item(sheets,1);
Shapes.AddPicture([pwd '\' img] ,0,1,400,18,300,235);
Sheet1.invoke('Pictures').Insert([path 'figure1.png']);
% ④1列目と3列目をグラフ化する
plot(1:numel(A(:,1)),[A(:,1) A(:,3)]);
% ⑤.xlsxファイルを保存する
invoke(wkbk, 'SaveChanges', 'False');
Close(wkbk); % workbook を保存し、Excelをクローズ
end
Quit(excelapp);
delete(excelapp);
  6 Comments
Atsushi Ueno
Atsushi Ueno on 28 Sep 2021
  • ご使用の製品とリリースを教えて下さい(この質問の対象製品とリリースを記入する欄があります)
  • ご使用環境はWindowsですか?LinuxやMacですか?(Windowsと想定)(パスの文字列が異なる為)
  • 「グラフ化」とは、Excelのグラフですか?MATLABのプロット(絵として貼り付け)ですか?
fk
fk on 28 Sep 2021
・編集しました。Matlab R2016bです。 ・Windowsです。 ・望ましいのはExcelのグラフです。 Excel上でも設定などを変更できるグラフがいいです。

Sign in to comment.

Tags

Products


Release

R2016b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!