2016-04-15 546 views
0

我想将多个工作表从现有工作簿复制到新工作簿。 这是我的代码,我可以复制工作表,但我无法正确保存工作簿。Matlab:复制Excel工作表并保存工作簿

在我的以下代码中,我复制了前三张并保存工作簿,但是当我打开它时,它是空的。我认为我的工作手册是错误的。

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() 

回答

2

对于片材的横向拼接

步骤1:创建包含文件名的重复一个单元阵列(相同的数量要组合张数),以及一个单元阵列与张数。然后用cellfun来阅读所有表格。

第2步:定义您希望写入数据的列。你读的第一张纸应该写在'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 
相关问题