Это была «особенность», введенная где-то около 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
, такие как именование листов и т. Д.