matlab从不同的excel文件连接每一行到新的excel文件

我有一个文件夹包含10个Excel文件。 每个excel文件包含5张。 我想要

将每个excel文件第一张纸的第一行连接到一个名为'final'的新excel文件中的新的sheet1中,将每个excel文件的第一张纸中的第二行连接到新的excel文件'将每个excel文件的表格放入新的名为'final'的excel文件中的sheet1中。

然后

将每个excel文件的第二张表中的第一行连接到名为'final'的新excel文件中的新的sheet2中,将每个excel文件的第二张表中的第二行连接到新的名为'final'的excel文件中的新sheet2中连接第二行中的第三行将每个excel文件的工作表放入名为“final”的新excel文件中的新工作表2中。

反复…做所有5张…

例:

excel文件1,sheet1

30 4 1.6 1.2 1.2 1.0 35 16 0.9 0.9 1.5 1.0 40 62 0.9 0.9 1.6 1.2 45 3 0.9 0.9 0.9 0.9 50 1 1.5 1.5 0.8 0.8 

excel文件2,sheet1

 10 1 0.8 0.9 0.9 0.9 15 31 0.9 0.9 1.2 1.6 20 2 0.9 0.9 0.9 0.9 25 3 0.9 0.9 0.9 0.9 30 18 0.9 0.9 0.9 0.9 

Excel文件3,Sheet1 Excel文件10,表1等…

我想得到的结果

final.xls,sheet1

 30 4 1.6 1.2 1.2 1.0 %1st row of sheet1 in excel file 1 10 1 0.8 0.9 0.9 0.9 %1st row of sheet1 in excel file 2 ... %repeated 1st row of sheet1 in excel file 3 to 10 35 16 0.9 0.9 1.5 1.0 %2nd row of sheet1 in excel file 1 15 31 0.9 0.9 1.2 1.6 %2nd row of sheet1 in excel file 2 ... %repeated 2nd row of sheet1 in excel file 3 to 10 

final.xls,sheet2

 %similar to sheet1 just the data read from sheet2.. 

有人可以帮助我吗?

我创build了10个.xls文件,每个文件5张。 所有工作表都有5×6的随机数。 这是我的第一个解决scheme:

 %# get input XLS files dName = uigetdir('.', 'Select folder containing Excel XLS files'); if dName==0, error('No folder selected'); end files = dir( fullfile(dName,'*.xls') ); files = strcat(dName, filesep, {files.name}'); %' %# prepare output XLS file [fName dName] = uiputfile({'*.xls' 'Excel (*.xls)'}, 'Output File', 'final.xls'); if dName==0, error('No file selected'); end fOut = fullfile(dName,fName); %# process NUM_SHEETS = 5; %# number of sheets per file for s=1:NUM_SHEETS %# extract contents of same sheet from all files numData = cell(numel(files),1); for f=1:numel(files) numData{f} = xlsread(files{f}, s); end %# rearrange data numData = cat(3,numData{:}); numData = reshape(permute(numData,[3 1 2]), [], size(numData,2)); %# write data to corresponding sheet of output XLS file xlswrite(fOut, numData, s); end 

这很慢。 大约需要3分钟才能完成…原因是创build了Excel自动化服务器的连接,然后在每次调用XLSREAD / XLSWRITE时反复销毁 。 另外,这两个函数隐藏了很多与Excel交互所需的肮脏工作,并且暴露了一个易于使用的界面。

在我的第二个解决scheme中,我手动调用Excel COM API 。 好处是我们只启动一次,一旦完成就把它拆下来,消除了很多开销。 实际上,这个代码在不到4秒的时间内执行!:

 %# get input XLS files dName = uigetdir('.', 'Select folder containing Excel XLS files'); if dName==0, error('No folder selected'); end files = dir( fullfile(dName,'*.xls') ); files = strcat(dName, filesep, {files.name}'); %' %# get output XLS file [fName dName] = uiputfile({'*.xls' 'Excel (*.xls)'},'Output File','final.xls'); if dName==0, error('No file selected'); end fOut = fullfile(dName,fName); %# open Excel COM Server Excel = actxserver('Excel.Application'); Excel.DisplayAlerts = 0; %# prepare output if ~exist(fOut, 'file') %# create if doesnt exist wb = Excel.workbooks.Add; wb.SaveAs(fOut,1); wb.Close(false); else %# delete existing file delete(fOut); end %# extract contents of input files NUM_SHEETS = 5; data = cell(numel(files),NUM_SHEETS); for f=1:numel(files) wb = Excel.Workbooks.Open(files{f}, 0, true); %# open XLS file for reading assert( wb.sheets.Count == NUM_SHEETS ); for s=1:NUM_SHEETS %# loop over all sheets %# activate sheet, and extract entire content Excel.sheets.get('item',s).Activate(); Excel.Range('A1').Activate(); data{f,s} = cell2num( Excel.ActiveSheet.UsedRange.Value ); end wb.Close(false); %# close XLS file end %# rearrange data D = cell(NUM_SHEETS,1); for s=1:NUM_SHEETS x = cat(3,data{:,s}); D{s} = reshape(permute(x,[3 1 2]), [], size(x,2)); end %# write data to sheets of output XLS file wb = Excel.Workbooks.Open(fOut, 0, false); %# open XLS file for writing while Excel.Sheets.Count < NUM_SHEETS %# create sheets as required Excel.Sheets.Add([], Excel.Sheets.Item(Excel.Sheets.Count)); end for s=1:NUM_SHEETS %# write conents to each sheet cellRange = sprintf('A1:%s%d', 'A'+size(D{s},2)-1, size(D{s},1)); wb.sheets.get('item',s).Activate(); Excel.Range(cellRange).Select(); set(Excel.selection, 'Value',num2cell(D{s})); end wb.Save(); wb.Close(false); %# close XLS file %# cleanup Excel.Quit(); Excel.delete(); clear Excel; 

我相信FEX已经提交了类似的东西

我假定你已经将每个excel文件保存为名为“file1.csv”,“file2.csv”等的csv文件
reshape命令的创造性使用有助于重新排列行。

 num_row = 2; num_col = 6; num_file = 10; c = cell(num_file ,1); for i=1:num_file file = sprintf('file%i.csv', i); x = csvread(file); c{i} = x'; % transpose so each row is a column end data = cell2mat(c); data = reshape(data, num_col, num_row*num_file; data = data'; transpose back