From e7aeb0c3961688b5d2179733160943ea041d696b Mon Sep 17 00:00:00 2001 From: sekelsenmat Date: Thu, 26 May 2011 11:04:30 +0000 Subject: [PATCH] FPSpreadsheet: Adds a custom pallete so that we can have more commonly used colors instead of the default excel ones git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@1649 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- .../excel8demo/excel8write_format.pas | 47 ++++++++++- components/fpspreadsheet/fpspreadsheet.pas | 5 +- components/fpspreadsheet/xlsbiff8.pas | 82 +++++++++++++++++++ components/fpspreadsheet/xlsbiffcommon.pas | 6 ++ 4 files changed, 135 insertions(+), 5 deletions(-) diff --git a/components/fpspreadsheet/examples/excel8demo/excel8write_format.pas b/components/fpspreadsheet/examples/excel8demo/excel8write_format.pas index 50fb286f5..73f1e2002 100644 --- a/components/fpspreadsheet/examples/excel8demo/excel8write_format.pas +++ b/components/fpspreadsheet/examples/excel8demo/excel8write_format.pas @@ -20,11 +20,9 @@ var MyWorksheet: TsWorksheet; MyDir: string; MyCell: PCell; -begin - MyDir := ExtractFilePath(ParamStr(0)); - // Create the spreadsheet - MyWorkbook := TsWorkbook.Create; +procedure WriteFirstWorksheet(); +begin MyWorksheet := MyWorkbook.AddWorksheet('Worksheet1'); // Write some cells @@ -110,6 +108,47 @@ begin MyCell^.Border := [cbNorth, cbWest, cbEast, cbSouth]; MyCell^.BackgroundColor := scGreen; MyCell^.UsedFormattingFields := [uffBorder, uffBold, uffBackgroundColor]; +end; + +procedure WriteSecondWorksheet(); +begin + MyWorksheet := MyWorkbook.AddWorksheet('Worksheet2'); + + // Write some cells + MyWorksheet.WriteUTF8Text(1, 1, ' '); + MyCell := MyWorksheet.GetCell(1, 1); + MyCell^.Border := [cbNorth, cbWest]; + MyCell^.BackgroundColor := scGrey10pct; + MyCell^.UsedFormattingFields := [uffBorder, uffBackgroundColor]; + + MyWorksheet.WriteUTF8Text(1, 2, ' '); + MyCell := MyWorksheet.GetCell(1, 2); + MyCell^.Border := [cbNorth, cbEast]; + MyCell^.BackgroundColor := scGrey10pct; + MyCell^.UsedFormattingFields := [uffBorder, uffBackgroundColor]; + + MyWorksheet.WriteUTF8Text(2, 1, ' '); + MyCell := MyWorksheet.GetCell(2, 1); + MyCell^.Border := [cbWest, cbSouth]; + MyCell^.BackgroundColor := scGrey10pct; + MyCell^.UsedFormattingFields := [uffBorder, uffBackgroundColor]; + + MyWorksheet.WriteUTF8Text(2, 2, ' '); + MyCell := MyWorksheet.GetCell(2, 2); + MyCell^.Border := [cbEast, cbSouth]; + MyCell^.BackgroundColor := scGrey10pct; + MyCell^.UsedFormattingFields := [uffBorder, uffBackgroundColor]; +end; + +begin + MyDir := ExtractFilePath(ParamStr(0)); + + // Create the spreadsheet + MyWorkbook := TsWorkbook.Create; + + WriteFirstWorksheet(); + + WriteSecondWorksheet(); // Save the spreadsheet to a file MyWorkbook.WriteToFile(MyDir + 'test3.xls', sfExcel8, False); diff --git a/components/fpspreadsheet/fpspreadsheet.pas b/components/fpspreadsheet/fpspreadsheet.pas index 3b4ea2b1f..9dd16c1af 100755 --- a/components/fpspreadsheet/fpspreadsheet.pas +++ b/components/fpspreadsheet/fpspreadsheet.pas @@ -139,7 +139,10 @@ type scPURPLE, // 800080H scTEAL, // 008080H scSilver, // C0C0C0H - scGrey // 808080H + scGrey, // 808080H + // + scGrey10pct,// E6E6E6H + scGrey20pct // CCCCCCH ); {@@ Cell structure for TsWorksheet diff --git a/components/fpspreadsheet/xlsbiff8.pas b/components/fpspreadsheet/xlsbiff8.pas index 4fee32946..f7f1829b0 100755 --- a/components/fpspreadsheet/xlsbiff8.pas +++ b/components/fpspreadsheet/xlsbiff8.pas @@ -124,6 +124,7 @@ type procedure WriteIndex(AStream: TStream); procedure WriteLabel(AStream: TStream; const ARow, ACol: Word; const AValue: string; ACell: PCell); override; procedure WriteNumber(AStream: TStream; const ARow, ACol: Cardinal; const AValue: double; ACell: PCell); override; + procedure WritePalette(AStream: TStream); procedure WriteStyle(AStream: TStream); procedure WriteWindow1(AStream: TStream); procedure WriteWindow2(AStream: TStream; ASheetSelected: Boolean); @@ -155,6 +156,7 @@ const INT_EXCEL_ID_SST = $00FC; //BIFF8 only INT_EXCEL_ID_CONTINUE = $003C; INT_EXCEL_ID_LABELSST = $00FD; //BIFF8 only + INT_EXCEL_ID_PALETTE = $0092; { Cell Addresses constants } MASK_EXCEL_ROW = $3FFF; @@ -443,6 +445,9 @@ begin FontData.Free; end; + // PALETTE + WritePalette(AStream); + // XF0 WriteXF(AStream, 0, MASK_XF_TYPE_PROT_STYLE_XF, XF_ROTATION_HORIZONTAL, []); // XF1 @@ -899,6 +904,83 @@ begin AStream.WriteBuffer(AValue, 8); end; +procedure TsSpreadBIFF8Writer.WritePalette(AStream: TStream); +begin + { BIFF Record header } + AStream.WriteWord(WordToLE(INT_EXCEL_ID_PALETTE)); + AStream.WriteWord(WordToLE(2+4*56)); + + { Number of colors } + AStream.WriteWord(WordToLE(56)); + + { Now the colors, first the standard 16 from Excel } + AStream.WriteDWord(DWordToLE($000000)); // $08 + AStream.WriteDWord(DWordToLE($FFFFFF)); + AStream.WriteDWord(DWordToLE($FF0000)); + AStream.WriteDWord(DWordToLE($00FF00)); + AStream.WriteDWord(DWordToLE($0000FF)); + AStream.WriteDWord(DWordToLE($FFFF00)); + AStream.WriteDWord(DWordToLE($FF00FF)); + AStream.WriteDWord(DWordToLE($00FFFF)); + AStream.WriteDWord(DWordToLE($800000)); + AStream.WriteDWord(DWordToLE($008000)); + AStream.WriteDWord(DWordToLE($000080)); + AStream.WriteDWord(DWordToLE($808000)); + AStream.WriteDWord(DWordToLE($800080)); + AStream.WriteDWord(DWordToLE($008080)); + AStream.WriteDWord(DWordToLE($C0C0C0)); + AStream.WriteDWord(DWordToLE($808080)); //$17 + + { Now some colors which we define ourselves } + + AStream.WriteDWord(DWordToLE($E6E6E6)); //$18 + AStream.WriteDWord(DWordToLE($CCCCCC)); //$19 + + { And padding } + AStream.WriteDWord(DWordToLE($FFFFFF)); + AStream.WriteDWord(DWordToLE($FFFFFF)); + AStream.WriteDWord(DWordToLE($FFFFFF)); + AStream.WriteDWord(DWordToLE($FFFFFF)); + AStream.WriteDWord(DWordToLE($FFFFFF)); + AStream.WriteDWord(DWordToLE($FFFFFF)); + + AStream.WriteDWord(DWordToLE($FFFFFF)); //$20 + AStream.WriteDWord(DWordToLE($FFFFFF)); + AStream.WriteDWord(DWordToLE($FFFFFF)); + AStream.WriteDWord(DWordToLE($FFFFFF)); + AStream.WriteDWord(DWordToLE($FFFFFF)); + AStream.WriteDWord(DWordToLE($FFFFFF)); + AStream.WriteDWord(DWordToLE($FFFFFF)); + AStream.WriteDWord(DWordToLE($FFFFFF)); + + AStream.WriteDWord(DWordToLE($FFFFFF)); + AStream.WriteDWord(DWordToLE($FFFFFF)); + AStream.WriteDWord(DWordToLE($FFFFFF)); + AStream.WriteDWord(DWordToLE($FFFFFF)); + AStream.WriteDWord(DWordToLE($FFFFFF)); + AStream.WriteDWord(DWordToLE($FFFFFF)); + AStream.WriteDWord(DWordToLE($FFFFFF)); + AStream.WriteDWord(DWordToLE($FFFFFF)); + + AStream.WriteDWord(DWordToLE($FFFFFF)); //$30 + AStream.WriteDWord(DWordToLE($FFFFFF)); + AStream.WriteDWord(DWordToLE($FFFFFF)); + AStream.WriteDWord(DWordToLE($FFFFFF)); + AStream.WriteDWord(DWordToLE($FFFFFF)); + AStream.WriteDWord(DWordToLE($FFFFFF)); + AStream.WriteDWord(DWordToLE($FFFFFF)); + AStream.WriteDWord(DWordToLE($FFFFFF)); + + AStream.WriteDWord(DWordToLE($FFFFFF)); + AStream.WriteDWord(DWordToLE($FFFFFF)); + AStream.WriteDWord(DWordToLE($FFFFFF)); + AStream.WriteDWord(DWordToLE($FFFFFF)); + AStream.WriteDWord(DWordToLE($FFFFFF)); + AStream.WriteDWord(DWordToLE($FFFFFF)); + AStream.WriteDWord(DWordToLE($FFFFFF)); + AStream.WriteDWord(DWordToLE($FFFFFF)); +end; + {******************************************************************* * TsSpreadBIFF8Writer.WriteStyle () * diff --git a/components/fpspreadsheet/xlsbiffcommon.pas b/components/fpspreadsheet/xlsbiffcommon.pas index b453fc834..8779ba367 100644 --- a/components/fpspreadsheet/xlsbiffcommon.pas +++ b/components/fpspreadsheet/xlsbiffcommon.pas @@ -31,6 +31,9 @@ const BUILT_IN_COLOR_PALLETE_SILVER = $16; // C0C0C0H BUILT_IN_COLOR_PALLETE_GREY = $17; // 808080H + EXTRA_COLOR_PALETTE_GREY10PCT = $18; // E6E6E6H + EXTRA_COLOR_PALETTE_GREY20PCT = $19; // E6E6E6H + type { TsSpreadBIFFReader } @@ -77,6 +80,9 @@ begin scTEAL: Result := BUILT_IN_COLOR_PALLETE_TEAL; scSilver: Result := BUILT_IN_COLOR_PALLETE_SILVER; scGrey: Result := BUILT_IN_COLOR_PALLETE_GREY; + // + scGrey10pct: Result := EXTRA_COLOR_PALETTE_GREY10PCT; + scGrey20pct: Result := EXTRA_COLOR_PALETTE_GREY20PCT; end; end;