Dynamics 365中如何通过X++正确设置Excel单元格背景色
D365 X++ 调用EPPlus设置Excel单元格背景色方案
问题背景
在Dynamics 365(D365)环境中通过X++开发生成Excel文件时,调用EPPlus类库设置单元格背景色会触发Invalid token '('.编译错误,原有问题代码如下:
System.IO.Stream workbookStream = new System.IO.MemoryStream(); System.IO.MemoryStream memoryStream = new System.IO.MemoryStream(); var package = new OfficeOpenXml.ExcelPackage(memoryStream) var package = new OfficeOpenXml.ExcelPackage(memoryStream) var worksheets = package.get_Workbook().get_Worksheets(); var worksheet = worksheets.Add("SHEET"); var cells = worksheet.get_Cells(); var currentRow=1 ; var cell = cells.get_Item(currentRow,1); cell.set_Value("__MY__Value"); // 以下两行代码均触发编译错误 //cell.Style.Fill.BackgroundColor.SetColor(System.Drawing.Color::FromArgb(190, 0, 0)); //cell.Style.Fill.BackgroundColor.Rgb(Winapi::rgb2int(255,255,255));
错误原因
X++与C#的.NET互操作调用语法存在差异,编译错误由三个问题导致:
- X++编译器无法正确解析多层链式调用下的.NET方法重载、属性签名
Rgb是可写属性而非方法,不能使用括号传参的形式调用- EPPlus的颜色属性不支持
System.Drawing.Color类型的隐式转换,直接传参会触发类型识别错误
正确实现代码
X++操作.NET对象时建议逐层声明变量类型,避免链式调用带来的编译异常,可运行的实现代码如下:
System.IO.MemoryStream memoryStream = new System.IO.MemoryStream(); OfficeOpenXml.ExcelPackage package = new OfficeOpenXml.ExcelPackage(memoryStream); OfficeOpenXml.ExcelWorksheets worksheets = package.get_Workbook().get_Worksheets(); OfficeOpenXml.ExcelWorksheet worksheet = worksheets.Add("SHEET"); OfficeOpenXml.ExcelRange cells = worksheet.get_Cells(); int currentRow = 1; OfficeOpenXml.ExcelRange cell = cells.get_Item(currentRow, 1); cell.set_Value("__MY__Value"); // 必须先设置填充模式为实心,否则背景色不会生效 cell.get_Style().get_Fill().set_PatternType(OfficeOpenXml.Style.ExcelFillStyle::Solid); // 方式1:通过ARGB值设置颜色 System.Drawing.Color fillColor = System.Drawing.Color::FromArgb(190, 0, 0); OfficeOpenXml.Style.ExcelColor bgColor = cell.get_Style().get_Fill().get_BackgroundColor(); bgColor.SetColor(fillColor); // 方式2:直接赋值十六进制RGB值(8位,前两位为透明度,无#前缀) // cell.get_Style().get_Fill().get_BackgroundColor().set_Rgb("FFBE0000");
注意事项
- 必须先将单元格填充的
PatternType属性设置为Solid实心模式,否则背景色设置后导出文件不会展示对应颜色 - 尽量避免多层.NET对象的链式调用,逐层声明强类型变量后再操作属性/方法,能规避绝大多数X++与.NET互操作的编译错误
- 给
Rgb属性赋值时,需要传入8位十六进制字符串,前两位为Alpha透明度通道,后六位为标准RGB色值,字符串不能带#前缀
内容的提问来源于stack exchange,提问作者ulisses
相关产品推荐
相关产品推荐

