Matlab:复制 Excel Sheet 并保存工作簿
Matlab : Copy Excel Sheet and Save Workbook
我想将现有工作簿中的多张工作表复制到新工作簿中。
这是我的代码,我可以复制工作表,但无法正确保存工作簿。
在我下面的代码中,我复制了前三张纸并保存了工作簿,但是当我打开它时,它是空的。我认为我的工作簿句柄有误。
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()
对于sheets
的横向拼接
第 1 步: 创建一个包含文件名重复项的元胞数组(与要合并的 sheet 的数目相同),以及一个元胞数组sheet 的编号。然后用cellfun
读取所有sheets.
第 2 步: 定义要写入数据的列。我想您阅读的第一个 sheet 应该写在 'A' 栏中。您可能想从第一行开始,所以 range
是 'A1' 第一次(即 k = 1
)您将数据写入新文件。对于 k > 1
这有点棘手。您需要跟踪您读取的所有 sheet 的列数,以便在您写入 sheet 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
对于sheets
的垂直串联
这有点简单,因为我们不需要处理列名和换行等。
解法:
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
我想将现有工作簿中的多张工作表复制到新工作簿中。 这是我的代码,我可以复制工作表,但无法正确保存工作簿。
在我下面的代码中,我复制了前三张纸并保存了工作簿,但是当我打开它时,它是空的。我认为我的工作簿句柄有误。
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()
对于sheets
的横向拼接第 1 步: 创建一个包含文件名重复项的元胞数组(与要合并的 sheet 的数目相同),以及一个元胞数组sheet 的编号。然后用cellfun
读取所有sheets.
第 2 步: 定义要写入数据的列。我想您阅读的第一个 sheet 应该写在 'A' 栏中。您可能想从第一行开始,所以 range
是 'A1' 第一次(即 k = 1
)您将数据写入新文件。对于 k > 1
这有点棘手。您需要跟踪您读取的所有 sheet 的列数,以便在您写入 sheet 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
对于sheets
的垂直串联这有点简单,因为我们不需要处理列名和换行等。
解法:
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