使用 X++ 在 Excel 中创建多个工作表

Posted

技术标签:

【中文标题】使用 X++ 在 Excel 中创建多个工作表【英文标题】:Creating multiple worksheets in Excel using X++ 【发布时间】:2012-12-21 14:23:04 【问题描述】:

我目前能够创建一个新的 Excel 电子表格,写入它并通过 X++ 保存电子表格。

我在一个新类中有几个方法,每个方法都打算写入工作簿中的单独工作表。

第一种方法创建电子表格,写入数据,保存电子表格,然后退出 Excel。但在下一个方法中,我尝试打开保存的电子表格,写入另一个工作表(选项卡),再次保存,然后退出 Excel。

第二种方法会导致以下错误。 '_Workbook' 类的 COM 对象中的方法 'saveAs' 返回错误代码 0x800A03EC (),这意味着:您不能将此工作簿与另一个打开的工作簿或加载项同名保存。选择其他名称,或在保存前关闭其他工作簿或加载项。

是否可以在 X++ 中的一个 Excel 工作簿中创建和保存多个 Excel 工作表?

【问题讨论】:

考虑展示您的代码。什么版本的 AX 和 Excel? @JanB.Kjeldsen 感谢您的回复。忘了提及我正在使用 AX 2009、Excel 2010 在 Windows Server 2008 Standard、32 位。 @JanB.Kjeldsen 一直忙于处理其他项目,因为这更像是一个信息性文章,但我一直在寻找数据导入/导出所使用的 SysDataExcelCOM 类中的一些代码一些指导。通过学习这门课,我能够以编程方式从我的 Excel 工作簿中删除标准的“表 1、表 2、表 3”工作表。会及时通知您...谢谢 【参考方案1】:

再次感谢 Jan 的回复

查看 SysDataExcelCOM 类后,有一个 CreateWorkbook 方法可以为 Excel 数据定义导出创建额外的工作表。在创建了一个新的类似类方法并为 Excel 工作表声明了我自己的一组定义名称 (#define.ExampleExcelWorksheetName('abcSheet') 之后,我就能够创建具有多个工作表的 Excel 工作簿。然后保存 (SysExcelWorkbook.saveAs ) 在首先创建所有必要的工作表之后,而不是打开保存的工作簿,然后为每个新的类方法添加工作表。

在打算将数据写入工作表的其他类方法中,我打开了由类似于 CreateWorkbook (sysExcelWorkbooks.open(yourExcelFile) 的新方法创建的工作簿,然后使用 (sysExcelWorksheet.itemByName) 引用每个工作表将数据写入特定的 Worksheet,然后保存。

excelApplication    = SysExcelApplication::construct();
excelWorkbooks      = excelApplication.workbooks();
excelWorkbooks.open(fileNameSave);
excelWorkbook       = excelWorkbooks.item(1);

//Add styles and fonts
excelStyles = excelWorkbook.styles();
excelStyle  = excelStyles.add("Header");
excelFont   = excelStyle.font();
excelFont.bold(true);

excelWorksheets     = excelWorkbook.worksheets();
excelWorksheet      = excelWorksheets.itemFromName(#declared name of your worksheet);

// Begin Header Row
excelWorksheet.cells().item(1,1).value("value of your choice");
excelWorksheet.cells().item(1,2).value("value of your choice");
excelWorksheet.rows().item(1).style("Header");

excelWorksheet.name("Rename your declared worksheet name or use current name here");
excelCells          = excelWorksheet.cells();
excelCells.range('A:B').numberFormat('@');

//Find you data to write to Excel Worksheet here

excelWorksheet.columns().autoFit();
excelApplication.displayAlerts(false);
excelWorkbook.saveAs(fileNameSave);
excelWorkbook.comObject().save();
excelWorkbook.saved(true);
excelApplication.quit();

走这条路对我来说效果很好。

【讨论】:

【参考方案2】:

这可能不是您问题的直接答案,但可能会给您提供创建 Excel 文件的另一个视角。

我倾向于使用 XML 和 XSLT 创建 Excel 文件。您可以轻松地在 Excel 中创建您想要的内容,然后将 Excel 文件保存为 XML,然后您可以应用一些 XSLT 从另一个 XML 文件中读取数据并将其放入您想要的 Excel 文件中。

您可以在我的博客上找到有关此主题的帖子:Using C#, XML and XSLT to create Excel files

在那里我创建了一个包含 Items 的 XML 文件并将其转换为 Excel 文件。

【讨论】:

【参考方案3】:

检查 Excel COM 服务的身份。看看others 有什么done。

【讨论】:

我检查了 Excel COM 服务 Microsoft Excel 应用程序的标识。在将身份设置为“交互式用户”和“启动用户”后,我测试了代码。两次都发生了同样的错误。

以上是关于使用 X++ 在 Excel 中创建多个工作表的主要内容,如果未能解决你的问题,请参考以下文章

在 CSV 文件中创建多个工作表

在Excel中创建工作簿的默认名称是 excel是电子表格软件

如何在 Google 表格中创建多个工作表引用的 INDIRECT 数组字符串?

在文件夹中创建文件名数组 - Excel VBA

如何在excel中创建表格区域

将多个 csv 文件中的数据导入一个 Excel 工作表并计算平均值