【发布时间】:2018-04-14 12:10:27
【问题描述】:
我需要优化 .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
我每周有近 10,000 个文件需要处理,大约需要处理。在我当前的工作站上处理每个文件需要 2 秒,大约需要 5½ 小时。
我已经读到 ActiveX 可以用于此目的,但这远远超出了我目前的编程技能,并且无法在其他地方找到解决方案。任何有关如何做到这一点的帮助将不胜感激。
如果使用 ActiveX(或其他建议的方法)执行起来很简单,我也会对单元格 D5 和 G3 上的数据感兴趣,我目前正在从 'xlsnames(k,1).name' 和 'xlsnames (k,1).date'
编辑:更新以反映解决方案
% 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 还需要打开和关闭 10K 文件,我不确定它是否会节省时间。如果您可以将数据存储在较少数量的文件中,在单独的工作表中,则可以大大加快这两种方法的速度。如果没有,请考虑这个 fex-@987654321@
-
不幸的是,我没有该选项可用。用于导入 matlab 的 .xls 文件是从在生产和实验室的工作站上运行的第 3 方软件自动生成的报告文件。
-
不用像
xlsread那样每次读取文件时都打开和关闭 Excel,从而节省大量时间。有关示例,请参阅here。实际上,这是通过直接操作 ActiveX 代理来完成的。我有自己的功能,但我现在没有。
标签: excel matlab import activex import-from-excel