Убить процесс Excel, созданный в Matlab - PullRequest
4 голосов
/ 15 мая 2019

Учитывая, что я пишу в книгу, я в настоящее время убиваю все процессы Excel, чтобы мой код работал, когда я вызываю его в цикле.

xlswrite(path,values);
system('taskkill /F /IM EXCEL.EXE');

Это лишает меня возможности запускать код, пока я работаю в другом файле Excel. Как сделать так, чтобы Matlab завершал только те процессы Excel, которые сам создал?

Ответы [ 2 ]

5 голосов
/ 15 мая 2019

Это была «особенность», введенная где-то около R2015b для ускорения множественных записей в Excel ... не очень удобная для пользователя и памяти!

Документация xlswrite ссылается на этот Ответ поддержки MathWorks для ручной записи в Excel с использованием actxserver, затем вы можете вручную удалить COM-объект, ссылающийся на Excel.

Вы можете на самом деле edit xlswrite и увидеть, что он использует matlab.io.internal.getExcelInstance, который делает то же самое и создает интерфейс COM с actxserver.

Дерзкий вариант - скопировать 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

Вы можете настроить практически все в новой книге Excel, используя объект COM h, чтобы вы могли добавить любые функции, которые вы используете в xlswrite, такие как именование листов и т. Д.

4 голосов
/ 15 мая 2019

Вы можете запустить процесс Excel с помощью powershell и получить его идентификатор процесса, а затем использовать идентификатор процесса для завершения процесса:

[~, pid] = system('powershell (Start-Process excel.exe -passthru).Id');
% Do your work
% ...
system(['powershell Stop-Process -Id ' pid])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...