From d5e5df7485a6b0b405b7a010e3e64e39f405762d Mon Sep 17 00:00:00 2001 From: wp_xxyyzz Date: Tue, 22 May 2018 22:21:15 +0000 Subject: [PATCH] fpspreadsheet: Rearrange units to better avoid circular unit references. General idea: no unit of the package must "use" fpspreadsheet.pas in the interface section. git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@6444 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- .../fpspreadsheet/source/common/fpscell.pas | 89 +- .../source/common/fpsclasses.pas | 7 +- .../fpspreadsheet/source/common/fpscsv.pas | 56 +- .../source/common/fpsexprparser.pas | 123 +-- .../fpspreadsheet/source/common/fpsfunc.pas | 24 +- .../fpspreadsheet/source/common/fpshtml.pas | 153 ++-- .../source/common/fpshtmlutils.pas | 16 +- .../source/common/fpsopendocument.pas | 645 +++++++------- .../source/common/fpspalette.pas | 28 +- .../source/common/fpspreadsheet.pas | 219 +---- .../source/common/fpsreaderwriter.pas | 131 +-- .../fpspreadsheet/source/common/fpstypes.pas | 248 +++++- .../fpspreadsheet/source/common/fpsutils.pas | 58 +- .../source/common/fpsxmlcommon.pas | 8 +- .../fpspreadsheet/source/common/wikitable.pas | 66 +- .../fpspreadsheet/source/common/xlsbiff2.pas | 250 +++--- .../fpspreadsheet/source/common/xlsbiff5.pas | 151 ++-- .../fpspreadsheet/source/common/xlsbiff8.pas | 249 +++--- .../fpspreadsheet/source/common/xlscommon.pas | 605 +++++++------ .../fpspreadsheet/source/common/xlsxml.pas | 164 ++-- .../fpspreadsheet/source/common/xlsxooxml.pas | 817 ++++++++++-------- 21 files changed, 2276 insertions(+), 1831 deletions(-) diff --git a/components/fpspreadsheet/source/common/fpscell.pas b/components/fpspreadsheet/source/common/fpscell.pas index 9f35da083..c8cf04470 100644 --- a/components/fpspreadsheet/source/common/fpscell.pas +++ b/components/fpspreadsheet/source/common/fpscell.pas @@ -6,7 +6,7 @@ unit fpsCell; interface uses - Classes, SysUtils, fpstypes, fpspreadsheet; + Classes, SysUtils, fpstypes; type TCellHelper = record helper for TCell @@ -46,8 +46,7 @@ type procedure SetWordwrap(const AValue: Boolean); protected - function GetWorkbook: TsWorkbook; inline; - function GetWorksheet: TsWorksheet; inline; + function GetWorkbook: TsBasicWorkbook; inline; public property BackgroundColor: TsColor @@ -83,74 +82,77 @@ type read GetVertAlignment write SetVertAlignment; property Wordwrap: Boolean read GetWordwrap write SetWordwrap; - property Workbook: TsWorkbook read GetWorkbook; + property Workbook: TsBasicWorkbook read GetWorkbook; end; implementation +uses + fpspreadsheet; + function TCellHelper.GetBackgroundColor: TsColor; begin - Result := GetWorksheet.ReadBackgroundColor(@self); + Result := (Worksheet as TsWorksheet).ReadBackgroundColor(@self); end; function TCellHelper.GetBiDiMode: TsBiDiMode; begin - Result := GetWorksheet.ReadBiDiMode(@self); + Result := (Worksheet as TsWorksheet).ReadBiDiMode(@self); end; function TCellHelper.GetBorder: TsCellBorders; begin - Result := GetWorksheet.ReadCellBorders(@self); + Result := (Worksheet as TsWorksheet).ReadCellBorders(@self); end; function TCellHelper.GetBorderStyle(const ABorder: TsCellBorder): TsCellBorderStyle; begin - Result := GetWorksheet.ReadCellBorderStyle(@self, ABorder); + Result := (Worksheet as TsWorksheet).ReadCellBorderStyle(@self, ABorder); end; function TCellHelper.GetBorderStyles: TsCellBorderStyles; begin - Result := GetWorksheet.ReadCellBorderStyles(@self); + Result := (Worksheet as TsWorksheet).ReadCellBorderStyles(@self); end; function TCellHelper.GetCellFormat: TsCellFormat; begin - Result := GetWorkbook.GetCellFormat(FormatIndex); + Result := (GetWorkbook as TsWorkbook).GetCellFormat(FormatIndex); end; function TCellHelper.GetComment: String; begin - Result := GetWorksheet.ReadComment(@self); + Result := (Worksheet as TsWorksheet).ReadComment(@self); end; function TCellHelper.GetFont: TsFont; begin - Result := GetWorksheet.ReadCellFont(@self); + Result := (Worksheet as TsWorksheet).ReadCellFont(@self); end; function TCellHelper.GetFontIndex: Integer; var fmt: PsCellFormat; begin - fmt := Workbook.GetPointerToCellFormat(FormatIndex); + fmt := (Workbook as TsWorkbook).GetPointerToCellFormat(FormatIndex); Result := fmt^.FontIndex; end; function TCellHelper.GetHorAlignment: TsHorAlignment; begin - Result := GetWorksheet.ReadHorAlignment(@Self); + Result := (Worksheet as TsWorksheet).ReadHorAlignment(@Self); end; function TCellHelper.GetHyperlink: TsHyperlink; begin - Result := GetWorksheet.ReadHyperlink(@self); + Result := (Worksheet as TsWorksheet).ReadHyperlink(@self); end; function TCellHelper.GetNumberFormat: TsNumberFormat; var fmt: PsCellFormat; begin - fmt := Workbook.GetPointerToCellFormat(FormatIndex); + fmt := (Workbook as TsWorkbook).GetPointerToCellFormat(FormatIndex); Result := fmt^.NumberFormat; end; @@ -158,127 +160,122 @@ function TCellHelper.GetNumberFormatStr: String; var fmt: PsCellFormat; begin - fmt := Workbook.GetPointerToCellFormat(FormatIndex); + fmt := (Workbook as TsWorkbook).GetPointerToCellFormat(FormatIndex); Result := fmt^.NumberFormatStr; end; function TCellHelper.GetTextRotation: TsTextRotation; begin - Result := GetWorksheet.ReadTextRotation(@Self); + Result := (Worksheet as TsWorksheet).ReadTextRotation(@Self); end; function TCellHelper.GetUsedFormattingFields: TsUsedFormattingFields; begin - Result := GetWorksheet.ReadUsedFormatting(@Self); + Result := (Worksheet as TsWorksheet).ReadUsedFormatting(@Self); end; function TCellHelper.GetVertAlignment: TsVertAlignment; begin - Result := GetWorksheet.ReadVertAlignment(@self); + Result := (Worksheet as TsWorksheet).ReadVertAlignment(@self); end; function TCellHelper.GetWordwrap: Boolean; begin - Result := GetWorksheet.ReadWordwrap(@self); + Result := (Worksheet as TsWorksheet).ReadWordwrap(@self); end; -function TCellHelper.GetWorkbook: TsWorkbook; +function TCellHelper.GetWorkbook: TsBasicWorkbook; begin - Result := GetWorksheet.Workbook; -end; - -function TCellHelper.GetWorksheet: TsWorksheet; -begin - Result := TsWorksheet(Worksheet); + Result := (Worksheet as TsWorksheet).Workbook; end; procedure TCellHelper.SetBackgroundColor(const AValue: TsColor); begin - GetWorksheet.WriteBackgroundColor(@self, AValue); + (Worksheet as TsWorksheet).WriteBackgroundColor(@self, AValue); end; procedure TCellHelper.SetBiDiMode(const AValue: TsBiDiMode); begin - GetWorksheet.WriteBiDiMode(@self, AValue); + (Worksheet as TsWorksheet).WriteBiDiMode(@self, AValue); end; procedure TCellHelper.SetBorder(const AValue: TsCellBorders); begin - GetWorksheet.WriteBorders(@self, AValue); + (Worksheet as TsWorksheet).WriteBorders(@self, AValue); end; procedure TCellHelper.SetBorderStyle(const ABorder: TsCellBorder; const AValue: TsCellBorderStyle); begin - GetWorksheet.WriteBorderStyle(@self, ABorder, AValue); + (Worksheet as TsWorksheet).WriteBorderStyle(@self, ABorder, AValue); end; procedure TCellHelper.SetBorderStyles(const AValue: TsCellBorderStyles); begin - GetWorksheet.WriteBorderStyles(@self, AValue); + (Worksheet as TsWorksheet).WriteBorderStyles(@self, AValue); end; procedure TCellHelper.SetCellFormat(const AValue: TsCellFormat); begin - GetWorksheet.WriteCellFormat(@self, AValue); + (Worksheet as TsWorksheet).WriteCellFormat(@self, AValue); end; procedure TCellHelper.SetComment(const AValue: String); begin - GetWorksheet.WriteComment(@self, AValue); + (Worksheet as TsWorksheet).WriteComment(@self, AValue); end; procedure TCellHelper.SetFontIndex(const AValue: Integer); begin - GetWorksheet.WriteFont(@self, AValue); + (Worksheet as TsWorksheet).WriteFont(@self, AValue); end; procedure TCellHelper.SetHorAlignment(const AValue: TsHorAlignment); begin - GetWorksheet.WriteHorAlignment(@self, AValue); + (Worksheet as TsWorksheet).WriteHorAlignment(@self, AValue); end; procedure TCellHelper.SetHyperlink(const AValue: TsHyperlink); begin - GetWorksheet.WriteHyperlink(@self, AValue.Target, AValue.Tooltip); + (Worksheet as TsWorksheet).WriteHyperlink(@self, AValue.Target, AValue.Tooltip); end; procedure TCellHelper.SetNumberFormat(const AValue: TsNumberFormat); var fmt: TsCellFormat; begin - fmt := Workbook.GetCellFormat(FormatIndex); + fmt := (Workbook as TsWorkbook).GetCellFormat(FormatIndex); fmt.NumberFormat := AValue; - GetWorksheet.WriteCellFormat(@self, fmt); + (Worksheet as TsWorksheet).WriteCellFormat(@self, fmt); end; procedure TCellHelper.SetNumberFormatStr(const AValue: String); var fmt: TsCellFormat; begin - fmt := Workbook.GetCellFormat(FormatIndex); + fmt := (Workbook as TsWorkbook).GetCellFormat(FormatIndex); fmt.NumberFormatStr := AValue; - GetWorksheet.WriteCellFormat(@self, fmt); + (Worksheet as TsWorksheet).WriteCellFormat(@self, fmt); end; procedure TCellHelper.SetTextRotation(const AValue: TsTextRotation); begin - GetWorksheet.WriteTextRotation(@self, AValue); + (Worksheet as TsWorksheet).WriteTextRotation(@self, AValue); end; procedure TCellHelper.SetUsedFormattingFields(const AValue: TsUsedFormattingFields); begin - GetWorksheet.WriteUsedFormatting(@self, AValue); + (Worksheet as TsWorksheet).WriteUsedFormatting(@self, AValue); end; procedure TCellHelper.SetVertAlignment(const AValue: TsVertAlignment); begin - GetWorksheet.WriteVertAlignment(@self, AValue); + (Worksheet as TsWorksheet).WriteVertAlignment(@self, AValue); end; procedure TCellHelper.SetWordwrap(const AValue: Boolean); begin - GetWorksheet.WriteWordwrap(@self, AValue); + (Worksheet as TsWorksheet).WriteWordwrap(@self, AValue); end; diff --git a/components/fpspreadsheet/source/common/fpsclasses.pas b/components/fpspreadsheet/source/common/fpsclasses.pas index 290e67520..c0987d60e 100644 --- a/components/fpspreadsheet/source/common/fpsclasses.pas +++ b/components/fpspreadsheet/source/common/fpsclasses.pas @@ -76,12 +76,12 @@ type TsCells = class(TsRowColAVLTree) private - FWorksheet: Pointer; // Must be cast to TsWorksheet + FWorksheet: TsBasicWorksheet; // Must be cast to TsWorksheet protected procedure DisposeData(var AData: Pointer); override; function NewData: Pointer; override; public - constructor Create(AWorksheet: Pointer; AOwnsData: Boolean = true); + constructor Create(AWorksheet: TsBasicWorksheet; AOwnsData: Boolean = true); function AddCell(ARow, ACol: Cardinal): PCell; procedure DeleteCell(ARow, ACol: Cardinal); function FindCell(ARow, ACol: Cardinal): PCell; @@ -689,7 +689,8 @@ end; { TsCells: an AVLTree to store spreadsheet cells } {==============================================================================} -constructor TsCells.Create(AWorksheet: Pointer; AOwnsData: Boolean = true); +constructor TsCells.Create(AWorksheet: TsBasicWorksheet; + AOwnsData: Boolean = true); begin inherited Create(AOwnsData); FWorksheet := AWorksheet; diff --git a/components/fpspreadsheet/source/common/fpscsv.pas b/components/fpspreadsheet/source/common/fpscsv.pas index 14ad03ea3..59cc786bc 100644 --- a/components/fpspreadsheet/source/common/fpscsv.pas +++ b/components/fpspreadsheet/source/common/fpscsv.pas @@ -6,7 +6,7 @@ interface uses Classes, SysUtils, - fpstypes, fpspreadsheet, fpsReaderWriter, fpsCsvDocument; + fpstypes, fpsReaderWriter, fpsCsvDocument; type TsCSVReader = class(TsCustomSpreadReader) @@ -21,7 +21,7 @@ type procedure ReadLabel(AStream: TStream); override; procedure ReadNumber(AStream: TStream); override; public - constructor Create(AWorkbook: TsWorkbook); override; + constructor Create(AWorkbook: TsBasicWorkbook); override; procedure ReadFromFile(AFileName: String; APassword: String = ''; AParams: TsStreamParams = []); override; procedure ReadFromStream(AStream: TStream; APassword: String = ''; @@ -48,10 +48,10 @@ type const AValue: string; ACell: PCell); override; procedure WriteNumber(AStream: TStream; const ARow, ACol: Cardinal; const AValue: double; ACell: PCell); override; - procedure WriteSheet(AStream: TStream; AWorksheet: TsWorksheet); + procedure WriteSheet(AStream: TStream; AWorksheet: TsBasicWorksheet); public - constructor Create(AWorkbook: TsWorkbook); override; + constructor Create(AWorkbook: TsBasicWorkbook); override; procedure WriteToStream(AStream: TStream; AParams: TsStreamParams = []); override; procedure WriteToStrings(AStrings: TStrings; AParams: TsStreamParams = []); override; end; @@ -95,7 +95,7 @@ implementation uses DateUtils, LConvEncoding, Math, - fpsUtils, fpsNumFormat; + fpsUtils, fpspreadsheet, fpsNumFormat; const DEFAULT_ENCODING = 'utf8'; //'utf8bom'; @@ -115,7 +115,7 @@ end; { TsCSVReader } {------------------------------------------------------------------------------} -constructor TsCSVReader.Create(AWorkbook: TsWorkbook); +constructor TsCSVReader.Create(AWorkbook: TsBasicWorkbook); begin inherited Create(AWorkbook); FWorksheetName := 'Sheet1'; // will be replaced by filename @@ -148,29 +148,32 @@ procedure TsCSVReader.ReadCellValue(ARow, ACol: Cardinal; AText: String); var cell: PCell; boolValue: Boolean; + sheet: TsWorksheet; begin // Empty strings are blank cells -- nothing to do if AText = '' then exit; - cell := FWorksheet.AddCell(ARow, ACol); + sheet := FWorksheet as TsWorksheet; + + cell := sheet.AddCell(ARow, ACol); // Do not try to interpret the strings. --> everything is a LABEL cell. if not CSVParams.DetectContentType then begin - FWorksheet.WriteText(cell, AText); + sheet.WriteText(cell, AText); exit; end; // Check for a BOOLEAN cell if IsBoolValue(AText, CSVParams.TrueText, CSVParams.FalseText, boolValue) then begin - FWorksheet.WriteBoolValue(cell, boolValue); + sheet.WriteBoolValue(cell, boolValue); exit; end; // All other cases are handled by WriteCellValusAsString - FWorksheet.WriteCellValueAsString(cell, AText, FFormatSettings); + sheet.WriteCellValueAsString(cell, AText, FFormatSettings); end; procedure TsCSVReader.ReadFormula(AStream: TStream); @@ -205,7 +208,7 @@ begin encoding := DEFAULT_ENCODING; // Create worksheet - FWorksheet := FWorkbook.AddWorksheet(FWorksheetName, true); + FWorksheet := (FWorkbook as TsWorkbook).AddWorksheet(FWorksheetName, true); // Create csv parser, read file and store in worksheet Parser := TCSVParser.Create; @@ -255,7 +258,7 @@ end; { TsCSVWriter } {------------------------------------------------------------------------------} -constructor TsCSVWriter.Create(AWorkbook: TsWorkbook); +constructor TsCSVWriter.Create(AWorkbook: TsBasicWorkbook); begin inherited Create(AWorkbook); FFormatSettings := CSVParams.FormatSettings; @@ -298,7 +301,7 @@ var begin Unused(AStream); Unused(ARow, ACol, AValue); - s := FWorksheet.ReadAsText(ACell); + s := (FWorksheet as TsWorksheet).ReadAsText(ACell); s := ConvertEncoding(s, EncodingUTF8, FEncoding); FCSVBuilder.AppendCell(s); end; @@ -349,20 +352,22 @@ begin if CSVParams.NumberFormat <> '' then s := Format(CSVParams.NumberFormat, [AValue], FFormatSettings) else - s := FWorksheet.ReadAsText(ACell, FFormatSettings); + s := (FWorksheet as TsWorksheet).ReadAsText(ACell, FFormatSettings); s := ConvertEncoding(s, EncodingUTF8, FEncoding); FCSVBuilder.AppendCell(s); end; -procedure TsCSVWriter.WriteSheet(AStream: TStream; AWorksheet: TsWorksheet); +procedure TsCSVWriter.WriteSheet(AStream: TStream; AWorksheet: TsBasicWorksheet); var r, c: Cardinal; firstRow, lastRow: Cardinal; firstCol, lastCol: Cardinal; cell: PCell; n: Integer; + sheet: TsWorksheet; begin FWorksheet := AWorksheet; + sheet := FWorksheet as TsWorksheet; FCSVBuilder := TCSVBuilder.Create; try @@ -371,29 +376,29 @@ begin FCSVBuilder.QuoteChar := CSVParams.QuoteChar; FCSVBuilder.SetOutput(AStream); - n := FWorksheet.GetCellCount; + n := sheet.GetCellCount; if FClipboardMode and (n = 1) then begin - cell := FWorksheet.Cells.GetFirstCell; + cell := sheet.Cells.GetFirstCell; WriteCellToStream(AStream, cell); end else begin if FClipboardMode then begin - firstRow := FWorksheet.GetFirstRowIndex; - firstCol := FWorksheet.GetFirstColIndex; + firstRow := sheet.GetFirstRowIndex; + firstCol := sheet.GetFirstColIndex; end else begin firstRow := 0; firstCol := 0; end; - lastRow := FWorksheet.GetLastOccupiedRowIndex; - lastCol := FWorksheet.GetLastOccupiedColIndex; + lastRow := sheet.GetLastOccupiedRowIndex; + lastCol := sheet.GetLastOccupiedColIndex; for r := firstRow to lastRow do begin for c := firstCol to lastCol do begin - cell := FWorksheet.FindCell(r, c); + cell := sheet.FindCell(r, c); if cell = nil then FCSVBuilder.AppendCell('') else @@ -411,12 +416,15 @@ procedure TsCSVWriter.WriteToStream(AStream: TStream; AParams: TsStreamParams = []); var n: Integer; + book: TsWorkbook; begin + book := FWorkbook as TsWorkbook; + FClipboardMode := (spClipboard in AParams); - if (CSVParams.SheetIndex >= 0) and (CSVParams.SheetIndex < FWorkbook.GetWorksheetCount) + if (CSVParams.SheetIndex >= 0) and (CSVParams.SheetIndex < book.GetWorksheetCount) then n := CSVParams.SheetIndex else n := 0; - WriteSheet(AStream, FWorkbook.GetWorksheetByIndex(n)); + WriteSheet(AStream, book.GetWorksheetByIndex(n)); end; procedure TsCSVWriter.WriteToStrings(AStrings: TStrings; diff --git a/components/fpspreadsheet/source/common/fpsexprparser.pas b/components/fpspreadsheet/source/common/fpsexprparser.pas index 48d374967..498afbc91 100644 --- a/components/fpspreadsheet/source/common/fpsexprparser.pas +++ b/components/fpspreadsheet/source/common/fpsexprparser.pas @@ -51,7 +51,7 @@ unit fpsExprParser; interface uses - Classes, SysUtils, contnrs, fpstypes, fpspreadsheet, fpsrpn; + Classes, SysUtils, contnrs, fpstypes, fpsrpn; type { Tokens } @@ -86,7 +86,7 @@ type TsResultTypes = set of TsResultType; TsExpressionResult = record - Worksheet : TsWorksheet; // Worksheet containing the calculated cell + Worksheet : TsBasicWorksheet; // Worksheet containing the calculated cell ResString : String; case ResultType : TsResultType of rtEmpty : (); @@ -586,7 +586,7 @@ type { TsCellExprNode } TsCellExprNode = class(TsExprNode) private - FWorksheet: TsWorksheet; + FWorksheet: TsBasicWorksheet; FRow, FCol: Cardinal; FFlags: TsRelFlags; FCell: PCell; @@ -595,20 +595,20 @@ type protected function GetCol: Cardinal; function GetRow: Cardinal; - function GetSheet: TsWorksheet; + function GetSheet: TsBasicWorksheet; function GetSheetIndex: Integer; function GetSheetName: String; - function GetWorkbook: TsWorkbook; + function GetWorkbook: TsBasicWorkbook; procedure GetNodeValue(out AResult: TsExpressionResult); override; public - constructor Create(AParser: TsExpressionParser; AWorksheet: TsWorksheet; + constructor Create(AParser: TsExpressionParser; AWorksheet: TsBasicWorksheet; ASheetName: String; ARow, ACol: Cardinal; AFlags: TsRelFlags); function AsRPNItem(ANext: PRPNItem): PRPNItem; override; function AsString: string; override; procedure Check; override; function Has3DLink: Boolean; override; function NodeType: TsResultType; override; - property Worksheet: TsWorksheet read FWorksheet; + property Worksheet: TsBasicWorksheet read FWorksheet; end; { TsCellRangeExprNode } @@ -616,7 +616,7 @@ type TsCellRangeExprNode = class(TsExprNode) private - FWorksheet: TsWorksheet; + FWorksheet: TsBasicWorksheet; FRow: array[TsCellRangeIndex] of Cardinal; FCol: array[TsCellRangeIndex] of Cardinal; FSheetIndex: array[TsCellRangeIndex] of Integer; @@ -626,17 +626,17 @@ type function GetCol(AIndex: TsCellRangeIndex): Cardinal; function GetRow(AIndex: TsCellRangeIndex): Cardinal; procedure GetNodeValue(out Result: TsExpressionResult); override; - function GetWorkbook: TsWorkbook; + function GetWorkbook: TsBasicWorkbook; public - constructor Create(AParser: TsExpressionParser; AWorksheet: TsWorksheet; + constructor Create(AParser: TsExpressionParser; AWorksheet: TsBasicWorksheet; ASheet1, ASheet2: String; ARange: TsCellRange; AFlags: TsRelFlags); function AsRPNItem(ANext: PRPNItem): PRPNItem; override; function AsString: String; override; procedure Check; override; function Has3DLink: Boolean; override; function NodeType: TsResultType; override; - property Workbook: TsWorkbook read GetWorkbook; - property Worksheet: TsWorksheet read FWorksheet; + property Workbook: TsBasicWorkbook read GetWorkbook; + property Worksheet: TsBasicWorksheet read FWorksheet; end; { TsExpressionScanner } @@ -700,7 +700,7 @@ type FIdentifiers: TsExprIdentifierDefs; FHashList: TFPHashObjectlist; FDirty: Boolean; - FWorksheet: TsWorksheet; + FWorksheet: TsBasicWorksheet; FDialect: TsFormulaDialect; FSourceCell: PCell; FDestCell: PCell; @@ -748,7 +748,7 @@ type property Dirty: Boolean read FDirty; public - constructor Create(AWorksheet: TsWorksheet); virtual; + constructor Create(AWorksheet: TsBasicWorksheet); virtual; destructor Destroy; override; function IdentifierByName(AName: ShortString): TsExprIdentifierDef; virtual; procedure Clear; @@ -771,7 +771,7 @@ type property RPNFormula: TsRPNFormula read GetRPNFormula write SetRPNFormula; property Identifiers: TsExprIdentifierDefs read FIdentifiers write SetIdentifiers; property BuiltIns: TsBuiltInExprCategories read FBuiltIns write SetBuiltIns; - property Worksheet: TsWorksheet read FWorksheet; + property Worksheet: TsBasicWorksheet read FWorksheet; property Dialect: TsFormulaDialect read FDialect write SetDialect; property Contains3DRef: boolean read FContains3DRef; @@ -779,7 +779,7 @@ type TsSpreadsheetParser = class(TsExpressionParser) public - constructor Create(AWorksheet: TsWorksheet); override; + constructor Create(AWorksheet: TsBasicWorksheet); override; end; @@ -865,7 +865,8 @@ const implementation uses - typinfo, math, lazutf8, dateutils, fpsutils, fpsfunc, fpsStrings; + typinfo, math, lazutf8, dateutils, + fpsutils, fpsfunc, fpsStrings, fpspreadsheet; const cNull = #0; @@ -1372,7 +1373,7 @@ end; { TsExpressionParser } {------------------------------------------------------------------------------} -constructor TsExpressionParser.Create(AWorksheet: TsWorksheet); +constructor TsExpressionParser.Create(AWorksheet: TsBasicWorksheet); begin inherited Create; FDialect := fdExcelA1; @@ -2038,7 +2039,7 @@ procedure TsExpressionParser.SetRPNFormula(const AFormula: TsRPNFormula); else begin flags := AFormula[AIndex].RelFlags; - sn := FWorksheet.Workbook.GetWorksheetByIndex(idx).Name; + sn := (FWorksheet as TsWorksheet).Workbook.GetWorksheetByIndex(idx).Name; ANode := TsCellExprNode.Create(Self, FWorksheet, sn, r, c, flags); end; dec(AIndex); @@ -2053,9 +2054,9 @@ procedure TsExpressionParser.SetRPNFormula(const AFormula: TsRPNFormula); if fek = fekCellRange then ANode := TsCellRangeExprNode.Create(self, FWorksheet, '', '', rng, flags) else begin - sn := FWorksheet.Workbook.GetWorksheetByIndex(AFormula[AIndex].Sheet).Name; + sn := (FWorksheet as TsWorksheet).Workbook.GetWorksheetByIndex(AFormula[AIndex].Sheet).Name; if AFormula[AIndex].Sheet2 <> -1 then - sn2 := FWorksheet.Workbook.GetWorksheetByIndex(AFormula[AIndex].Sheet2).Name + sn2 := (FWorksheet as TsWorksheet).Workbook.GetWorksheetByIndex(AFormula[AIndex].Sheet2).Name else sn2 := ''; ANode := TsCellRangeExprNode.Create(self, FWorksheet, sn,sn2, rng, flags); @@ -2185,7 +2186,7 @@ end; { TsSpreadsheetParser } {------------------------------------------------------------------------------} -constructor TsSpreadsheetParser.Create(AWorksheet: TsWorksheet); +constructor TsSpreadsheetParser.Create(AWorksheet: TsBasicWorksheet); begin inherited Create(AWorksheet); BuiltIns := AllBuiltIns; @@ -3763,7 +3764,7 @@ end; { TsCellExprNode } constructor TsCellExprNode.Create(AParser: TsExpressionParser; - AWorksheet: TsWorksheet; ASheetName: String; ARow, ACol: Cardinal; + AWorksheet: TsBasicWorksheet; ASheetName: String; ARow, ACol: Cardinal; AFlags: TsRelFlags); begin FParser := AParser; @@ -3772,7 +3773,7 @@ begin FRow := ARow; FCol := ACol; FFlags := AFlags; - FCell := GetSheet.FindCell(FRow, FCol); + FCell := (GetSheet as TsWorksheet).FindCell(FRow, FCol); if Has3DLink then FParser.FContains3DRef := true; end; @@ -3847,14 +3848,14 @@ var cell: PCell; begin if Parser.CopyMode then - cell := FWorksheet.FindCell(GetRow, GetCol) + cell := (FWorksheet as TsWorksheet).FindCell(GetRow, GetCol) else cell := FCell; if (cell <> nil) and HasFormula(cell) then - case FWorksheet.GetCalcState(cell) of + case (FWorksheet as TsWorksheet).GetCalcState(cell) of csNotCalculated: - FWorksheet.CalcFormula(cell); + (FWorksheet as TsWorksheet).CalcFormula(cell); csCalculating: raise ECalcEngine.CreateFmt(rsCircularReference, [GetCellString(cell^.Row, cell^.Col)]); end; @@ -3873,20 +3874,23 @@ begin Result := FRow - FParser.FSourceCell^.Row + FParser.FDestCell^.Row; end; -function TsCellExprNode.GetSheet: TsWorksheet; +function TsCellExprNode.GetSheet: TsBasicWorksheet; begin if FSheetName = '' then Result := FWorksheet else - Result := GetWorkbook.GetWorksheetByName(FSheetName); + Result := (GetWorkbook as TsWorkbook).GetWorksheetByName(FSheetName); end; function TsCellExprNode.GetSheetIndex: Integer; +var + book: TsWorkbook; begin + book := GetWorkbook as TsWorkbook; if FSheetName = '' then - Result := GetWorkbook.GetWorksheetIndex(FWorksheet) + Result := book.GetWorksheetIndex(FWorksheet) else - Result := GetWorkbook.GetWorksheetIndex(FSheetName); + Result := book.GetWorksheetIndex(FSheetName); end; function TsCellExprNode.GetSheetName: String; @@ -3897,9 +3901,9 @@ begin Result := FSheetName; end; -function TsCellExprNode.GetWorkbook: TsWorkbook; +function TsCellExprNode.GetWorkbook: TsBasicWorkbook; begin - Result := FWorksheet.Workbook; + Result := (FWorksheet as TsWorksheet).Workbook; end; function TsCellExprNode.Has3DLink: Boolean; @@ -3917,8 +3921,10 @@ end; { TsCellRangeExprNode } constructor TsCellRangeExprNode.Create(AParser: TsExpressionParser; - AWorksheet: TsWorksheet; ASheet1, ASheet2: String; ARange: TsCellRange; + AWorksheet: TsBasicWorksheet; ASheet1, ASheet2: String; ARange: TsCellRange; AFlags: TsRelFlags); +var + book: TsWorkbook; begin if (ASheet1 = '') and (ASheet2 <> '') then raise Exception.Create('Invalid parameters in cell range'); @@ -3926,13 +3932,14 @@ begin FParser := AParser; FWorksheet := AWorksheet; FFlags := []; + book := TsWorkbook(GetWorkbook); F3dRange := ((ASheet1 <> '') and (ASheet2 <> '') { and (ASheet1 <> ASheet2)}) or ((ASheet1 <> '') and (ASheet2 = '')); - FSheetIndex[1] := GetWorkbook.GetWorksheetIndex(ASheet1); + FSheetIndex[1] := book.GetWorksheetIndex(ASheet1); if ASheet2 <> '' then - FSheetIndex[2] := GetWorkbook.GetWorksheetIndex(ASheet2) + FSheetIndex[2] := book.GetWorksheetIndex(ASheet2) else FSheetIndex[2] := FSheetIndex[1]; EnsureOrder(FSheetIndex[1], FSheetIndex[2]); @@ -3997,11 +4004,11 @@ begin if FSheetIndex[1] = -1 then s1 := FWorksheet.Name else - s1 := Workbook.GetWorksheetByIndex(FSheetIndex[1]).Name; + s1 := (Workbook as TsWorkbook).GetWorksheetByIndex(FSheetIndex[1]).Name; if FSheetIndex[2] = -1 then s2 := FWorksheet.Name else - s2 := Workbook.GetWorksheetByIndex(FSheetIndex[2]).Name; + s2 := (Workbook as TsWorkbook).GetWorksheetByIndex(FSheetIndex[2]).Name; r1 := GetRow(1); c1 := GetCol(1); r2 := GetRow(2); @@ -4068,12 +4075,12 @@ begin end; if not F3dRange then begin - s[1] := Workbook.GetWorksheetIndex(FWorksheet); + s[1] := (Workbook as TsWorkbook).GetWorksheetIndex(FWorksheet); s[2] := s[1]; end; for ss := s[1] to s[2] do begin - sheet := Workbook.GetWorksheetByIndex(ss); + sheet := (Workbook as TsWorkbook).GetWorksheetByIndex(ss); for rr := r[1] to r[2] do for cc := c[1] to c[2] do begin @@ -4106,9 +4113,9 @@ begin Result := FRow[AIndex] - FParser.FSourceCell^.Row + FParser.FDestCell^.Row; end; -function TsCellRangeExprNode.GetWorkbook: TsWorkbook; +function TsCellRangeExprNode.GetWorkbook: TsBasicWorkbook; begin - Result := FWorksheet.Workbook; + Result := (FWorksheet as TsWorksheet).Workbook; end; function TsCellRangeExprNode.Has3DLink: Boolean; @@ -4144,7 +4151,7 @@ end; function ArgToCell(Arg: TsExpressionResult): PCell; begin if Arg.ResultType = rtCell then - Result := Arg.Worksheet.FindCell(Arg.ResRow, Arg.ResCol) + Result := (Arg.Worksheet as TsWorksheet).FindCell(Arg.ResRow, Arg.ResCol) else Result := nil; end; @@ -4196,14 +4203,18 @@ begin cell := ArgToCell(Arg); if Assigned(cell) then case cell^.ContentType of - cctNumber : Result := cell^.NumberValue; - cctDateTime : Result := cell^.DateTimeValue; - cctBool : if cell^.BoolValue then result := 1.0; - cctUTF8String: begin - fs := Arg.Worksheet.Workbook.FormatSettings; - s := cell^.UTF8StringValue; - TryStrToFloat(s, result, fs); - end; + cctNumber: + Result := cell^.NumberValue; + cctDateTime: + Result := cell^.DateTimeValue; + cctBool: + if cell^.BoolValue then result := 1.0; + cctUTF8String: + begin + fs := (Arg.Worksheet as TsWorksheet).Workbook.FormatSettings; + s := cell^.UTF8StringValue; + TryStrToFloat(s, result, fs); + end; end; end; end; @@ -4222,7 +4233,7 @@ begin rtBoolean : if Arg.ResBoolean then Result := 1.0; rtString, rtHyperlink : begin - fs := Arg.Worksheet.Workbook.FormatSettings; + fs := (Arg.Worksheet as TsWorksheet).Workbook.FormatSettings; TryStrToDateTime(ArgToString(Arg), Result, fs); end; rtCell : begin @@ -4265,7 +4276,7 @@ begin cctNumber : Result := Format('%g', [cell^.NumberValue]); cctBool : if cell^.BoolValue then Result := '1' else Result := '0'; cctDateTime : begin - fs := Arg.Worksheet.Workbook.FormatSettings; + fs := (Arg.Worksheet as TsWorksheet).Workbook.FormatSettings; dt := cell^.DateTimeValue; if frac(dt) = 0.0 then Result := FormatDateTime(fs.LongTimeFormat, dt, fs) @@ -4301,7 +4312,7 @@ begin idx2 := arg.ResCellRange.Sheet2; for idx := idx1 to idx2 do begin - sheet := arg.Worksheet.Workbook.GetWorksheetByIndex(idx); + sheet := (arg.Worksheet as TsWorksheet).Workbook.GetWorksheetByIndex(idx); for r := arg.ResCellRange.Row1 to arg.ResCellRange.Row2 do for c := arg.ResCellRange.Col1 to arg.ResCellRange.Col2 do begin @@ -4393,7 +4404,7 @@ begin rtFloat : Result := (frac(AValue.ResFloat) = 0); rtEmpty : Result := true; rtCell : begin - cell := AValue.Worksheet.FindCell(AValue.ResRow, AValue.ResCol); + cell := (AValue.Worksheet as TsWorksheet).FindCell(AValue.ResRow, AValue.ResCol); if Assigned(cell) then case cell^.ContentType of cctNumber: @@ -4415,7 +4426,7 @@ begin case AValue.ResultType of rtString: Result := true; rtCell : begin - cell := AValue.Worksheet.FindCell(AValue.ResRow, AValue.ResCol); + cell := (AValue.Worksheet as TsWorksheet).FindCell(AValue.ResRow, AValue.ResCol); Result := (cell <> nil) and (cell^.ContentType = cctUTF8String); end; end; diff --git a/components/fpspreadsheet/source/common/fpsfunc.pas b/components/fpspreadsheet/source/common/fpsfunc.pas index 09c99b1a3..8ee39f986 100644 --- a/components/fpspreadsheet/source/common/fpsfunc.pas +++ b/components/fpspreadsheet/source/common/fpsfunc.pas @@ -9,7 +9,7 @@ unit fpsfunc; interface uses - Classes, SysUtils, fpstypes, fpspreadsheet; + Classes, SysUtils, fpstypes; procedure RegisterStdBuiltins(AManager: TComponent); @@ -18,7 +18,7 @@ implementation uses Math, lazutf8, StrUtils, DateUtils, - xlsconst, {%H-}fpsPatches, fpsUtils, fpsnumformat, fpsexprparser; + xlsconst, {%H-}fpsPatches, fpsUtils, fpsnumformat, fpsexprparser, fpspreadsheet; {------------------------------------------------------------------------------} @@ -1035,7 +1035,7 @@ begin for r := arg.ResCellRange.Row1 to arg.ResCellRange.Row2 do for c := arg.ResCellRange.Col1 to arg.ResCellRange.Col2 do begin - cell := arg.Worksheet.FindCell(r, c); + cell := (arg.Worksheet as TsWorksheet).FindCell(r, c); if (cell <> nil) then case cell^.ContentType of cctNumber, cctDateTime, cctBool : inc(n); @@ -1076,7 +1076,7 @@ begin rtCellRange: for r := Args[0].ResCellRange.Row1 to Args[0].ResCellRange.Row2 do for c := Args[0].ResCellRange.Col1 to Args[0].ResCellRange.Col2 do begin - cell := Args[0].Worksheet.FindCell(r, c); + cell := (Args[0].Worksheet as TsWorksheet).FindCell(r, c); if cell = nil then inc(n) else @@ -1185,7 +1185,7 @@ begin // Get format settings for string-to-float or -to-datetime conversion if (Args[0].ResultType in [rtCell, rtCellRange]) then - fs := Args[0].Worksheet.FormatSettings + fs := (Args[0].Worksheet as TsWorksheet).FormatSettings else begin Result := ErrorResult(errArgError); @@ -1325,8 +1325,8 @@ begin if AFlag > 0 then begin if Length(Args) = 2 then - addcell := Args[0].Worksheet.FindCell(r + dr, c + dc) else - addCell := Args[2].Worksheet.FindCell(r + dr, c + dc); + addcell := (Args[0].Worksheet as TsWorksheet).FindCell(r + dr, c + dc) else + addCell := (Args[2].Worksheet as TsWorksheet).FindCell(r + dr, c + dc); if addcell <> nil then case addcell^.Contenttype of cctNumber : addnumber := addcell^.NumberValue; @@ -1335,7 +1335,7 @@ begin end; end; - cell := Args[0].Worksheet.FindCell(r, c); + cell := (Args[0].Worksheet as TsWorksheet).FindCell(r, c); case compareType of ctNumber: if cell <> nil then @@ -1610,7 +1610,7 @@ begin begin r1 := Args[1].ResCellRange.Row1; c1 := Args[1].ResCellRange.Col1; - cell := Args[1].Worksheet.FindCell(r1, c1); + cell := (Args[1].Worksheet as TsWorksheet).FindCell(r1, c1); end; else Result := ErrorResult(errWrongType); @@ -1652,8 +1652,8 @@ begin end else if stype = 'filename' then Result := Stringresult( - ExtractFilePath(Args[1].Worksheet.Workbook.FileName) + '[' + - ExtractFileName(Args[1].Worksheet.Workbook.FileName) + ']' + + ExtractFilePath((Args[1].Worksheet as TsWorksheet).Workbook.FileName) + '[' + + ExtractFileName((Args[1].Worksheet as TsWorksheet).Workbook.FileName) + ']' + Args[1].Worksheet.Name ) else @@ -1710,7 +1710,7 @@ begin Result := StringResult('v'); end else if stype = 'width' then - Result := FloatResult(Args[1].Worksheet.GetColWidth(c1, suChars)) + Result := FloatResult((Args[1].Worksheet as TsWorksheet).GetColWidth(c1, suChars)) else Result := ErrorResult(errWrongType); end; diff --git a/components/fpspreadsheet/source/common/fpshtml.pas b/components/fpspreadsheet/source/common/fpshtml.pas index e56e628ed..8122aead1 100644 --- a/components/fpspreadsheet/source/common/fpshtml.pas +++ b/components/fpspreadsheet/source/common/fpshtml.pas @@ -6,7 +6,7 @@ interface uses Classes, SysUtils, fasthtmlparser, - fpstypes, fpspreadsheet, fpsClasses, fpsReaderWriter, fpsHTMLUtils; + fpstypes, fpsClasses, fpsReaderWriter, fpsHTMLUtils; type TsHTMLReader = class(TsCustomSpreadReader) @@ -55,7 +55,7 @@ type procedure AddRichTextParam(AFont: TsFont; AHyperlinkIndex: Integer = -1); procedure FixRichTextParams(var AParams: TsRichTextParams); public - constructor Create(AWorkbook: TsWorkbook); override; + constructor Create(AWorkbook: TsBasicWorkbook); override; destructor Destroy; override; procedure ReadFromStream(AStream: TStream; APassword: String = ''; AParams: TsStreamParams = []); override; @@ -86,7 +86,7 @@ type function IsHyperlinkTarget(ACell: PCell; out ABookmark: String): Boolean; procedure WriteBody(AStream: TStream); procedure WriteStyles(AStream: TStream); - procedure WriteWorksheet(AStream: TStream; ASheet: TsWorksheet); + procedure WriteWorksheet(AStream: TStream; ASheet: TsBasicWorksheet); protected procedure InternalWriteToStream(AStream: TStream); @@ -106,7 +106,7 @@ type const AValue: double; ACell: PCell); override; public - constructor Create(AWorkbook: TsWorkbook); override; + constructor Create(AWorkbook: TsBasicWorkbook); override; destructor Destroy; override; procedure WriteToStream(AStream: TStream; AParams: TsStreamParams = []); override; procedure WriteToStrings(AStrings: TStrings; AParams: TsStreamParams = []); override; @@ -143,7 +143,7 @@ implementation uses LConvEncoding, LazUTF8, URIParser, StrUtils, Math, - fpsUtils, fpsXMLCommon, fpsNumFormat; + fpsUtils, fpspreadsheet, fpsXMLCommon, fpsNumFormat; const MIN_FONTSIZE = 6; @@ -162,7 +162,7 @@ const { TsHTMLReader } {==============================================================================} -constructor TsHTMLReader.Create(AWorkbook: TsWorkbook); +constructor TsHTMLReader.Create(AWorkbook: TsBasicWorkbook); begin inherited Create(AWorkbook); FEncoding := EncodingUTF8; @@ -203,13 +203,16 @@ var currSym: String; warning: String; fntIndex: Integer; + sheet: TsWorksheet; begin // Empty strings are blank cells -- nothing to do if (AText = '') then exit; + sheet := FWorksheet as TsWorksheet; + // Create cell - cell := FWorksheet.AddCell(ARow, ACol); + cell := sheet.AddCell(ARow, ACol); // Format, rich-text formatting parameters // Reject non-used runs; adapt font index to the workbook. @@ -223,10 +226,10 @@ begin end else begin // Get cell font and use it in the cell format - fntIndex := FWorkbook.FindFont(FCellFont.FontName, FCellFont.Size, + fntIndex := (FWorkbook as TsWorkbook).FindFont(FCellFont.FontName, FCellFont.Size, FCellFont.Style, FCellFont.Color, FCellFont.Position); if fntIndex = -1 then - fntIndex := FWorkbook.AddFont(FCellFont.FontName, FCellFont.Size, + fntIndex := (FWorkbook as TsWorkbook).AddFont(FCellFont.FontName, FCellFont.Size, FCellFont.Style, FCellFont.Color, FCellFont.Position); FCurrCellFormat.FontIndex := fntIndex; end; @@ -234,25 +237,25 @@ begin Include(FCurrCellFormat.UsedFormattingFields, uffFont) else Exclude(FCurrCellFormat.UsedFormattingFields, uffFont); // Store the cell format in the workbook - cell^.FormatIndex := FWorkbook.AddCellFormat(FCurrCellFormat); + cell^.FormatIndex := (FWorkbook as TsWorkbook).AddCellFormat(FCurrCellFormat); // Merged cells if (FColSpan > 0) or (FRowSpan > 0) then begin - FWorksheet.MergeCells(ARow, ACol, ARow + FRowSpan, ACol + FColSpan); + sheet.MergeCells(ARow, ACol, ARow + FRowSpan, ACol + FColSpan); FRowSpan := 0; FColSpan := 0; end; // Hyperlink if FHRef <> '' then begin - FWorksheet.WriteHyperlink(cell, FHRef); + sheet.WriteHyperlink(cell, FHRef); FHRef := ''; end; // Case: Do not try to interpret the strings. --> everything is a LABEL cell. if not HTMLParams.DetectContentType then begin - FWorksheet.WriteText(cell, AText, FCurrRichTextParams); + sheet.WriteText(cell, AText, FCurrRichTextParams); exit; end; @@ -261,9 +264,9 @@ begin dblValue, nf, decs, currSym, warning) then begin if currSym <> '' then - FWorksheet.WriteCurrency(cell, dblValue, nfCurrency, decs, currSym) + sheet.WriteCurrency(cell, dblValue, nfCurrency, decs, currSym) else - FWorksheet.WriteNumber(cell, dblValue, nf, decs); + sheet.WriteNumber(cell, dblValue, nf, decs); if warning <> '' then FWorkbook.AddErrorMsg('Cell %s: %s', [GetCellString(ARow, ACol), warning]); exit; @@ -273,19 +276,19 @@ begin // No idea how to apply the date/time formatsettings here... if IsDateTimevalue(AText, FFormatSettings, dtValue, nf) then begin - FWorksheet.WriteDateTime(cell, dtValue, nf); + sheet.WriteDateTime(cell, dtValue, nf); exit; end; // Check for a BOOLEAN cell if IsBoolValue(AText, HTMLParams.TrueText, HTMLParams.FalseText, boolValue) then begin - FWorksheet.WriteBoolValue(cell, boolValue); + sheet.WriteBoolValue(cell, boolValue); exit; end; // What is left is handled as a TEXT cell - FWorksheet.WriteText(cell, AText, FCurrRichTextParams); + sheet.WriteText(cell, AText, FCurrRichTextParams); end; { Stores a font in the internal font list. Does not allow duplicates. } @@ -378,9 +381,9 @@ begin for i:=0 to High(FCurrRichTextParams) do begin fnt := TsFont(FFontList[FCurrRichTextParams[i].FontIndex]); - fntIndex := FWorkbook.FindFont(fnt.FontName, fnt.Size, fnt.Style, fnt.Color, fnt.Position); + fntIndex := (FWorkbook as TsWorkbook).FindFont(fnt.FontName, fnt.Size, fnt.Style, fnt.Color, fnt.Position); if fntIndex = -1 then - fntIndex := FWorkbook.AddFont(fnt.FontName, fnt.Size, fnt.Style, fnt.Color, fnt.Position); + fntIndex := (FWorkbook as TsWorkbook).AddFont(fnt.FontName, fnt.Size, fnt.Style, fnt.Color, fnt.Position); FCurrRichTextParams[i].FontIndex := fntIndex; end; end; @@ -485,6 +488,7 @@ end; procedure TsHTMLReader.ProcessEndTags(NoCaseTag, ActualTag: String); var fntIndex: Integer; + sheet: TsWorksheet; begin Unused(ActualTag); if not FInTable then exit; @@ -501,9 +505,11 @@ begin if not FInCell then exit; + sheet := FWorksheet as TsWorksheet; + if (NoCaseTag = '') or (NoCaseTag = '') then begin - while FWorksheet.IsMerged(FWorksheet.FindCell(FCurrRow, FCurrCol)) do + while sheet.IsMerged(sheet.FindCell(FCurrRow, FCurrCol)) do inc(FCurrCol); AddCell(FCurrRow, FCurrCol, FCellText); FInCell := false; @@ -807,7 +813,7 @@ begin if idx = -1 then idx := FAttrList.IndexOfName('size'); if idx > -1 then begin - defFntSize := FWorkbook.GetDefaultFont.Size; + defFntSize := (FWorkbook as TsWorkbook).GetDefaultFont.Size; s := FAttrList[idx].Value; case s of 'medium', '3' : AFont.Size := defFntSize; @@ -1022,7 +1028,7 @@ procedure TsHTMLReader.InitFont(AFont: TsFont); var fnt: TsFont; begin - fnt := FWorkbook.GetDefaultFont; + fnt := (FWorkbook as TsWorkbook).GetDefaultFont; AFont.FontName := fnt.FontName; AFont.Size := fnt.Size; AFont.Style := fnt.Style; @@ -1056,10 +1062,10 @@ begin try list.LoadFromStream(AStream); ReadFromStrings(list, AParams); - if FWorkbook.GetWorksheetCount = 0 then + if (FWorkbook as TsWorkbook).GetWorksheetCount = 0 then begin FWorkbook.AddErrorMsg('Requested table not found, or no tables in html file'); - FWorkbook.AddWorksheet('Dummy'); + TsWorkbook(FWorkbook).AddWorksheet('Dummy'); end; finally list.Free; @@ -1106,14 +1112,14 @@ begin inc(FTableCounter); if (HTMLParams.TableIndex >= 0) and (FTableCounter <> HTMLParams.TableIndex) then exit; - FWorksheet := FWorkbook.AddWorksheet(Format('Table #%d', [FTableCounter+1])); + FWorksheet := TsWorkbook(FWorkbook).AddWorksheet(Format('Table #%d', [FTableCounter+1])); FInTable := true; FCurrRow := -1; FCurrCol := -1; FFontStack.Push(AddFont(FCurrFont)); FAttrList.Parse(ActualTag); ReadFont(FCurrFont); - FWorkbook.ReplaceFont(DEFAULT_FONTINDEX, FCurrFont.FontName, FCurrFont.Size, + TsWorkbook(FWorkbook).ReplaceFont(DEFAULT_FONTINDEX, FCurrFont.FontName, FCurrFont.Size, FCurrFont.Style, FCurrFont.Color, FCurrFont.Position); FCellFont.CopyOf(FCurrFont); exit; @@ -1179,7 +1185,7 @@ end; {==============================================================================} { TsHTMLWriter } {==============================================================================} -constructor TsHTMLWriter.Create(AWorkbook: TsWorkbook); +constructor TsHTMLWriter.Create(AWorkbook: TsBasicWorkbook); begin inherited Create(AWorkbook); FPointSeparatorSettings := DefaultFormatSettings; @@ -1311,17 +1317,20 @@ var col: PCol; w: Single; rLast: Cardinal; + sheet: TsWorksheet; begin + sheet := FWorksheet as TsWorksheet; + if AColIndex < 0 then // Row header column begin - rLast := FWorksheet.GetLastRowIndex; - w := FWorkbook.ConvertUnits(Length(IntToStr(rLast)) + 2, suChars, suPoints); + rLast := sheet.GetLastRowIndex; + w := (FWorkbook as TsWorkbook).ConvertUnits(Length(IntToStr(rLast)) + 2, suChars, suPoints); end else begin - w := FWorksheet.ReadDefaultColWidth(suPoints); - col := FWorksheet.FindCol(AColIndex); + w := sheet.ReadDefaultColWidth(suPoints); + col := sheet.FindCol(AColIndex); if (col <> nil) and (col^.Width > 0) then - w := FWorkbook.ConvertUnits(col^.Width, FWorkbook.Units, suPoints); + w := (FWorkbook as TsWorkbook).ConvertUnits(col^.Width, FWorkbook.Units, suPoints); end; Result:= Format(' width="%.1fpt"', [w], FPointSeparatorSettings); end; @@ -1342,7 +1351,7 @@ function TsHTMLWriter.GetFontAsStyle(AFontIndex: Integer): String; var font: TsFont; begin - font := FWorkbook.GetFont(AFontIndex); + font := (FWorkbook as TsWorkbook).GetFont(AFontIndex); Result := Format('font-family:''%s'';font-size:%.1fpt;color:%s;', [ font.FontName, font.Size, ColorToHTMLColorStr(font.Color)], FPointSeparatorSettings); if fssBold in font.Style then @@ -1381,7 +1390,7 @@ var r1, r2, c1, c2: Cardinal; begin Result := ''; - FWorksheet.FindMergedRange(AMergeBase, r1, c1, r2, c2); + (FWorksheet as TsWorksheet).FindMergedRange(AMergeBase, r1, c1, r2, c2); if c1 <> c2 then Result := Result + ' colspan="' + IntToStr(c2-c1+1) + '"'; if r1 <> r2 then @@ -1393,11 +1402,11 @@ var h: Single; row: PRow; begin - h := FWorksheet.ReadDefaultRowHeight(suPoints); - row := FWorksheet.FindRow(ARowIndex); + h := (FWorksheet as TsWorksheet).ReadDefaultRowHeight(suPoints); + row := (FWorksheet as TsWorksheet).FindRow(ARowIndex); if row <> nil then begin if row^.RowHeightType = rhtCustom then - h := abs(FWorkbook.ConvertUnits(row^.Height, FWorkbook.Units, suPoints)); + h := abs((FWorkbook as TsWorkbook).ConvertUnits(row^.Height, FWorkbook.Units, suPoints)); end; Result := Format(' height="%.1fpt"', [h], FPointSeparatorSettings); end; @@ -1441,7 +1450,7 @@ end; procedure TsHTMLWriter.InternalWriteToStream(AStream: TStream); begin - FWorkbook.UpdateCaches; + (FWorkbook as TsWorkbook).UpdateCaches; AppendToStream(AStream, ''); @@ -1472,9 +1481,9 @@ begin if ACell = nil then exit; - for i:=0 to FWorkbook.GetWorksheetCount-1 do + for i:=0 to (FWorkbook as TsWorkbook).GetWorksheetCount-1 do begin - sheet := FWorkbook.GetWorksheetByIndex(i); + sheet := (FWorkbook as TsWorkbook).GetWorksheetByIndex(i); for hyperlink in sheet.Hyperlinks do begin SplitHyperlink(hyperlink^.Target, target, ABookmark); @@ -1503,20 +1512,23 @@ end; procedure TsHTMLWriter.WriteBody(AStream: TStream); var i: Integer; + book: TsWorkbook; begin + book := FWorkbook as TsWorkbook; + AppendToStream(AStream, ''); if FWindowsClipboardMode or (HTMLParams.SheetIndex < 0) then // active sheet begin - if FWorkbook.ActiveWorksheet = nil then - FWorkbook.SelectWorksheet(FWorkbook.GetWorksheetByIndex(0)); - WriteWorksheet(AStream, FWorkbook.ActiveWorksheet) + if book.ActiveWorksheet = nil then + book.SelectWorksheet(book.GetWorksheetByIndex(0)); + WriteWorksheet(AStream, book.ActiveWorksheet) end else if HTMLParams.SheetIndex = MaxInt then // all sheets - for i:=0 to FWorkbook.GetWorksheetCount-1 do - WriteWorksheet(AStream, FWorkbook.GetWorksheetByIndex(i)) + for i:=0 to book.GetWorksheetCount-1 do + WriteWorksheet(AStream, book.GetWorksheetByIndex(i)) else // specific sheet - WriteWorksheet(AStream, FWorkbook.GetWorksheetbyIndex(HTMLParams.SheetIndex)); + WriteWorksheet(AStream, book.GetWorksheetbyIndex(HTMLParams.SheetIndex)); AppendToStream(AStream, ''); end; @@ -1538,7 +1550,7 @@ var s: String; begin Unused(AValue, ACol, ARow); - s := FWorksheet.ReadAsText(ACell); + s := (FWorksheet as TsWorksheet).ReadAsText(ACell); AppendToStream(AStream, '
' + s + '
'); end; @@ -1549,7 +1561,7 @@ var s: String; begin Unused(AValue, ACol, ARow); - s := FWOrksheet.ReadAsText(ACell); + s := (FWorksheet as TsWorksheet).ReadAsText(ACell); AppendToStream(AStream, '
' + s + '
'); end; @@ -1593,13 +1605,13 @@ begin exit; style := ''; - cellfnt := FWorksheet.ReadCellFont(ACell); + cellfnt := (FWorksheet as TsWorksheet).ReadCellFont(ACell); // Hyperlink target := ''; if FWorksheet.HasHyperlink(ACell) then begin - hyperlink := FWorksheet.FindHyperlink(ACell); + hyperlink := (FWorksheet as TsWorksheet).FindHyperlink(ACell); SplitHyperlink(hyperlink^.Target, target, bookmark); n := Length(hyperlink^.Target); @@ -1657,7 +1669,7 @@ begin begin // formatted section rtParam := ACell^.RichTextParams[i]; - fnt := FWorkbook.GetFont(rtParam.FontIndex); + fnt := (FWorkbook as TsWorkbook).GetFont(rtParam.FontIndex); style := GetFontAsStyle(rtParam.FontIndex); if style <> '' then style := ' style="' + style +'"'; @@ -1684,7 +1696,7 @@ var s: String; begin Unused(ARow, ACol, AValue); - s := FWorksheet.ReadAsText(ACell, FWorkbook.FormatSettings); + s := (FWorksheet as TsWorksheet).ReadAsText(ACell, FWorkbook.FormatSettings); AppendToStream(AStream, '
' + s + '
'); end; @@ -1697,8 +1709,8 @@ var begin AppendToStream(AStream, '