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

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

2 个评论

下に追加されちゃいますね
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
コメント有難うございます。
やはり下に追加されてしまいますよね。

请先登录,再进行评论。

 采纳的回答

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 个评论

コメント有難うございます。
質問を簡略化させてしまったので申し訳ないです。
今回は複数の演算処理を行い、出力するところまでを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 に同じ変数が必要です。
このエラーの原因と解決策を教えて頂けますでしょうか。
ご多忙のところ恐れ入りますが、宜しくお願い致します。
結構込み入っていますね。
例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
ご丁寧にありがとうございます。
行に追加は簡単ですが、列に追加するのは複雑なんですね。
無事に上記コードを基にデータ解析を行うことができました。
色々と応用できそうで、また新しいことをやりたくなってきました。
貴重なお時間を頂き、有難うございます。

请先登录,再进行评论。

更多回答(0 个)

Community Treasure Hunt

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

Start Hunting!