考虑到我写的是工作簿,当前我杀死了所有Excel进程,以便我的代码在循环调用时可以正常工作。
xlswrite(path,values);
system('taskkill /F /IM EXCEL.EXE');
这使我在处理另一个Excel文件时无法运行代码。如何使Matlab仅终止自己创建的Excel进程?
答案 0 :(得分:5)
这是R2015b周围引入的一个“功能”,可加快对Excel的多次写入速度……对用户/内存的友好程度不是很高!
xlswrite
文档链接到此MathWorks Support Answer,以使用actxserver
手动写入Excel,然后您可以手动删除引用Excel的COM对象。
您实际上可以edit xlswrite
并看到它使用matlab.io.internal.getExcelInstance
,它执行相同的操作并使用actxserver
创建一个COM接口。
一个厚脸皮的选择是复制xlswrite
,添加它创建的Excel
变量作为输出,然后Quit
和delete
如下所示。我不主张破坏MathWorks对该功能的任何版权所有权。
一个不太麻烦的选择是根据我上面链接的答案创建一个可比较的函数,仅用于写数据就看起来像这样:
function xlswriteClean( File, Data, Range )
% XLSWRITECELAN writes data like XLSWRITE, but deletes the Excel instance!
% XLSWRITECELAN (FILE,DATA,RANGE) writes the variable in
% DATA to FILE, in the range specified by RANGE.
% RANGE is optional, defaults to "A1"
% Obtain the full path name of the file
% Could handle this more elegantly, i.e.
% this always assumes the current directory, but user might give a full path
file = fullfile(pwd, File);
% Open an ActiveX connection to Excel
h = actxserver('excel.application');
%Create a new work book (excel file)
wb = h.WorkBooks.Add();
% Select the appropriate range
if nargin < 3
Range = 'A1';
end
rng = h.Activesheet.get('Range', Range);
% Write the data to the range
rng.value = Data;
% Save the file with the given file name, close Excel
wb.SaveAs( File );
% Clean up - the point of this function
wb.Close;
h.Quit;
h.delete;
end
您可以使用COM对象h
基本上自定义新Excel工作簿中的所有内容,因此可以添加在xlswrite
中使用的任何功能,例如工作表命名等。
答案 1 :(得分:4)
您可以start通过powershell来获取excel进程并获取其进程ID,然后使用该进程ID终止该进程:
[~, pid] = system('powershell (Start-Process excel.exe -passthru).Id');
% Do your work
% ...
system(['powershell Stop-Process -Id ' pid])