使用ActiveX从Excel导入到Matlab

我需要优化将.xls文件导入到matlab中,因为xlsread耗费大量文件非常耗时。 当前的xlsread脚本如下:

scriptName = mfilename('fullpath'); [currentpath, filename, fileextension]= fileparts(scriptName); xlsnames = dir(fullfile(currentpath,'*.xls')); xlscount = length(xlsnames); xlsimportdata = zeros(7,6,xlscount); for k = 1:xlscount xlsimport = xlsread(xlsnames(k).name,'D31:I37'); xlsimportdata(:,1:size(xlsimport,2),k) = xlsimport; end 

我有接近10K文件每周需要处理和约。 每个文件在我现在的工作站上处理2秒,大约需要5个半小时。

我已经读过ActiveX可以用于这个目的,但是这远远超出了我目前的编程技能,并且还没有能够在其他地方find解决scheme。 任何帮助如何做到这一点,将不胜感激。

如果使用ActiveX(或其他build议的方法)执行起来很简单,我也会对单元格D5和G3的数据感兴趣,我现在正在从“xlsnames(k,1).name”和“xlsnames(k, 1).date”

编辑:更新以反映解决scheme

 % Get path to .m script scriptName = mfilename('fullpath'); [currentpath, filename, fileextension]= fileparts(scriptName); % Generate list of .xls file data xlsnames = dir(fullfile(currentpath,'*.xls')); xlscount = length(xlsnames); SampleInfo = cell(xlscount,2); xlsimportdata = cell(7,6,xlscount); % Define xls data ranges to import SampleID = 'G3'; SampleRuntime = 'D5'; data_range = 'D31:I37'; % Initiate progression bar h = waitbar(0,'Initiating import...'); % Start actxserver exl = actxserver('excel.application'); exlWkbk = exl.Workbooks; for k = 1:xlscount % Restart actxserver every 100 loops due limited system memory if mod (k,100) == 0 exl.Quit exl = actxserver('excel.application'); exlWkbk = exl.Workbooks; end exlFile = exlWkbk.Open([dname filesep xlsnames(k).name]); exlSheet1 = exlFile.Sheets.Item('Page 0'); rngObj1 = exlSheet1.Range(SampleID); xlsimport_ID = rngObj1.Value; rngObj2 = exlSheet1.Range(SampleRuntime); xlsimport_Runtime = rngObj2.Value; rngObj3 = exlSheet1.Range(data_range); xlsimport_data = rngObj3.Value; SampleInfo(k,1) = {xlsimport_ID}; SampleInfo(k,2) = {xlsimport_Runtime}; xlsimportdata(:,:,k) = xlsimport_data; % Progression bar updater progress = round((k / xlscount) * 100); importtext = sprintf('Importing %d of %d', k, xlscount); waitbar(progress/100,h,sprintf(importtext)); disp(['Import progress: ' num2str(k) '/' num2str(xlscount)]); end %close actxserver exl.Quit % Close progression bar close(h) 

试试这个。 我不是一个ActiveX Excel的专家。 但是,这对我的less量testingXLS文件(3)的作品。 我从来没有close exlWkbk所以我不知道是否内存使用正在build设,或者如果它自动清理后,当下一个被打开在它的地方…所以使用风险自负。 我看到几乎2.5倍的速度增长,这似乎很有希望。

 >> timeit(@getSomeXLS) ans = 1.8641 >> timeit(@getSomeXLS_old) ans = 4.6192 

请留下一些反馈,如果这项工作在大量的Excel表格,因为我很好奇它是如何去的。

 function xlsimportdata = getSomeXLS() scriptName = mfilename('fullpath'); [currentpath, filename, fileextension]= fileparts(scriptName); xlsnames = dir(fullfile(currentpath,'*.xls')); xlscount = length(xlsnames); xlsimportdata = zeros(7,6,xlscount); exl = actxserver('excel.application'); exlWkbk = exl.Workbooks; dat_range = 'D31:I37'; for k = 1:xlscount exlFile = exlWkbk.Open([currentpath filesep xlsnames(k).name]); exlSheet1 = exlFile.Sheets.Item('Sheet1'); %Whatever your sheet is called. rngObj = exlSheet1.Range(dat_range); xlsimport = cell2mat(rngObj.Value); xlsimportdata(:,:,k) = xlsimport; end exl.Quit