我想将现有工作簿中的多个工作表复制到新工作簿。 这是我的代码,我可以复制工作表,但我无法正确保存工作簿。
在我的下面的代码中,我复制了前三张并保存了工作簿,但是当我打开它时,它是空的。我认为我的工作簿处理是错误的。
Excel = actxserver('Excel.Application');
Excel.Visible = true;
WB = invoke(Excel.Workbooks,'open','C:\Example.xlsx');
SHS = WB.Sheets; %sheets of template Workbook
SH = WB.Worksheets.Item(3);
invoke(SH,'Copy');
SH = Excel.ActiveSheet;
SH1 = WB.Worksheets.Item(2);
SH2 = WB.Worksheets.Item(1);
invoke(SH2,'Copy',SH);
invoke(SH1,'Copy',SH);
SH = Excel.ActiveSheet;
nWB = Excel.ActiveWorkbook;
nWB.SaveAs('C:\TEST.xlsx',1)
Excel.Quit()
答案 0 :(得分:2)
对于工作表的水平连接
步骤1:制作一个包含文件名重复的单元格数组(与要合并的工作表数相同的数字),以及一个包含工作表数量的单元格数组。然后使用cellfun
阅读所有表格。
第2步:定义您要从哪个列写入数据。您阅读的第一张表格应写在“A' A'我想。您可能希望从第一行开始,因此range
是' A1'第一次(即k = 1
)您将数据写入新文件。对k > 1
来说,它有点棘手。您需要跟踪所读取的所有工作表的列数,以便在新文件中写入工作表2,3,...,n时知道新范围的位置。将您的计数转换为Excel列名称。这可以使用char
命令完成。确保照顾包装(Z后来AA)。
<强>解决方案:强>
% STEP 1
n = 3; %number of sheets you want to combine
filename = strcat(cell(1,n), 'C:\Example.xlsx');
sheets = num2cell(1:n);
combinedSheets = cellfun(@xlsread,filename, sheets,'un',0);
% STEP 2
range = {'A1'};
cols = 0;
for k = 1:n
xlswrite('C:\TEST.xlsx',combinedSheets{k},1, cell2mat(range))
cols = cols + size(combinedSheets{k},2);
q = floor(cols/26);
d = mod(cols,26);
range = strcat(cell(1,q+1), 'A');
range{end} = [char(d+'A'),'1'];
end
垂直连接工作表
这有点简单,因为我们不需要处理列名和包装等。
<强>解决方案:强>
n = 3; %number of sheets you want to combine
filename = strcat(cell(1,n), 'C:\Example.xlsx');
sheets = num2cell(1:n);
combinedSheets = cellfun(@xlsread,filename, sheets,'un',0);
range = 'A1';
rows = 1;
for k = 1:n
xlswrite('C:\TEST.xlsx',combinedSheets{k},1, range)
rows = rows + size(combinedSheets{k},1);
range = sprintf('A%s', num2str(rows));
end