2016-04-15 540 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 
相關問題