2016-04-15 6 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: Определите, из какой колонки вы хотели бы написать данные. Первый лист, который вы читаете, должен быть написан из столбца «А», я полагаю. Вероятно, вы хотите начать с первой строки, поэтому 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 

Для вертикальной конкатенации листов

Это немного проще, так как нам не нужно обрабатывать имена столбцов и упаковку и т.д.

Solution :

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 
Смежные вопросы