writetable/readtable with multi-line headers
조회 수: 33 (최근 30일)
이전 댓글 표시
How can I use writetable to make a table to excel sheet and .csv file which has multi-line headers. Headers can include both per-variable headers like units and description, but also per-table headers like description or comments.
For example, take a table like below.
T = table(["Blue";"Red";"Green"],[50;100;75],[0.1;0.5;0.9],...
VariableNames={'Color','Weight','Temp'});
T.Properties.VariableUnits = ["[-]";"[kg]";"°C"];
T.Properties.VariableDescriptions = ["Outside Color";"Gross Weight";"Melting Point"];
T.Properties.Description = "Playdough Properties Chart";
Now I want to make it look like this in excel and .csv files


I know to do this by other means, but I would like to be able to do it with writetable, and also to read it back in with readtable.
Is there a straight-forward way of doing this?
댓글 수: 0
채택된 답변
Voss
2025년 1월 14일
Here's one way:
% specify the file to write to
output_file = 'test.csv';
% construct the table
T = table(["Blue";"Red";"Green"],[50;100;75],[0.1;0.5;0.9],...
VariableNames={'Color','Weight','Temp'});
T.Properties.VariableUnits = ["[-]";"[kg]";"[°C]"]; % added [] around °C
T.Properties.VariableDescriptions = ["Outside Color";"Gross Weight";"Melting Point"];
T.Properties.Description = "Playdough Properties Chart";
T
T.Properties
% write the table to the output file
fid = fopen(output_file,'w');
fprintf(fid,'%s\n', ...
T.Properties.Description, ...
strjoin(T.Properties.VariableNames,','), ...
strjoin(T.Properties.VariableDescriptions,","), ...
strjoin(T.Properties.VariableUnits,","));
fclose(fid);
writetable(T,output_file,'WriteMode','append','WriteVariableNames',false);
% check the contents of the output file
type(output_file)
% read the output file
opts = detectImportOptions(output_file);
opts.VariableNamesLine = 2;
opts.VariableDescriptionsLine = 3;
opts.VariableUnitsLine = 4;
opts.DataLines = [5 Inf];
opts = setvartype(opts,1,'string');
Tnew = readtable(output_file,opts);
tmp = readlines(output_file);
Tnew.Properties.Description = tmp(1);
Tnew.Properties.VariableDescriptions = string(Tnew.Properties.VariableDescriptions);
Tnew.Properties.VariableUnits = string(Tnew.Properties.VariableUnits);
Tnew
Tnew.Properties
% the table read from file is equivalent to the original table
isequal(Tnew,T)
댓글 수: 2
Walter Roberson
2025년 1월 14일
There is not support in writetable() for writing the units or variable descriptions.
추가 답변 (1개)
Walter Roberson
2025년 1월 14일
writetable() first just the header lines. Then writetable() the data with WriteMode='append'
When you readtable() you can specify VariableNamesRange, VariableUnitsRange, VariableDescriptionsRange
댓글 수: 2
Walter Roberson
2025년 1월 14일
Actually, writematrix() or writecell() would be easiest for the headers. Construct either an array of string() objects or a cell array of character vectors and writematrix() or writecell() as appropriate.
참고 항목
카테고리
Help Center 및 File Exchange에서 Spreadsheets에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!