fpspreadsheet: Read zoom factor from BIFF8 and BIFF5 files, and write it back

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@5225 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2016-09-27 23:03:09 +00:00
parent aa04c61ba3
commit c015acfa0f
4 changed files with 44 additions and 4 deletions

View File

@ -3933,7 +3933,7 @@ end;
procedure TsCustomWorksheetGrid.LoadFromSpreadsheetFile(AFileName: string; procedure TsCustomWorksheetGrid.LoadFromSpreadsheetFile(AFileName: string;
AFormat: TsSpreadsheetFormat; AWorksheetIndex: Integer); AFormat: TsSpreadsheetFormat; AWorksheetIndex: Integer);
begin begin
ZoomFactor := 1.0; // ZoomFactor := 1.0;
GetWorkbookSource.LoadFromSpreadsheetFile(AFileName, AFormat, AWorksheetIndex); GetWorkbookSource.LoadFromSpreadsheetFile(AFileName, AFormat, AWorksheetIndex);
end; end;
@ -3952,7 +3952,7 @@ end;
procedure TsCustomWorksheetGrid.LoadFromSpreadsheetFile(AFileName: string; procedure TsCustomWorksheetGrid.LoadFromSpreadsheetFile(AFileName: string;
AFormatID: TsSpreadFormatID = sfidUnknown; AWorksheetIndex: Integer = -1); AFormatID: TsSpreadFormatID = sfidUnknown; AWorksheetIndex: Integer = -1);
begin begin
ZoomFactor := 1.0; // ZoomFactor := 1.0;
GetWorkbookSource.LoadFromSpreadsheetFile(AFileName, AFormatID, AWorksheetIndex); GetWorkbookSource.LoadFromSpreadsheetFile(AFileName, AFormatID, AWorksheetIndex);
end; end;
@ -3969,7 +3969,7 @@ end;
procedure TsCustomWorksheetGrid.LoadSheetFromSpreadsheetFile(AFileName: String; procedure TsCustomWorksheetGrid.LoadSheetFromSpreadsheetFile(AFileName: String;
AWorksheetIndex: Integer = -1; AFormatID: TsSpreadFormatID = sfidUnknown); AWorksheetIndex: Integer = -1; AFormatID: TsSpreadFormatID = sfidUnknown);
begin begin
ZoomFactor := 1.0; // ZoomFactor := 1.0;
GetWorkbookSource.LoadFromSpreadsheetFile(AFilename, AFormatID, AWorksheetIndex); GetWorkbookSource.LoadFromSpreadsheetFile(AFilename, AFormatID, AWorksheetIndex);
end; end;
@ -3986,7 +3986,7 @@ end;
procedure TsCustomWorksheetGrid.LoadFromWorkbook(AWorkbook: TsWorkbook; procedure TsCustomWorksheetGrid.LoadFromWorkbook(AWorkbook: TsWorkbook;
AWorksheetIndex: Integer = -1); AWorksheetIndex: Integer = -1);
begin begin
ZoomFactor := 1.0; // ZoomFactor := 1.0;
GetWorkbookSource.LoadFromWorkbook(AWorkbook, AWorksheetIndex); GetWorkbookSource.LoadFromWorkbook(AWorkbook, AWorksheetIndex);
Invalidate; Invalidate;
end; end;

View File

@ -536,6 +536,7 @@ begin
INT_EXCEL_ID_SHEETPR : ReadSHEETPR(AStream); INT_EXCEL_ID_SHEETPR : ReadSHEETPR(AStream);
INT_EXCEL_ID_STANDARDWIDTH : ReadStandardWidth(AStream, FWorksheet); INT_EXCEL_ID_STANDARDWIDTH : ReadStandardWidth(AStream, FWorksheet);
INT_EXCEL_ID_TOPMARGIN : ReadMargin(AStream, 2); INT_EXCEL_ID_TOPMARGIN : ReadMargin(AStream, 2);
INT_EXCEL_ID_SCL : ReadSCLRecord(AStream);
INT_EXCEL_ID_STRING : ReadStringRecord(AStream); INT_EXCEL_ID_STRING : ReadStringRecord(AStream);
INT_EXCEL_ID_VCENTER : ReadVCENTER(AStream); INT_EXCEL_ID_VCENTER : ReadVCENTER(AStream);
INT_EXCEL_ID_WINDOW2 : ReadWindow2(AStream); INT_EXCEL_ID_WINDOW2 : ReadWindow2(AStream);
@ -1161,6 +1162,7 @@ begin
WriteColInfos(AStream, FWorksheet); WriteColInfos(AStream, FWorksheet);
WriteDimensions(AStream, FWorksheet); WriteDimensions(AStream, FWorksheet);
WriteWindow2(AStream, FWorksheet); WriteWindow2(AStream, FWorksheet);
WriteSCLRecord(AStream, FWorksheet);
WritePane(AStream, FWorksheet, true, pane); // true for "is BIFF5 or BIFF8" WritePane(AStream, FWorksheet, true, pane); // true for "is BIFF5 or BIFF8"
WriteSelection(AStream, FWorksheet, pane); WriteSelection(AStream, FWorksheet, pane);
//WriteRows(AStream, sheet); //WriteRows(AStream, sheet);

View File

@ -886,6 +886,7 @@ begin
// This record replaces the record INTEGER written in BIFF2. // This record replaces the record INTEGER written in BIFF2.
INT_EXCEL_ID_RK : ReadRKValue(AStream); INT_EXCEL_ID_RK : ReadRKValue(AStream);
INT_EXCEL_ID_SCL : ReadSCLRecord(AStream);
INT_EXCEL_ID_SELECTION : ReadSELECTION(AStream); INT_EXCEL_ID_SELECTION : ReadSELECTION(AStream);
INT_EXCEL_ID_SHAREDFMLA : ReadSharedFormula(AStream); INT_EXCEL_ID_SHAREDFMLA : ReadSharedFormula(AStream);
INT_EXCEL_ID_SHEETPR : ReadSHEETPR(AStream); INT_EXCEL_ID_SHEETPR : ReadSHEETPR(AStream);
@ -2159,6 +2160,7 @@ begin
// View settings block // View settings block
WriteWindow2(AStream, FWorksheet); WriteWindow2(AStream, FWorksheet);
WriteSCLRecord(AStream, FWorksheet);
WritePane(AStream, FWorksheet, isBIFF8, pane); WritePane(AStream, FWorksheet, isBIFF8, pane);
WriteSelection(AStream, FWorksheet, pane); WriteSelection(AStream, FWorksheet, pane);
WriteHyperlinks(AStream, FWorksheet); WriteHyperlinks(AStream, FWorksheet);

View File

@ -64,6 +64,7 @@ const
INT_EXCEL_ID_STYLE = $0293; // does not exist in BIFF2 INT_EXCEL_ID_STYLE = $0293; // does not exist in BIFF2
{ RECORD IDs which did not change across version 4-8 } { RECORD IDs which did not change across version 4-8 }
INT_EXCEL_ID_SCL = $00A0; // does not exist before BIFF4
INT_EXCEL_ID_PAGESETUP = $00A1; // does not exist before BIFF4 INT_EXCEL_ID_PAGESETUP = $00A1; // does not exist before BIFF4
INT_EXCEL_ID_FORMAT = $041E; // BIFF2-3: $001E INT_EXCEL_ID_FORMAT = $041E; // BIFF2-3: $001E
@ -466,6 +467,7 @@ type
out ARpnFormula: TsRPNFormula; ACell: PCell = nil; out ARpnFormula: TsRPNFormula; ACell: PCell = nil;
ASharedFormulaBase: PCell = nil): Boolean; overload; ASharedFormulaBase: PCell = nil): Boolean; overload;
function ReadRPNTokenArraySize(AStream: TStream): word; virtual; function ReadRPNTokenArraySize(AStream: TStream): word; virtual;
procedure ReadSCLRecord(AStream: TStream);
procedure ReadSELECTION(AStream: TStream); procedure ReadSELECTION(AStream: TStream);
procedure ReadSharedFormula(AStream: TStream); procedure ReadSharedFormula(AStream: TStream);
procedure ReadSHEETPR(AStream: TStream); procedure ReadSHEETPR(AStream: TStream);
@ -589,6 +591,8 @@ type
AFormula: TsRPNFormula; UseRelAddr, IsSupported: Boolean; var RPNLength: Word); AFormula: TsRPNFormula; UseRelAddr, IsSupported: Boolean; var RPNLength: Word);
procedure WriteRPNTokenArraySize(AStream: TStream; ASize: Word); virtual; procedure WriteRPNTokenArraySize(AStream: TStream; ASize: Word); virtual;
procedure WriteSCLRecord(AStream: TStream; ASheet: TsWorksheet);
// Writes out a SELECTION record // Writes out a SELECTION record
procedure WriteSELECTION(AStream: TStream; ASheet: TsWorksheet; APane: Byte); procedure WriteSELECTION(AStream: TStream; ASheet: TsWorksheet; APane: Byte);
procedure WriteSelections(AStream: TStream; ASheet: TsWorksheet); procedure WriteSelections(AStream: TStream; ASheet: TsWorksheet);
@ -2582,6 +2586,18 @@ begin
Result := WordLEToN(AStream.ReadWord); Result := WordLEToN(AStream.ReadWord);
end; end;
{@@ ----------------------------------------------------------------------------
Reads the SCL record, This is the magnification factor of the current view
-------------------------------------------------------------------------------}
procedure TsSpreadBIFFReader.ReadSCLRecord(AStream: TStream);
var
num, denom: Word;
begin
num := WordLEToN(AStream.ReadWord);
denom := WOrdLEToN(AStream.ReadWord);
FWorksheet.ZoomFactor := num/denom;
end;
{@@ ---------------------------------------------------------------------------- {@@ ----------------------------------------------------------------------------
Reads a SELECTION record containing the currently selected cell Reads a SELECTION record containing the currently selected cell
Valid for BIFF2-BIFF8. Valid for BIFF2-BIFF8.
@ -4339,6 +4355,26 @@ begin
end; end;
end; end;
{@@ ----------------------------------------------------------------------------
Writes the SCL record - this is the current magnification factor of the sheet
-------------------------------------------------------------------------------}
procedure TsSpreadBIFFWriter.WriteSCLRecord(AStream: TStream;
ASheet: TsWorksheet);
var
num, denom: Word;
begin
{ BIFF record header }
WriteBIFFHeader(AStream, INT_EXCEL_ID_SCL, 4);
denom := 100;
num := round(ASheet.ZoomFactor * denom);
{ Numerator }
AStream.WriteWord(WordToLE(num));
{ Denominator }
AStream.WriteWord(WordToLE(denom));
end;
{@@ ---------------------------------------------------------------------------- {@@ ----------------------------------------------------------------------------
Writes an Excel 2-8 SELECTION record Writes an Excel 2-8 SELECTION record
Writes just reasonable default values Writes just reasonable default values