我正在使用MS Dynamics Navision 2013 R2 Excel缓冲表生成Excel电子表格,并希望将其扩展为允许设置字体名称,字体大小,字体颜色和填充颜色。
我已经设法使用Saurav Dhyani在他的NAV 2013 R2 - Export To Excel With Font & Color博客文章中提供的解决方案来设置这些附加属性,但是当字体为字体时,该解决方案不会保留粗体,斜体和下划线属性的设置。改变。对他的帖子的评论表明,这还没有得到解决。
我对Saurav解决方案的实施涉及添加字段"字体名称" (文本100),"字体大小" (整数),"字体颜色" (整数)和"背景颜色" (整数)到Excel缓冲表(表370)。这些字段可以由调用模块设置。然后,对Excel缓冲区表中对GetCellDecorator函数的所有调用都将替换为对新GetCellDecoratorWithFont函数的调用。此函数采用与现有GetCellDecorator函数相同的参数以及每个新表字段的参数。
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;
恢复粗体,斜体和下划线但丢失所有其他格式。
有没有办法在保留原始属性的同时添加其他属性?
答案 0 :(得分:0)
回答我自己的问题......
Saurav Dhyani(请参阅相关链接)更新了他的博客,以通过实施其他字体属性来覆盖Bold,Underline和Italics属性来解决问题。我对他的代码做了一些修改(在他的博客上讨论过)。这是我在Excel缓冲区表中实现的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;
如图所示,Underline属性的实现不起作用,因此需要更正。
该函数的局部变量是: -
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)