Convert cell array to excel - problem with nested cells

22 views (last 30 days)
I really need to write this data from a cell array into an excel file (you can find it attached or in the printscreen). I've used
xlswrite('data.xls', M2)
writecell(M2, 'data.xls')
and nothing works because I have nested cells and all with different sizes, some even empty. How can this work?
I need data to be separated like this in the excel:
line1 = M{1,1}
line 2 = M{2,1}
line 3 = M{3,1}
line 4 = M{1,2}
line 5 = M{2,2}
line 6 = M{3,2}
...and so on...
Please help!

Sign in to comment.

Accepted Answer

dpb on 17 Oct 2021
Edited: dpb on 18 Oct 2021
Try something like
for i=1:size(M2,1)
for j=1:size(M2,2)
dpb on 18 Oct 2021
" the solution will be to build the composite cell array in memory first..."
Alternatively, and actually the one I implemented above is to use the FEX submission from Nick Oatley @
which will create a persistent COM object at the beginning of the sequence of writes you want to make and then let you close it when done.
This will make probably an order of magnitude difference in speed and is also not prone to the issues I outlined above if the size of M gets large.

Sign in to comment.

More Answers (1)

Walter Roberson
Walter Roberson on 17 Oct 2021
You have several options:
  • write each cell entry as text, perhaps using M2s = cellfun(@mat2str, M2, 'uniform', 0) . If you do that, then Excel will not be able to interpret the results as numeric
  • Provided that you do not have any natural "nan" entries, convert each entry into a column and append a nan to it, and combine the entries. You might need to pad each column to the same length using nan. So the first column would contain 52 double, then a nan, then 34 double, then a nan, then 6 nan (longest column would be 92 entries)
  • find the widest column and pad each of them out to that size. Then rearrange the entries into continuous columns. Your widest is 74 columns, so you would pad each of the 1 x N out to be 1 x 72, using NaN as your padding; then you would rearrange to a cell containing a letter, then 72 cells with numeric values, then another 72 cells of numeric values, and each column would have that length.
  • expand the first column into 52 columns (of 3 rows), expand the second column into 74 columns, the third into 60 columns, and so on, with the number of new colums needed being equal to the widest row in that column. You might need to put in a new row that indicates which original column each entry belonged to.
  1 Comment
Melissa Jones
Melissa Jones on 17 Oct 2021
The first way seemed the simplest.
But Isnt there a way to put each number in a separate cell in excel, disposed as I mention in the original question?

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!