首页 > 解决方案 > Matlab:使用 Matlab 复制 Excel 表并删除定义的 EXCEL 名称

问题描述

我目前正在努力解决一个棘手的 Matlab 问题:

我想将第一张纸复制a.xlsxb.xlsm并将其放在所有已存在的纸的前面b.xlsm。此外,我想删除由于复制过程而a.xlsx在文档中自动创建的所有链接。b.xlsm

我第一次尝试BreakLink(见下文)但没有奏效,因为 EXCEL 表中还定义了一些命名范围,仍然指的是 document a.xlsx。这似乎可以防止通过 breaklink 方法删除链接。所以现在我正在寻找是否有任何简单的方法可以使用 Matlab 代码删除 EXCEL 文档 b.xlsm 中所有定义的命名范围?

非常感谢。

我当前的代码:

X = actxserver('Excel.Application'); 
xls_PathName = 'C:\temp\';
XW0 = X.Workbooks.Open([xls_PathName,'a.xlsx']); 
XW2 = X.Workbooks.Open([xls_PathName,'b.xlsm']); 
XW0.Worksheets.Item(1).Name = 'Sheet';
XW0.Worksheets.Item(1).Copy(XW2.WorkSheets.Item(1),[]);

%**************************************************************
% Place some code to delete EXCEL named ranges in b.xlsm here %
%**************************************************************

astrLinks = XW2.LinkSources(1)
XW2.BreakLink(astrLinks{1},1)

XW0.Close(false)
XW2.Save
XW2.Close(false)
X.Quit

标签: excelmatlabactivexworksheet

解决方案


是否可以使用 Matlab 函数xlsreadxlswrite?我不确定您是否要复制公式,但我认为这是可能的。

由于您想将它放在开头,b.xlsm您将需要使用actxserver(请参阅使用 matlab 插入工作表)或稍后手动复制每张工作表,使用来自的输出xlsinfo来获取工作表的数量。

首先,创建一个空白的第一张表b.xlsm(代码未经测试,但取自上面的链接)

e = actxserver('Excel.Application');
xls_PathName = 'C:\temp\';
b = e.Workbooks.Open([xls_PathName,'b.xlsm']); 
eSheets = b.ActiveWorkbook.Sheets;
eSheet1 = Item(eSheets,1);
eNewSheet = Add(eSheets,eSheet1);
b.Save
b.Close(false)
e.Quit

您可能希望三种输出格式xlsread将原始数据作为元胞数组获取(以避免文本和数字数据被拆分)。现在将工作表从复制a.xlsxb.xlsm

[num,txt,raw] = xlsread([xls_PathName,'a.xlsx'],1);
xlswrite([xls_PathName,'b.xlsm'],raw,1);

希望这是您想要的,如果我误解了,请告诉我


推荐阅读