MS Dynamics Navision 2013 R2 Excel Buffer 테이블을 사용하여 Excel 스프레드 시트를 생성하고 있으며 글꼴 이름, 글꼴 크기, 글꼴 색상 및 채우기 색상을 설정할 수 있도록 확장하고 싶습니다.
나는 그의 NAV 2013 R2-Export To Excel With Font & Color 블로그 게시물 에서 Saurav Dhyani가 제공 한 솔루션을 사용하여 이러한 추가 속성을 설정 했지만 해당 솔루션은 글꼴을 사용할 때 Bold, Italics 및 Underline 속성의 설정을 유지하지 않습니다. 변경됩니다. 그의 게시물에 대한 의견은 이것이 아직 해결되지 않은 문제임을 시사합니다.
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 등은 색상의 16 진수 값을 사용하는 텍스트 상수입니다.
이 코드를 호출 할 때 글꼴과 채우기 색상은 모두 예상대로 설정되지만 Bold, Italics 및 Underline은 그렇지 않습니다. 함수의 마지막 줄 제거 :
Decorator.Font := CustomFont;
굵게, 기울임 꼴 및 밑줄은 복원하지만 다른 모든 서식은 손실됩니다.
원래 속성을 유지하면서 추가 속성을 추가하는 방법이 있습니까?
내 질문에 답하기 위해 ...
Saurav Dhyani (문제의 링크 참조)는 추가 글꼴 속성을 구현하여 굵게, 밑줄 및 기울임 꼴 속성을 덮어 쓰는 문제를 수정하기 위해 블로그를 업데이트했습니다. 그의 코드를 약간 변경했습니다 (그의 블로그에서 논의 됨). 이것은 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)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다