MATLAB の writetable​​関数で、既存のEx​celファイルの最終​列にテーブルを追記で​きますか

既存のExcelファイルの最終列の横に、別のテーブルデータを writetable 関数を使って追加することができますでしょうか。
'WriteMode'オプションを'append'にすることで最終行に追加できるのは確認できたのですが、列を追加する方法を見つけることができませんでした。

2 件のコメント

Atsushi Ueno
Atsushi Ueno 2023 年 4 月 25 日
下に追加されちゃいますね
writetable(table([10;20;30]),'Book1.xlsx','WriteMode','append');
readtable('Book1.xlsx')
ans = 6×3 table
Var1 Var2 Var3 ____ ____ ____ 1 4 7 2 5 8 3 6 9 10 NaN NaN 20 NaN NaN 30 NaN NaN
MY
MY 2023 年 4 月 26 日
コメント有難うございます。
やはり下に追加されてしまいますよね。

サインインしてコメントする。

 採用された回答

Kojiro Saito
Kojiro Saito 2023 年 4 月 26 日

1 投票

writetableのappendでは行の末尾にデータが追加されるので、末尾の列にデータを追加するにはExcelのシート全体を上書きするか、Rangeで書き込み位置を指定することで実現できます。
3列のExcelファイルに4列目をセルD1に追加した例です。
tblBefore = readtable('data.xlsx')
tblBefore = 3×3 table
Col1 Col2 Col3 ____ ____ ____ 1 1 1 2 2 2 3 3 3
Col4 = [1;2;3];
t = array2table(Col4);
writetable(t, 'data.xlsx', 'Range','D1')
tblAfter = readtable('data.xlsx')
tblAfter = 3×4 table
Col1 Col2 Col3 Col4 ____ ____ ____ ____ 1 1 1 1 2 2 2 2 3 3 3 3

3 件のコメント

MY
MY 2023 年 4 月 26 日
コメント有難うございます。
質問を簡略化させてしまったので申し訳ないです。
今回は複数の演算処理を行い、出力するところまでをloopさせたいと考えています。
例1(loop前の実際のコードを記入します)
C = readtable('ex.xlsx') %テーブルの読み込み
Cc = C(:,2); % 2列目を抽出
Cc1 = Cc(1,1); % Ccの1番目のデータ抽出
Ccf0 = Cc - Cc1; % Ccの全データにつてCcの1番目データとの差を出す
CcRatio = Ccf0 ./ Cc1; % 比率を算出
Cc.Properties.VariableNames = {'#1'}; % 列名を#1に変更
Ccf0.Properties.VariableNames = {'deltaF'}; % 列名をdeltaFに変更
CcRatio.Properties.VariableNames = {'deltaF/F0'}; % 列名をdeltaF/F0に変更
T1 = [Cc Ccf0 CcRatio]; % Cc Ccf0 CcRatioをまとめたtableの作成
writetable(T1,'result.xlsx') %table Tを'result.xlsx'に書き出し
ここまでは問題なく、実行できています。
その上で、この一連の操作をfor文を用いてloopさせたいと考えています。
例2(loopさせたコード)
C = readtable('ex.xlsx');
for col = 2:4 % '4'はサンプル数に応じて変更
Cc = C1(:,col) % ***
Cc1 = Cc(1,1)
Ccf0 = Cc - Cc1
CcRatio = Ccf0 ./ Cc1
Cc.Properties.VariableNames = {'#'}
Ccf0.Properties.VariableNames = {'deltaF'}
CcRatio.Properties.VariableNames = {'deltaF/F0'}
Tcol = [Cc Ccf0 CcRatio]
writetable(Tcol,'result.xlsx')
end
実際のデータはサンプル数(列に相当:50以上)、データ数(行に相当:約250行)共に多いため、
for文を使って演算処理した上で、全データを一つのファイルに出力できると良いなと考えていました。
教えて頂いた'Range'での指定の場合、上記の繰り返しだと上書きされてしまいますよね。
また、上記方法では上手く出来なかった場合、以下の方法で試そうと考えています。
転置演算子を利用して上記例のCcを転置させて同様のコマンドを実行し、
全てを実行後、再度転置してExcelに出力すれば良いのではないかと考えました。
しかし、実際に実行させてみると、次のようなエラーが出てしまいました。
*** の後ろに記入
Cc_1 = rows2vars(Cc)
Cc_101 = Cc_1(1,2)
Cc_1f0 = Cc_1 - Cc_101
次を使用中のエラー: -
両方の table に同じ変数が必要です。
このエラーの原因と解決策を教えて頂けますでしょうか。
ご多忙のところ恐れ入りますが、宜しくお願い致します。
Kojiro Saito
Kojiro Saito 2023 年 4 月 27 日
結構込み入っていますね。
例2の方法で、result.xlsxの列数をカウントしてその隣のセル番号に追記するコードサンプルを載せます。
C1 = readtable('ex.xlsx');
for col = 2:4 % '4'はサンプル数に応じて変更
Cc = C1(:,col) % ***
Cc1 = Cc(1,1);
Ccf0 = Cc - Cc1;
CcRatio = Ccf0 ./ Cc1;
Cc.Properties.VariableNames = {'#'};
Ccf0.Properties.VariableNames = {'deltaF'};
CcRatio.Properties.VariableNames = {'deltaF/F0'};
Tcol = [Cc Ccf0 CcRatio];
% 現在の列数をカウント
opts = detectImportOptions('result.xlsx');
colLength = length(opts.VariableNames); % 3 6 9 12...
% 書き初めのセル番号を作成
q = idivide(colLength, int16(26));
r = mod(colLength, 26);
if q == 0
cellPoint = 65+r; % D,E,...ZのASCIIコードの10進数番号
else
cellPoint = [65+q-1, 65+r]; % AA,AB,...AZ,BA,...,BZのASCIIコードの10進数番号
end
cellPointChar = [char(cellPoint), '1'];
% 書き初め列を指定して書き込み
writetable(Tcol, 'result.xlsx', 'Range', cellPointChar)
end
MY
MY 2023 年 4 月 28 日
ご丁寧にありがとうございます。
行に追加は簡単ですが、列に追加するのは複雑なんですね。
無事に上記コードを基にデータ解析を行うことができました。
色々と応用できそうで、また新しいことをやりたくなってきました。
貴重なお時間を頂き、有難うございます。

サインインしてコメントする。

その他の回答 (0 件)

質問済み:

MY
2023 年 4 月 25 日

コメント済み:

MY
2023 年 4 月 28 日

Community Treasure Hunt

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

Start Hunting!