D365FO技术分享:使用X++优雅地处理Excel 新增行、合并单元格与格式化技巧

D365FO Tech Share: Handling Excel Elegantly with X++ Techniques for Adding Rows, Merging Cells, and Formatting 摘要 本文旨在分享在Dynamics 365 Finance and Operations (D365FO)环境中,如何运用X++代码,结合OfficeOpenXml库,对系统生成的Excel文件进行更灵活、更深入的控制。我们将重点探讨动态插入新行、精确复制行格式与行高、合并单元格以优化布局,以及对单元格进行赋值和应用特定样式等实用技巧。这些方法对于需要生成非标准化、高度定制化Excel报表的D365FO开发者而言非常有价值。 引言 在D365FO的开发与实施过程中,将数据导出至Excel是一项基础且频繁的需求。尽管系统提供了标准的数据导出功能,但在许多实际业务场景下,我们需要对导出的Excel文件进行超越标准功能的“二次加工”。例如,可能需要在指定位置插入小计行或明细行,按照预设模板的样式填充数据,为了报表美观和可读性合并表头或数据区域,或者对特定数据(如金额、日期、状态)应用特定的单元格格式。这时,直接通过X++代码操作Excel文档就显得尤为重要。本文将详细介绍如何使用D365FO推荐的OfficeOpenXml库来实现这些高级的Excel操作。 准备工作 开始编码前,请确保您的D365FO开发环境已就绪。OfficeOpenXml相关的程序集(如OfficeOpenXml.dll)通常在标准环境中是可用的。在您的X++代码(通常是类或方法)中,需要引入相应的命名空间: // X++ using 语句 using OfficeOpenXml; using OfficeOpenXml.Style; using System.Drawing; // 如果需要处理颜色等 本文后续的代码示例假设您已经成功创建了ExcelPackage对象(例如变量 _package)和ExcelWorksheet对象(例如变量 _worksheet),并且已经通过_worksheet.Cells获取了单元格的操作句柄(通常赋给一个类似 _cells 的ExcelRange变量)。 核心功能实现 1. 动态插入新行 在向Excel写入数据或应用格式前,有时需要在工作表的特定位置插入若干空行。OfficeOpenXml 提供了 InsertRow 方法来实现此功能: // 示例:在第 10 行(rowToInsertBefore = 10)的上方插入 5 行 int rowToInsertBefore = …

Continue reading ‘D365FO技术分享:使用X++优雅地处理Excel 新增行、合并单元格与格式化技巧’ »

如何在D365FO导入Excel文件(How to import EXCEL using X++ in D365 FO)

开始之前的准备 Using System.IO; Using OfficeOpenXml; Using OfficeOpenXml.ExcelPackage; Using OfficeOpenXml.ExcelRange; 除了基本的包,我们还需要参考包:Directory 第一部分代码 在这部分代码中,创建了一个导入对话框,在这里我们可以选择需要导入的文件,文件上传之后会被存储在临时的空间中 第二部分代码 在这部分代码中,我们从导入的Excel中获取数据 完整的代码 Using System.IO; Using OfficeOpenXml; Using OfficeOpenXml.ExcelPackage; Using OfficeOpenXml.ExcelRange; class RunnableClass1 { /// <summary> /// Runs the class with the specified arguments. /// </summary> /// <param name = "_args">The specified arguments.</param> public static void main(Args _args) { /*———part 1 ——————*/ System.IO.Stream …

Continue reading ‘如何在D365FO导入Excel文件(How to import EXCEL using X++ in D365 FO)’ »

如何在D365FO导出Excel文件(How to export to EXCEL using X++ in D365 FO)

步骤 创建一个Job 添加以下代码 class RunnableClass2 { public static void main(Args _args) { CustTable custTable; DocuFileSaveResult saveResult = DocuFileSave::promptForSaveLocation("@ApplicationPlatform:OfficeDefaultWorkbookFileName","xlsx", null, "excel create and export"); if (saveResult&& saveResult.parmAction() != DocuFileSaveAction::Cancel) { saveResult.parmOpenParameters(’web=1’); saveResult.parmOpenInNewWindow(false); System.IO.Stream workbookStream = new System.IO.MemoryStream(); System.IO.MemoryStream memoryStream = new System.IO.MemoryStream(); using(var package = new OfficeOpenXml.ExcelPackage(memoryStream)) { var worksheets = package.get_Workbook().get_Worksheets(); var worksheet = worksheets.Add("Sheet1"); …

Continue reading ‘如何在D365FO导出Excel文件(How to export to EXCEL using X++ in D365 FO)’ »