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

拡張子なしのコンマ区切りファイルを複数選択し、選択したファイルに処理を加えた後にエクセルファイルに保存したいです。 具体的な処理は以下の通りです。 ①フォルダダイアログを開く ②複数ファイル(拡張子なし、カンマ区切りで2列データが入っている)を選択する →一つのセルにカンマ区切りで2つの数値が入っているデータが、1000行以上あります。行数はファイルによって変化します。 ③2列目のデータに、100をかけて3列目に保存 ④1列目と3列目をグラフ化する ⑤.xlsxファイルに保存する
以上の流れをコードで書きたいです。 uigetfile関数を使用してファイルを読み込むことは可能なのですが、その後の処理がわかりません。 わかる方がいましたらご教授いただきたいです。

댓글 수: 2

Atsushi Ueno
Atsushi Ueno 2021년 9월 24일
편집: Atsushi Ueno 2021년 9월 24일
>一つのセルにカンマ区切りで2つの数値が入っているデータ
という表現が気になります。「コンマ区切りファイル」と言えばcsvファイル等のテキスト(ASCII)形式ファイルだろうと想定しますが、「セル」という用語が出てくると、拡張子が消えてしまったExcelファイルなのかな?と疑問が湧きます。
Atsushi Ueno
Atsushi Ueno 2021년 9월 24일
あと「グラフ化」はMATLABのグラフをExcelに貼り付けるのではなく、Excelファイル上でデータを指定してグラフ描画したものが必要なんだろうと察します。MATLABからでもCOM経由でVBAさながらの操作が出来ます

댓글을 달려면 로그인하십시오.

답변 (1개)

Atsushi Ueno
Atsushi Ueno 2021년 9월 24일
편집: Atsushi Ueno 2021년 9월 28일

1 개 추천

手元の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

fk
fk 2021년 9월 27일
ご回答ありがとうございます。
参照ファイルについてですが,カンマ区切りとしていましたがカンマ区切りではありませんでした。
申し訳ありません。
非セル配列オブジェクトからセル要素を参照しています。
エラー A = readmatrix([path file{i}]); % A = csvread([path file{i}]);
上記のエラーが発生するのですが,どうすればよろしいでしょうか
fk
fk 2021년 9월 27일
メモ帳で開くと上記のようなデータです.
Atsushi Ueno
Atsushi Ueno 2021년 9월 27일
편집: Atsushi Ueno 2021년 9월 27일
>カンマ区切りとしていましたがカンマ区切りではありませんでした
readmatrix関数ならスペース区切りでも読めます。ちょっとデバッグ(パスとファイルの間に区切り文字'/'を追加)しました。
>上記のエラーが発生するのですが,どうすればよろしいでしょうか
uigetfile関数で複数ファイルではなくファイル1つのみ選択した場合の処理を追記しました。
if ~iscell(files) % ファイルを1つしか選択しなかった場合
files = {files}; % 1つでもセルで包む
end
fk
fk 2021년 9월 28일
ありがとうございます。
関数または変数 'readmatrix' が未定義です。
エラー: plactice (line 15)
A = readmatrix([path '/' files{i}]);
というようなエラーが生じます
Atsushi Ueno
Atsushi Ueno 2021년 9월 28일
  • ご使用の製品とリリースを教えて下さい(この質問の対象製品とリリースを記入する欄があります)
  • ご使用環境はWindowsですか?LinuxやMacですか?(Windowsと想定)(パスの文字列が異なる為)
  • 「グラフ化」とは、Excelのグラフですか?MATLABのプロット(絵として貼り付け)ですか?
fk
fk 2021년 9월 28일
・編集しました。Matlab R2016bです。 ・Windowsです。 ・望ましいのはExcelのグラフです。 Excel上でも設定などを変更できるグラフがいいです。

댓글을 달려면 로그인하십시오.

제품

릴리스

R2016b

태그

질문:

fk
2021년 9월 24일

편집:

2021년 9월 28일

Community Treasure Hunt

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

Start Hunting!