fpspreadsheet: Add properties ShowGridLines, ShowHeaders, Selected to Worksheet to interface with fpSpreadsheetGrid. Read/write to xls file.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@3002 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2014-05-03 19:07:55 +00:00
parent baaa13c757
commit 44c55efdbd
8 changed files with 140 additions and 109 deletions

View File

@ -40,6 +40,7 @@ begin
MyWorkbook.UsePalette(@PALETTE_BIFF8, Length(PALETTE_BIFF8));
MyWorksheet := MyWorkbook.AddWorksheet(Str_Worksheet1);
MyWorksheet.ShowGridLines := false;
// Write some cells
MyWorksheet.WriteNumber(0, 0, 1.0);// A1

View File

@ -127,11 +127,15 @@
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
<UnitName Value="mainform"/>
<IsVisibleTab Value="True"/>
<EditorIndex Value="1"/>
<WindowIndex Value="0"/>
<TopLine Value="43"/>
<CursorPos X="38" Y="63"/>
<TopLine Value="125"/>
<CursorPos X="68" Y="141"/>
<UsageCount Value="125"/>
<Bookmarks Count="1">
<Item0 X="1" Y="142" ID="1"/>
</Bookmarks>
<Loaded Value="True"/>
<LoadedDesigner Value="True"/>
</Unit1>
@ -148,11 +152,10 @@
<Unit3>
<Filename Value="..\..\fpspreadsheetgrid.pas"/>
<UnitName Value="fpspreadsheetgrid"/>
<IsVisibleTab Value="True"/>
<EditorIndex Value="3"/>
<WindowIndex Value="0"/>
<TopLine Value="400"/>
<CursorPos X="63" Y="425"/>
<TopLine Value="36"/>
<CursorPos X="3" Y="62"/>
<UsageCount Value="61"/>
<Loaded Value="True"/>
</Unit3>
@ -314,9 +317,6 @@
<TopLine Value="219"/>
<CursorPos X="26" Y="233"/>
<UsageCount Value="19"/>
<Bookmarks Count="1">
<Item0 X="21" Y="544" ID="1"/>
</Bookmarks>
<Loaded Value="True"/>
</Unit22>
<Unit23>
@ -372,123 +372,127 @@
<Loaded Value="True"/>
</Unit28>
</Units>
<JumpHistory Count="29" HistoryIndex="28">
<JumpHistory Count="30" HistoryIndex="29">
<Position1>
<Filename Value="..\..\xlsbiff2.pas"/>
<Caret Line="962" Column="1" TopLine="938"/>
<Caret Line="1040" Column="1" TopLine="1014"/>
</Position1>
<Position2>
<Filename Value="..\..\xlsbiff2.pas"/>
<Caret Line="968" Column="1" TopLine="938"/>
<Caret Line="1043" Column="1" TopLine="1014"/>
</Position2>
<Position3>
<Filename Value="..\..\xlsbiff2.pas"/>
<Caret Line="1034" Column="1" TopLine="1014"/>
<Caret Line="1044" Column="1" TopLine="1014"/>
</Position3>
<Position4>
<Filename Value="..\..\xlsbiff2.pas"/>
<Caret Line="1037" Column="1" TopLine="1014"/>
<Caret Line="1077" Column="19" TopLine="1064"/>
</Position4>
<Position5>
<Filename Value="..\..\xlsbiff2.pas"/>
<Caret Line="1040" Column="1" TopLine="1014"/>
<Caret Line="536" Column="32" TopLine="530"/>
</Position5>
<Position6>
<Filename Value="..\..\xlsbiff2.pas"/>
<Caret Line="1043" Column="1" TopLine="1014"/>
<Caret Line="124" Column="32" TopLine="97"/>
</Position6>
<Position7>
<Filename Value="..\..\xlsbiff2.pas"/>
<Caret Line="1044" Column="1" TopLine="1014"/>
<Caret Line="537" Column="24" TopLine="517"/>
</Position7>
<Position8>
<Filename Value="..\..\xlsbiff2.pas"/>
<Caret Line="1077" Column="19" TopLine="1064"/>
<Caret Line="283" Column="14" TopLine="272"/>
</Position8>
<Position9>
<Filename Value="..\..\xlsbiff2.pas"/>
<Caret Line="536" Column="32" TopLine="530"/>
<Caret Line="124" Column="30" TopLine="104"/>
</Position9>
<Position10>
<Filename Value="..\..\xlsbiff2.pas"/>
<Caret Line="124" Column="32" TopLine="97"/>
<Caret Line="283" Column="9" TopLine="251"/>
</Position10>
<Position11>
<Filename Value="..\..\xlsbiff2.pas"/>
<Caret Line="537" Column="24" TopLine="517"/>
<Filename Value="d:\Prog_Delphi\common\units\XLS.pas"/>
<Caret Line="130" Column="20" TopLine="113"/>
</Position11>
<Position12>
<Filename Value="..\..\xlsbiff2.pas"/>
<Caret Line="283" Column="14" TopLine="272"/>
<Caret Line="290" Column="31" TopLine="238"/>
</Position12>
<Position13>
<Filename Value="..\..\xlsbiff2.pas"/>
<Caret Line="124" Column="30" TopLine="104"/>
<Caret Line="233" Column="26" TopLine="219"/>
</Position13>
<Position14>
<Filename Value="..\..\xlsbiff2.pas"/>
<Caret Line="283" Column="9" TopLine="251"/>
</Position14>
<Position15>
<Filename Value="d:\Prog_Delphi\common\units\XLS.pas"/>
<Caret Line="130" Column="20" TopLine="113"/>
</Position15>
<Position16>
<Filename Value="..\..\xlsbiff2.pas"/>
<Caret Line="290" Column="31" TopLine="238"/>
</Position16>
<Position17>
<Filename Value="..\..\xlsbiff2.pas"/>
<Caret Line="233" Column="26" TopLine="219"/>
</Position17>
<Position18>
<Filename Value="..\..\xlsbiff8.pas"/>
<Caret Line="1993" Column="32" TopLine="1989"/>
</Position18>
<Position19>
</Position14>
<Position15>
<Filename Value="..\..\fpspreadsheetgrid.pas"/>
<Caret Line="441" Column="5" TopLine="376"/>
</Position19>
<Position20>
</Position15>
<Position16>
<Filename Value="..\..\fpspreadsheetgrid.pas"/>
<Caret Line="414" Column="1" TopLine="389"/>
</Position20>
<Position21>
</Position16>
<Position17>
<Filename Value="d:\lazarus-svn\lcl\graphics.pp"/>
<Caret Line="1226" Column="14" TopLine="1212"/>
</Position17>
<Position18>
<Filename Value="d:\lazarus-svn\lcl\graphics.pp"/>
<Caret Line="636" Column="3" TopLine="619"/>
</Position18>
<Position19>
<Filename Value="..\..\xlsbiff5.pas"/>
<Caret Line="1667" Column="95" TopLine="1637"/>
</Position19>
<Position20>
<Filename Value="..\..\xlsbiff8.pas"/>
<Caret Line="2062" Column="79" TopLine="2048"/>
</Position20>
<Position21>
<Filename Value="..\..\fpspreadsheetgrid.pas"/>
<Caret Line="418" Column="31" TopLine="374"/>
</Position21>
<Position22>
<Filename Value="d:\lazarus-svn\lcl\graphics.pp"/>
<Caret Line="636" Column="3" TopLine="619"/>
<Caret Line="586" Column="3" TopLine="570"/>
</Position22>
<Position23>
<Filename Value="..\..\xlsbiff5.pas"/>
<Caret Line="1667" Column="95" TopLine="1637"/>
<Filename Value="..\..\fpspreadsheetgrid.pas"/>
<Caret Line="392" Column="6" TopLine="388"/>
</Position23>
<Position24>
<Filename Value="..\..\xlsbiff8.pas"/>
<Caret Line="2062" Column="79" TopLine="2048"/>
<Filename Value="d:\lazarus-svn\lcl\graphics.pp"/>
<Caret Line="1226" Column="14" TopLine="1212"/>
</Position24>
<Position25>
<Filename Value="..\..\fpspreadsheetgrid.pas"/>
<Caret Line="418" Column="31" TopLine="374"/>
<Filename Value="..\..\fpspreadsheet.pas"/>
<Caret Line="250" Column="38" TopLine="235"/>
</Position25>
<Position26>
<Filename Value="d:\lazarus-svn\lcl\graphics.pp"/>
<Caret Line="586" Column="3" TopLine="570"/>
<Filename Value="..\..\fpspreadsheetgrid.pas"/>
<Caret Line="833" Column="3" TopLine="830"/>
</Position26>
<Position27>
<Filename Value="..\..\fpspreadsheetgrid.pas"/>
<Caret Line="392" Column="6" TopLine="388"/>
<Caret Line="826" Column="3" TopLine="823"/>
</Position27>
<Position28>
<Filename Value="d:\lazarus-svn\lcl\graphics.pp"/>
<Caret Line="1226" Column="14" TopLine="1212"/>
<Filename Value="mainform.pas"/>
<Caret Line="53" Column="17" TopLine="67"/>
</Position28>
<Position29>
<Filename Value="..\..\fpspreadsheet.pas"/>
<Caret Line="250" Column="38" TopLine="235"/>
<Filename Value="mainform.pas"/>
<Caret Line="142" Column="1" TopLine="129"/>
</Position29>
<Position30>
<Filename Value="mainform.pas"/>
<Caret Line="33" Column="1" TopLine="33"/>
</Position30>
</JumpHistory>
</ProjectOptions>
<CompilerOptions>

View File

@ -138,6 +138,7 @@ begin
AFilename,
GetFileFormatName(sWorksheetGrid1.Workbook.FileFormat)
]);
CbDisplayGrid.Checked := sWorksheetGrid1.Worksheet.ShowGridLines;
// Create a tab in the pagecontrol for each worksheet contained in the workbook
// This would be easer with a TTabControl. This has display issues, though.

View File

@ -315,6 +315,9 @@ type
FCells: TAvlTree; // Items are TCell
FCurrentNode: TAVLTreeNode; // For GetFirstCell and GetNextCell
FRows, FCols: TIndexedAVLTree; // This lists contain only rows or cols with styles different from the standard
FShowGridLines: Boolean;
FShowHeaders: Boolean;
FSelected: Boolean;
procedure RemoveCallback(data, arg: pointer);
public
Name: string;
@ -384,6 +387,10 @@ type
property Cols: TIndexedAVLTree read FCols;
property Rows: TIndexedAVLTree read FRows;
property Workbook: TsWorkbook read FWorkbook;
// These are properties to interface to fpspreadsheetgrid.
property ShowGridLines: Boolean read FShowGridLines write FShowGridLines;
property ShowHeaders: Boolean read FShowHeaders write FShowHeaders;
property Selected: Boolean read FSelected write FSelected;
end;
{ TsWorkbook }

View File

@ -813,6 +813,10 @@ begin
RowHeights[i] := DefaultRowHeight;
end;
end;
if FWorksheet.ShowGridLines then
Options := Options + [goHorzLine, goVertLine]
else
Options := Options - [goHorzLine, goVertLine];
end
else
for i:=0 to RowCount-1 do begin

View File

@ -126,7 +126,7 @@ type
const AFormula: TsRPNFormula; ACell: PCell); override;
procedure WriteStyle(AStream: TStream);
procedure WriteWindow1(AStream: TStream);
procedure WriteWindow2(AStream: TStream; ASheetSelected: Boolean);
procedure WriteWindow2(AStream: TStream; ASheet: TsWorksheet);
procedure WriteXF(AStream: TStream; AFontIndex: Word;
AFormatIndex: Word; AXF_TYPE_PROT, ATextRotation: Byte; ABorders: TsCellBorders;
const ABorderStyles: TsCellBorderStyles; AHorAlignment: TsHorAlignment = haDefault;
@ -230,8 +230,6 @@ const
INT_EXCEL_ID_ROWINFO = $0208;
INT_EXCEL_ID_STYLE = $0293;
INT_EXCEL_ID_WINDOW1 = $003D;
INT_EXCEL_ID_WINDOW2 = $023E;
INT_EXCEL_ID_XF = $00E0;
INT_EXCEL_ID_RSTRING = $00D6;
INT_EXCEL_ID_RK = $027E;
INT_EXCEL_ID_MULRK = $00BD;
@ -291,19 +289,6 @@ const
MASK_WINDOW1_OPTION_VERT_SCROLL_VISIBLE = $0010;
MASK_WINDOW1_OPTION_WORKSHEET_TAB_VISIBLE = $0020;
{ WINDOW2 record constants }
MASK_WINDOW2_OPTION_SHOW_FORMULAS = $0001;
MASK_WINDOW2_OPTION_SHOW_GRID_LINES = $0002;
MASK_WINDOW2_OPTION_SHOW_SHEET_HEADERS = $0004;
MASK_WINDOW2_OPTION_PANES_ARE_FROZEN = $0008;
MASK_WINDOW2_OPTION_SHOW_ZERO_VALUES = $0010;
MASK_WINDOW2_OPTION_AUTO_GRIDLINE_COLOR = $0020;
MASK_WINDOW2_OPTION_COLUMNS_RIGHT_TO_LEFT = $0040;
MASK_WINDOW2_OPTION_SHOW_OUTLINE_SYMBOLS = $0080;
MASK_WINDOW2_OPTION_REMOVE_SPLITS_ON_UNFREEZE = $0100;
MASK_WINDOW2_OPTION_SHEET_SELECTED = $0200;
MASK_WINDOW2_OPTION_SHEET_ACTIVE = $0400;
{ XF substructures }
{ XF substructures --- see xlscommon! }
@ -426,7 +411,7 @@ begin
WriteIndex(AStream);
WriteColInfos(AStream, sheet);
WriteDimensions(AStream, sheet);
WriteWindow2(AStream, True);
WriteWindow2(AStream, sheet);
WriteCellsToStream(AStream, sheet.Cells);
WriteEOF(AStream);
end;
@ -1017,7 +1002,7 @@ end;
*
*******************************************************************}
procedure TsSpreadBIFF5Writer.WriteWindow2(AStream: TStream;
ASheetSelected: Boolean);
ASheet: TsWorksheet);
var
Options: Word;
begin
@ -1026,14 +1011,18 @@ begin
AStream.WriteWord(WordToLE(10));
{ Options flags }
Options := MASK_WINDOW2_OPTION_SHOW_GRID_LINES or
MASK_WINDOW2_OPTION_SHOW_SHEET_HEADERS or
MASK_WINDOW2_OPTION_SHOW_ZERO_VALUES or
MASK_WINDOW2_OPTION_AUTO_GRIDLINE_COLOR or
MASK_WINDOW2_OPTION_SHOW_OUTLINE_SYMBOLS or
MASK_WINDOW2_OPTION_SHEET_ACTIVE;
Options :=
MASK_WINDOW2_OPTION_SHOW_ZERO_VALUES or
MASK_WINDOW2_OPTION_AUTO_GRIDLINE_COLOR or
MASK_WINDOW2_OPTION_SHOW_OUTLINE_SYMBOLS or
MASK_WINDOW2_OPTION_SHEET_ACTIVE;
if ASheetSelected then Options := Options or MASK_WINDOW2_OPTION_SHEET_SELECTED;
if ASheet.ShowGridLines then
Options := Options or MASK_WINDOW2_OPTION_SHOW_GRID_LINES;
if ASheet.ShowHeaders then
Options := Options or MASK_WINDOW2_OPTION_SHOW_SHEET_HEADERS;
if ASheet.Selected then
Options := Options or MASK_WINDOW2_OPTION_SHEET_SELECTED;
AStream.WriteWord(WordToLE(Options));
@ -1352,6 +1341,7 @@ begin
INT_EXCEL_ID_COLINFO: ReadColInfo(AStream);
INT_EXCEL_ID_ROWINFO: ReadRowInfo(AStream);
INT_EXCEL_ID_FORMULA: ReadFormulaExcel(AStream);
INT_EXCEL_ID_WINDOW2: ReadWindow2(AStream);
INT_EXCEL_ID_BOF: ;
INT_EXCEL_ID_EOF: SectionEOF := True;
// Show unsupported record types to console.

View File

@ -127,7 +127,7 @@ type
const AFormula: TsRPNFormula; ACell: PCell); override;
procedure WriteStyle(AStream: TStream);
procedure WriteWindow1(AStream: TStream);
procedure WriteWindow2(AStream: TStream; ASheetSelected: Boolean);
procedure WriteWindow2(AStream: TStream; ASheet: TsWorksheet);
procedure WriteXF(AStream: TStream; AFontIndex: Word;
AFormatIndex: Word; AXF_TYPE_PROT, ATextRotation: Byte; ABorders: TsCellBorders;
const ABorderStyles: TsCellBorderStyles; AHorAlignment: TsHorAlignment = haDefault;
@ -270,19 +270,6 @@ const
MASK_WINDOW1_OPTION_VERT_SCROLL_VISIBLE = $0010;
MASK_WINDOW1_OPTION_WORKSHEET_TAB_VISIBLE = $0020;
{ WINDOW2 record constants }
MASK_WINDOW2_OPTION_SHOW_FORMULAS = $0001;
MASK_WINDOW2_OPTION_SHOW_GRID_LINES = $0002;
MASK_WINDOW2_OPTION_SHOW_SHEET_HEADERS = $0004;
MASK_WINDOW2_OPTION_PANES_ARE_FROZEN = $0008;
MASK_WINDOW2_OPTION_SHOW_ZERO_VALUES = $0010;
MASK_WINDOW2_OPTION_AUTO_GRIDLINE_COLOR = $0020;
MASK_WINDOW2_OPTION_COLUMNS_RIGHT_TO_LEFT = $0040;
MASK_WINDOW2_OPTION_SHOW_OUTLINE_SYMBOLS = $0080;
MASK_WINDOW2_OPTION_REMOVE_SPLITS_ON_UNFREEZE = $0100;
MASK_WINDOW2_OPTION_SHEET_SELECTED = $0200;
MASK_WINDOW2_OPTION_SHEET_ACTIVE = $0400;
{ XF substructures }
{ XF_ROTATION }
@ -514,7 +501,7 @@ begin
WriteIndex(AStream);
WriteColInfos(AStream, sheet);
WriteDimensions(AStream, sheet);
WriteWindow2(AStream, True);
WriteWindow2(AStream, sheet);
WriteCellsToStream(AStream, sheet.Cells);
WriteEOF(AStream);
end;
@ -1185,7 +1172,7 @@ end;
*
*******************************************************************}
procedure TsSpreadBIFF8Writer.WriteWindow2(AStream: TStream;
ASheetSelected: Boolean);
ASheet: TsWorksheet);
var
Options: Word;
begin
@ -1194,14 +1181,18 @@ begin
AStream.WriteWord(WordToLE(18));
{ Options flags }
Options := MASK_WINDOW2_OPTION_SHOW_GRID_LINES or
MASK_WINDOW2_OPTION_SHOW_SHEET_HEADERS or
MASK_WINDOW2_OPTION_SHOW_ZERO_VALUES or
MASK_WINDOW2_OPTION_AUTO_GRIDLINE_COLOR or
MASK_WINDOW2_OPTION_SHOW_OUTLINE_SYMBOLS or
MASK_WINDOW2_OPTION_SHEET_ACTIVE;
Options :=
MASK_WINDOW2_OPTION_SHOW_ZERO_VALUES or
MASK_WINDOW2_OPTION_AUTO_GRIDLINE_COLOR or
MASK_WINDOW2_OPTION_SHOW_OUTLINE_SYMBOLS or
MASK_WINDOW2_OPTION_SHEET_ACTIVE;
if ASheetSelected then Options := Options or MASK_WINDOW2_OPTION_SHEET_SELECTED;
if ASheet.ShowGridLines then
Options := Options or MASK_WINDOW2_OPTION_SHOW_GRID_LINES;
if ASheet.ShowHeaders then
Options := Options or MASK_WINDOW2_OPTION_SHOW_SHEET_HEADERS;
if ASheet.Selected then
Options := Options or MASK_WINDOW2_OPTION_SHEET_SELECTED;
AStream.WriteWord(WordToLE(Options));
@ -1601,6 +1592,7 @@ begin
INT_EXCEL_ID_LABELSST:ReadLabelSST(AStream); //BIFF8 only
INT_EXCEL_ID_COLINFO: ReadColInfo(AStream);
INT_EXCEL_ID_ROWINFO: ReadRowInfo(AStream);
INT_EXCEL_ID_WINDOW2: ReadWindow2(AStream);
INT_EXCEL_ID_BOF: ;
INT_EXCEL_ID_EOF: SectionEOF := True;
else

View File

@ -27,6 +27,7 @@ const
INT_EXCEL_ID_BLANK = $0201;
INT_EXCEL_ID_NUMBER = $0203;
INT_EXCEL_ID_LABEL = $0204;
INT_EXCEL_ID_WINDOW2 = $023E;
{ FONT record constants }
INT_FONT_WEIGHT_NORMAL = $0190;
@ -225,7 +226,6 @@ const
FORMAT_PERCENT_0_DECIMALS = 9; //percent, 0 decimals
FORMAT_PERCENT_2_DECIMALS = 10; //percent, 2 decimals
FORMAT_EXP_2_DECIMALS = 11; //exponent, 2 decimals
FORMAT_SCI_1_DECIMAL = 48; //scientific, 1 decimal
FORMAT_SHORT_DATE = 14; //short date
FORMAT_DATE_DM = 16; //date D-MMM
FORMAT_DATE_MY = 17; //date MMM-YYYY
@ -235,8 +235,22 @@ const
FORMAT_LONG_TIME = 21; //long time H:MM:SS
FORMAT_SHORT_DATETIME = 22; //short date+time
FORMAT_TIME_MS = 45; //time MM:SS
FORMAT_TIME_MSZ = 47; //time MM:SS.0
FORMAT_TIME_INTERVAL = 46; //time [hh]:mm:ss, hh can be >24
FORMAT_TIME_MSZ = 47; //time MM:SS.0
FORMAT_SCI_1_DECIMAL = 48; //scientific, 1 decimal
{ WINDOW2 record constants - BIFF3-BIFF8}
MASK_WINDOW2_OPTION_SHOW_FORMULAS = $0001;
MASK_WINDOW2_OPTION_SHOW_GRID_LINES = $0002;
MASK_WINDOW2_OPTION_SHOW_SHEET_HEADERS = $0004;
MASK_WINDOW2_OPTION_PANES_ARE_FROZEN = $0008;
MASK_WINDOW2_OPTION_SHOW_ZERO_VALUES = $0010;
MASK_WINDOW2_OPTION_AUTO_GRIDLINE_COLOR = $0020;
MASK_WINDOW2_OPTION_COLUMNS_RIGHT_TO_LEFT = $0040;
MASK_WINDOW2_OPTION_SHOW_OUTLINE_SYMBOLS = $0080;
MASK_WINDOW2_OPTION_REMOVE_SPLITS_ON_UNFREEZE = $0100; //BIFF5-BIFF8
MASK_WINDOW2_OPTION_SHEET_SELECTED = $0200; //BIFF5-BIFF8
MASK_WINDOW2_OPTION_SHEET_ACTIVE = $0400; //BIFF5-BIFF8
{ XF substructures }
@ -358,6 +372,8 @@ type
procedure ReadRowColXF(AStream: TStream; out ARow, ACol: Cardinal; out AXF: Word); virtual;
// Read row info
procedure ReadRowInfo(AStream: TStream); virtual;
// Read WINDOW2 record (gridlines, sheet headers)
procedure ReadWindow2(AStream: TStream); virtual;
public
constructor Create(AWorkbook: TsWorkbook); override;
destructor Destroy; override;
@ -865,6 +881,22 @@ begin
end;
end;
{ Reads the WINDOW2 record containing information like "show grid lines", or
"show sheet headers".
The record structure is different for BIFF5 and BIFF8, but we use here only
the common part.
BIFF2 is completely different and has to be overridden. }
procedure TsSpreadBIFFReader.ReadWindow2(AStream: TStream);
var
flags: Word;
begin
flags := WordLEToN(AStream.ReadWord);
FWorksheet.ShowGridLines := (flags and MASK_WINDOW2_OPTION_SHOW_GRID_LINES <> 0);
FWorksheet.ShowHeaders := (flags and MASK_WINDOW2_OPTION_SHOW_SHEET_HEADERS <> 0);
FWorksheet.Selected := (flags and MASK_WINDOW2_OPTION_SHEET_SELECTED <> 0);
end;
{ TsSpreadBIFFWriter }