我可以扩展 MS Dynamics Navision 中的 Excel 缓冲区来更新字体、颜色和 bold/italics/underline 吗?

Can I extend the Excel Buffer in MS Dynamics Navision to update font, colour and bold/italics/underline?

我正在使用 MS Dynamics Navision 2013 R2 Excel 缓冲区 table 生成一个 Excel 电子表格,并希望扩展它以允许设置字体名称、字体大小、字体颜色和填充颜色。

我已经使用 Saurav Dhyani 在他的 NAV 2013 R2 - Export To Excel With Font & Color 博客 post 中给出的解决方案设法设置了这些附加属性,但该解决方案不保留粗体、斜体和下划线属性的设置更改字体时。他的评论 post 表明这是尚未解决的问题。

我对 Saurav 解决方案的实施涉及添加字段 "Font Name"(文本 100)、"Font Size"(整数)、"Font Colour"(整数)和 "Background Colour"(整数)到 Excel 缓冲区 table (Table 370)。这些字段可以由调用模块设置。 Excel 缓冲区 table 中对 GetCellDecorator 函数的所有调用都将替换为对新 GetCellDecoratorWithFont 函数的调用。此函数采用与现有 GetCellDecorator 函数相同的参数,外加每个新 table 字段的参数。

GetCellDecoratorWithFont 函数如下所示:

IF IsBold AND IsItalic AND IsUnderlined THEN
  Decorator := XlWrkShtWriter.DefaultBoldItalicUnderlinedCellDecorator
ELSE IF IsBold AND IsItalic THEN
  Decorator := XlWrkShtWriter.DefaultBoldItalicCellDecorator
ELSE IF IsBold AND IsUnderlined THEN
  Decorator := XlWrkShtWriter.DefaultBoldUnderlinedCellDecorator
ELSE IF IsBold THEN
  Decorator := XlWrkShtWriter.DefaultBoldCellDecorator
ELSE IF IsItalic AND IsUnderlined THEN
  Decorator := XlWrkShtWriter.DefaultItalicUnderlinedCellDecorator
ELSE IF IsItalic THEN
  Decorator := XlWrkShtWriter.DefaultItalicCellDecorator
ELSE IF IsUnderlined THEN
  Decorator := XlWrkShtWriter.DefaultUnderlinedCellDecorator
ELSE
  Decorator := XlWrkShtWriter.DefaultCellDecorator;

IF (FontName <> '') OR (FontSize <> 0) OR (FontColour <> 0) OR (BackgroundColour <> 0) THEN
  CustomFont := Decorator.Font.CloneNode(TRUE)
ELSE
  EXIT;

IF FontName <> '' THEN BEGIN
  CustomFont := CustomFont.Font;
  CustomFontName := CustomFontName.FontName;
  CustomFontName.Val := XmlStringValue.StringValue(FontName);
  CustomFont.FontName := CustomFontName;
END;

IF FontSize <> 0 THEN BEGIN
  CustomFontSize := CustomFontSize.FontSize;
  CustomFontSize.Val := FontSizeValue.DoubleValue(FontSize);
  CustomFont.FontSize := CustomFontSize;
END;

IF FontColour <> 0 THEN BEGIN
  CustomColour := CustomColour.Color;
  CASE FontColour OF
    1 : CustomColour.Rgb := HexColour.HexBinaryValue(ColourBlack);
    2 : CustomColour.Rgb := HexColour.HexBinaryValue(ColourWhite);
    3 : CustomColour.Rgb := HexColour.HexBinaryValue(ColourRed);
    4 : CustomColour.Rgb := HexColour.HexBinaryValue(ColourBlue);
    5 : CustomColour.Rgb := HexColour.HexBinaryValue(ColourGreen);
    6 : CustomColour.Rgb := HexColour.HexBinaryValue(ColourRose);
    7 : CustomColour.Rgb := HexColour.HexBinaryValue(ColourLightGrey);
    ELSE
      CustomColour.Rgb := HexColour.HexBinaryValue(ColourBlack);
  END;
  CustomFont.Color := CustomColour;
END;

IF BackgroundColour <> 0 THEN BEGIN
  HexBackgroundColour := '';

  CASE BackgroundColour OF
    1 : HexBackgroundColour := ColourBlack;
    2 : HexBackgroundColour := ColourWhite;
    3 : HexBackgroundColour := ColourRed;
    4 : HexBackgroundColour := ColourBlue;
    5 : HexBackgroundColour := ColourGreen;
    6 : HexBackgroundColour := ColourRose;
    7 : HexBackgroundColour := ColourLightGrey;
    ELSE
      HexBackgroundColour := ColourWhite;
  END;

  CustomCellFill := Decorator.Fill.CloneNode(TRUE);
  CustomCellPatternFill := CustomCellPatternFill.PatternFill(
    '<x:patternFill xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main" '+'patternType="'+'solid'+'">' +
    '<x:fgColor rgb="' + HexBackgroundColour + '" /></x:patternFill>');
  CustomCellFill.PatternFill := CustomCellPatternFill;
  Decorator.Fill := CustomCellFill;
END;

Fonts := XlWrkBkWriter.Workbook.WorkbookPart.WorkbookStylesPart.Stylesheet.Fonts;
Decorator.Font := CustomFont;

ColourBlack、ColourWhite 等是使用颜色的十六进制值的文本常量。

调用此代码时,字体和填充颜色都按预期设置,但粗体、斜体和下划线不是。删除函数的最后一行:

Decorator.Font := CustomFont;

恢复粗体、斜体和下划线,但丢失所有其他格式。

有没有办法在保留原有属性的同时添加额外的属性?

回答我自己的问题...

Saurav Dhyani(请参阅相关 link)更新了他的博客,以更正粗体、下划线和斜体属性被实施附加字体属性覆盖的问题。我对他的代码做了一些修改(在他的博客上讨论过)。这是我在 Excel 缓冲区 table:-

中实现的 GetCellDecoratorWithFont 函数
Decorator := XlWrkShtWriter.DefaultCellDecorator;

IF (FontName <> '') OR (FontSize <> 0) OR (FontColour <> 0) OR (BackgroundColour <>0) THEN
  CustomFont := Decorator.Font.CloneNode(TRUE)
ELSE BEGIN
  IF IsBold AND IsItalic AND IsUnderlined THEN
    Decorator := XlWrkShtWriter.DefaultBoldItalicUnderlinedCellDecorator
  ELSE IF IsBold AND IsItalic THEN
    Decorator := XlWrkShtWriter.DefaultBoldItalicCellDecorator
  ELSE IF IsBold AND IsUnderlined THEN
    Decorator := XlWrkShtWriter.DefaultBoldUnderlinedCellDecorator
  ELSE IF IsBold THEN
    Decorator := XlWrkShtWriter.DefaultBoldCellDecorator
  ELSE IF IsItalic AND IsUnderlined THEN
    Decorator := XlWrkShtWriter.DefaultItalicUnderlinedCellDecorator
  ELSE IF IsItalic THEN
    Decorator := XlWrkShtWriter.DefaultItalicCellDecorator
  ELSE IF IsUnderlined THEN
    Decorator := XlWrkShtWriter.DefaultUnderlinedCellDecorator
  ELSE
    Decorator := XlWrkShtWriter.DefaultCellDecorator;
  EXIT;
END;

IF FontName <> '' THEN BEGIN
  CustomFont := CustomFont.Font;
  CustomFontName := CustomFontName.FontName;
  CustomFontName.Val := XmlStringValue.StringValue(FontName);
  CustomFont.FontName := CustomFontName;
END;

IF FontSize <> 0 THEN BEGIN
  CustomFontSize := CustomFontSize.FontSize;
  CustomFontSize.Val := FontSizeValue.DoubleValue(FontSize);
  CustomFont.FontSize := CustomFontSize;
END;

IF FontColour <> 0 THEN BEGIN
  CustomColour := CustomColour.Color;
  CASE FontColour OF
    1 : CustomColour.Rgb := HexColour.HexBinaryValue(ColourBlack);
    2 : CustomColour.Rgb := HexColour.HexBinaryValue(ColourWhite);
    3 : CustomColour.Rgb := HexColour.HexBinaryValue(ColourRed);
    4 : CustomColour.Rgb := HexColour.HexBinaryValue(ColourBlue);
    5 : CustomColour.Rgb := HexColour.HexBinaryValue(ColourGreen);
    6 : CustomColour.Rgb := HexColour.HexBinaryValue(ColourRose);
    7 : CustomColour.Rgb := HexColour.HexBinaryValue(ColourLightGrey);
    ELSE
      CustomColour.Rgb := HexColour.HexBinaryValue(ColourBlack);
  END;
  CustomFont.Color := CustomColour;
END;

IF BackgroundColour <> 0 THEN BEGIN
  HexBackgroundColour := '';

  CASE BackgroundColour OF
    1 : HexBackgroundColour := ColourBlack;
    2 : HexBackgroundColour := ColourWhite;
    3 : HexBackgroundColour := ColourRed;
    4 : HexBackgroundColour := ColourBlue;
    5 : HexBackgroundColour := ColourGreen;
    6 : HexBackgroundColour := ColourRose;
    7 : HexBackgroundColour := ColourLightGrey;
    ELSE
      HexBackgroundColour := ColourWhite;
  END;

  CustomCellFill := Decorator.Fill.CloneNode(TRUE);
  CustomCellPatternFill := CustomCellPatternFill.PatternFill(
    '<x:patternFill xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main" '+'patternType="'+'solid'+'">' +
    '<x:fgColor rgb="' + HexBackgroundColour + '" /></x:patternFill>');
  CustomCellFill.PatternFill := CustomCellPatternFill;
  Decorator.Fill := CustomCellFill;
END;

IF IsBold THEN BEGIN
  CustomFontBold := CustomFontBold.Bold;
  CustomFontBold.Val  := XmlBooleanValue.BooleanValue(TRUE);
  CustomFont.Bold := CustomFontBold;
END;

IF IsItalic THEN BEGIN
  CustomFontItalic := CustomFontItalic.Italic;
  CustomFontItalic.Val  := XmlBooleanValue.BooleanValue(TRUE);
  CustomFont.Italic := CustomFontItalic;
END;

IF IsUnderlined THEN BEGIN
//  CustomFontUnderline := CustomFontUnderline.Underline;
//  CustomFontUnderline.Val  := XmlBooleanValue.BooleanValue(TRUE);
//  CustomFont.Underline := CustomFontUnderline;
END;

Fonts := XlWrkBkWriter.Workbook.WorkbookPart.WorkbookStylesPart.Stylesheet.Fonts;
Decorator.Font := CustomFont; 

如图所示,下划线 属性 的实现不起作用,因此需要更正。

函数的局部变量是:-

CustomFont:DocumentFormat.OpenXml.Spreadsheet.Font.'DocumentFormat.OpenXml, Version=2.5.5631.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'   
CustomFontName:DocumentFormat.OpenXml.Spreadsheet.FontName.'DocumentFormat.OpenXml, Version=2.5.5631.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'   
CustomFontSize:DocumentFormat.OpenXml.Spreadsheet.FontSize.'DocumentFormat.OpenXml, Version=2.5.5631.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'   
CustomFontBold:DocumentFormat.OpenXml.Spreadsheet.Bold.'DocumentFormat.OpenXml, Version=2.0.5631.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'   
CustomFontItalic:DocumentFormat.OpenXml.Spreadsheet.Italic.'DocumentFormat.OpenXml, Version=2.0.5631.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'   
CustomFontUnderline:DocumentFormat.OpenXml.Spreadsheet.Underline.'DocumentFormat.OpenXml, Version=2.0.5631.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 
XmlStringValue:DocumentFormat.OpenXml.StringValue.'DocumentFormat.OpenXml, Version=2.5.5631.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'    
XmlBooleanValue:DocumentFormat.OpenXml.BooleanValue.'DocumentFormat.OpenXml, Version=2.0.5631.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'  
FontSizeValue:DocumentFormat.OpenXml.DoubleValue.'DocumentFormat.OpenXml, Version=2.5.5631.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 
CustomColour:DocumentFormat.OpenXml.Spreadsheet.Color.'DocumentFormat.OpenXml, Version=2.5.5631.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'    
HexColour:DocumentFormat.OpenXml.HexBinaryValue.'DocumentFormat.OpenXml, Version=2.5.5631.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'  
CustomCellFill:DocumentFormat.OpenXml.Spreadsheet.Fill.'DocumentFormat.OpenXml, Version=2.5.5631.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'   
CustomCellPatternFill:DocumentFormat.OpenXml.Spreadsheet.PatternFill.'DocumentFormat.OpenXml, Version=2.5.5631.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 
Fonts:DocumentFormat.OpenXml.Spreadsheet.Fonts.'DocumentFormat.OpenXml, Version=2.5.5631.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'   
HexBackgroundColour:Text(10)