home *** CD-ROM | disk | FTP | other *** search
Wrap
unit XLSAdapter; //Note: Excel uses 1-Based arrays, and that's the interface we present to our users. // but, TExcelWorkbook uses 0-Based arrays, to be consistent with the file format (made in C) //So here we have to add and substract 1 everywere to be consistent. interface uses SysUtils, Classes, UExcelAdapter, XlsBaseTemplateStore, UFlxMessages, UExcelRecords, XlsMessages, UFlxRowComments, {$IFDEF WIN32}WOLE2Stream,{$ENDIF} {$IFDEF LINUX}KGsfStream,{$ENDIF} {$IFDEF ConditionalExpressions}{$if CompilerVersion >= 14} variants,{$IFEND}{$ENDIF} //Delphi 6 or above UXlsSheet, UFlxFormats, UXlsXF; type TXLSAdapter = class(TExcelAdapter) private FTemplateStore: TXlsBaseTemplateStore; procedure SetTemplateStore(const Value: TXLSBaseTemplateStore); { Private declarations } protected { Protected declarations } public constructor Create(AOwner:TComponent);override; function GetWorkbook: TExcelFile;override; { Public declarations } published property TemplateStore: TXLSBaseTemplateStore read FTemplateStore write SetTemplateStore; { Published declarations } end; TXLSFile = class(TExcelFile) private FAdapter: TXLSAdapter; FActiveSheet: integer; FWorkbook: TWorkbook; FTemplate: TXlsStorageList; FTmpTemplate: TXlsStorageList; FirstColumn,LastColumn: integer; RowPictures: TRowComments; procedure ParsePictures; protected function GetActiveSheet: integer; override; procedure SetActiveSheet(const Value: integer); override; function GetActiveSheetName: WideString; override; procedure SetActiveSheetName(const Value: WideString); override; function GetColumnWidth(aCol: integer): integer;override; function GetRowHeight(aRow: integer): integer;override; procedure SetColumnWidth(aCol: integer; const Value: integer);override; procedure SetRowHeight(aRow: integer; const Value: integer);override; function GetDefaultColWidth: integer;override; function GetDefaultRowHeight: integer;override; function GetCommentsCount(Row: integer): integer; override; function GetCommentText(Row, aPos: integer): widestring; override; function GetPictureName(Row, aPos: integer): widestring; override; //use row < 0 to return all function GetPicturesCount(Row: integer): integer; override; //use row < 0 to return all function GetCellValue(aRow, aCol: integer): Variant; override; procedure SetCellValue(aRow, aCol: integer; const Value: Variant); override; function GetCellValueX(aRow, aCol: integer): TXlsCellValue; override; procedure SetCellValueX(aRow, aCol: integer; const Value: TXlsCellValue); override; function GetAutoRowHeight(Row: integer): boolean;override; procedure SetAutoRowHeight(Row: integer; const Value: boolean);override; function GetColumnFormat(aColumn: integer): integer; override; function GetRowFormat(aRow: integer): integer;override; procedure SetColumnFormat(aColumn: integer; const Value: integer);override; procedure SetRowFormat(aRow: integer; const Value: integer);override; function GetColorPalette(Index: TColorPaletteRange): LongWord; override; procedure SetColorPalette(Index: TColorPaletteRange; const Value: LongWord); override; function GetFormatList(index: integer): TFlxFormat; override; function GetShowGridLines: boolean; override; procedure SetShowGridLines(const Value: boolean); override; function GetCellMergedBounds(aRow, aCol: integer): TXlsCellRange; override; public constructor Create(const aAdapter: TXLSAdapter ); destructor Destroy; override; procedure Connect;override; procedure Disconnect;override; procedure OpenFile(const FileName: TFileName);override; procedure CloseFile; override; procedure InsertAndCopySheets (const CopyFrom, InsertBefore, SheetCount: integer);override; function SheetCount: integer;override; procedure SelectSheet(const SheetNo:integer); override; procedure DeleteMarkedRows(const Mark: widestring);override; procedure RefreshChartRanges(const VarStr: string);override; procedure MakePageBreaks(const Mark: widestring);override; procedure RefreshPivotTables;override; procedure Save(const AutoClose: boolean; const FileName: string; const OnGetFileName: TOnGetFileNameEvent);override; procedure InsertAndCopyRows(const FirstRow, LastRow, DestRow, aCount: integer; const OnlyFormulas: boolean);override; procedure DeleteRows(const aRow, aCount: integer);override; procedure BeginSheet;override; procedure EndSheet(const RowOffset: integer);override; function CanOptimizeRead: boolean; override; function GetExcelNameCount: integer; override; function GetRangeName(index: integer): widestring; override; function GetRangeR1(index: integer): integer; override; function GetRangeR2(index: integer): integer; override; function GetRangeC1(index: integer): integer; override; function GetRangeC2(index: integer): integer; override; function GetRangeSheet(index: integer): integer; override; procedure AssignPicture(const Row, aPos: integer; const Pic: string; const PicType: TXlsImgTypes); override; //use row < 0 to return all procedure GetPicture(const Row, aPos: integer; const Pic: TStream; var PicType: TXlsImgTypes; var Anchor: TClientAnchor); override; //use row < 0 to return all procedure AssignComment(const Row, aPos: integer; const Comment: widestring); override; function CellCount(const aRow: integer): integer;override; function GetCellData(const aRow, aColOffset: integer): variant;override; function GetCellDataX(const aRow, aColOffset: integer): TXlsCellValue;override; procedure AssignCellData(const aRow, aColOffset: integer; const Value: variant);override; procedure AssignCellDataX(const aRow, aColOffset: integer; const Value: TXlsCellValue);override; function MaxRow: integer; override; function MaxCol: integer; override; function IsEmptyRow(const aRow: integer): boolean; override; function ColByIndex(const Row, ColIndex: integer): integer;override; function ColIndexCount(const Row: integer): integer; override; function ColIndex(const Row, Col: integer): integer;override; procedure SetBounds(const aRangePos: integer);override; function GetFirstColumn: integer; override; procedure PrepareBlockData(const R1,C1,R2,C2: integer);override; procedure AssignBlockData(const Row,Col: integer; const v: variant);override; procedure PasteBlockData;override; function IsWorksheet(const index: integer): boolean; override; function FormatListCount: integer;override; end; procedure Register; implementation {$R IXLSAdapter.res} procedure Register; begin RegisterComponents('FlexCel', [TXLSAdapter]); end; { TXLSAdapter } constructor TXLSAdapter.Create(AOwner: TComponent); begin inherited; end; function TXLSAdapter.GetWorkbook: TExcelFile; begin Result:= TXLSFile.Create(Self); end; procedure TXLSAdapter.SetTemplateStore(const Value: TXLSBaseTemplateStore); begin FTemplateStore := Value; end; { TXLSFile } procedure TXLSFile.AssignCellData(const aRow, aColOffset: integer; const Value: variant); var V: TXlsCellValue; begin if not FWorkbook.IsWorkSheet(FActiveSheet-1) then exit; V.Value:=Value; V.XF:=-1; FWorkbook.WorkSheets[FActiveSheet-1].Cells.CellList.Value[aRow-1, FirstColumn + aColOffset]:=V; end; procedure TXLSFile.AssignCellDataX(const aRow, aColOffset: integer; const Value: TXlsCellValue); begin if not FWorkbook.IsWorkSheet(FActiveSheet-1) then exit; FWorkbook.WorkSheets[FActiveSheet-1].Cells.CellList.Value[aRow-1, FirstColumn + aColOffset]:=Value; end; procedure TXLSFile.AssignComment(const Row, aPos: integer; const Comment: widestring); begin if FWorkbook.IsWorkSheet(ActiveSheet-1) then begin if Comment='' then FWorkbook.WorkSheets[ActiveSheet-1].Notes[Row-1].Delete(aPos) else FWorkbook.WorkSheets[ActiveSheet-1].Notes[Row-1][aPos].Text:= Comment; end; end; procedure TXLSFile.AssignPicture(const Row, aPos: integer; const Pic: string; const PicType: TXlsImgTypes); var MyPos: integer; begin if Row>0 then MyPos:=RowPictures[Row][aPos] else MyPos:=aPos; if FWorkbook.IsWorkSheet(ActiveSheet-1) then FWorkbook.WorkSheets[ActiveSheet-1].AssignDrawing(MyPos, Pic, PicType); end; procedure TXLSFile.GetPicture(const Row, aPos: integer; const Pic: TStream; var PicType: TXlsImgTypes; var Anchor: TClientAnchor); var MyPos: integer; begin if Row>0 then MyPos:=RowPictures[Row][aPos] else MyPos:=aPos; if FWorkbook.IsWorkSheet(ActiveSheet-1) then begin FWorkbook.WorkSheets[ActiveSheet-1].GetDrawingFromStream(MyPos, Pic, PicType); Anchor:=FWorkbook.WorkSheets[ActiveSheet-1].GetAnchor(MyPos); inc(Anchor.Col1); inc(Anchor.Col2); inc(Anchor.Row1); inc(Anchor.Row2); end; end; procedure TXLSFile.ParsePictures; var i:integer; begin FreeAndNil(RowPictures); RowPictures:= TRowComments.Create; if FWorkbook.IsWorkSheet(ActiveSheet-1) then for i:=0 to FWorkbook.WorkSheets[ActiveSheet-1].DrawingCount-1 do RowPictures.Add(FWorkbook.WorkSheets[ActiveSheet-1].DrawingRow[i]+1, i); end; procedure TXLSFile.BeginSheet; begin ParsePictures; end; function TXLSFile.CellCount(const aRow: integer): integer; begin if not FWorkbook.IsWorkSheet(FActiveSheet-1) then begin; Result:=0; exit; end; if aRow-1<FWorkbook.WorkSheets[FActiveSheet-1].Cells.CellList.Count then Result:=LastColumn-FirstColumn+1 else Result:=0; end; procedure TXLSFile.CloseFile; begin //Nothing end; procedure TXLSFile.Connect; begin FWorkbook:= TWorkbook.Create; end; constructor TXLSFile.Create(const aAdapter: TXLSAdapter); begin inherited Create; FAdapter:= aAdapter; end; procedure TXLSFile.DeleteMarkedRows(const Mark: widestring); var i:integer; s: widestring; begin if not FWorkbook.IsWorkSheet(FActiveSheet-1) then exit; for i:=FWorkbook.WorkSheets[FActiveSheet-1].Cells.CellList.Count -1 downto 0 do try s:= FWorkbook.WorkSheets[FActiveSheet-1].Cells.CellList.Value[i,0].Value; if (s=Mark) then FWorkbook.DeleteRows(FActiveSheet-1, i, 1); except //nothing end;//except end; procedure TXLSFile.MakePageBreaks(const Mark: widestring); var i:integer; s: widestring; V: TXlsCellValue; begin if not FWorkbook.IsWorkSheet(FActiveSheet-1) then exit; V.Value:=Unassigned; V.XF:=-1; for i:=FWorkbook.WorkSheets[FActiveSheet-1].Cells.CellList.Count -1 downto 0 do try s:= FWorkbook.WorkSheets[FActiveSheet-1].Cells.CellList.Value[i,0].Value; if (s=Mark) then begin FWorkbook.InsertPageBreak(FActiveSheet-1, i); FWorkbook.WorkSheets[FActiveSheet-1].Cells.CellList.Value[i,0]:=V; end; except //nothing end;//except end; procedure TXLSFile.DeleteRows(const aRow, aCount: integer); begin FWorkbook.DeleteRows(FActiveSheet-1, aRow-1, aCount); end; destructor TXLSFile.Destroy; begin FreeAndNil(RowPictures); FreeAndNil(FTmpTemplate); inherited; end; procedure TXLSFile.Disconnect; begin FreeAndNil(FWorkbook); end; procedure TXLSFile.EndSheet(const RowOffset: integer); begin //Nothing end; function TXLSFile.GetActiveSheet: integer; begin Result:= FActiveSheet; end; function TXLSFile.GetActiveSheetName: WideString; begin Result:= FWorkbook.Globals.SheetName[FActiveSheet-1]; end; function TXLSFile.GetCellData(const aRow, aColOffset: integer): variant; begin if not FWorkbook.IsWorkSheet(FActiveSheet-1) then begin; Result:=unassigned; exit; end; Result:=FWorkbook.WorkSheets[FActiveSheet-1].Cells.CellList.Value[aRow-1,FirstColumn+aColOffset].Value; end; function TXLSFile.GetCellDataX(const aRow, aColOffset: integer): TXlsCellValue; begin if not FWorkbook.IsWorkSheet(FActiveSheet-1) then begin; Result.Value:=unassigned; Result.XF:=-1; exit; end; Result:=FWorkbook.WorkSheets[FActiveSheet-1].Cells.CellList.Value[aRow-1,FirstColumn+aColOffset]; end; function TXLSFile.GetCommentsCount(Row: integer): integer; begin if FWorkbook.IsWorkSheet(ActiveSheet-1) then if Row-1<FWorkbook.WorkSheets[ActiveSheet-1].Notes.Count then Result:=FWorkbook.WorkSheets[ActiveSheet-1].Notes[Row-1].Count else Result:=0 else Result:=0; end; function TXLSFile.GetCommentText(Row, aPos: integer): widestring; begin if FWorkbook.IsWorkSheet(ActiveSheet-1) then Result:=FWorkbook.WorkSheets[ActiveSheet-1].Notes[Row-1][aPos].Text else Result:=''; end; function TXLSFile.GetExcelNameCount: integer; begin Result:=FWorkbook.Globals.Names.Count; end; function TXLSFile.GetPictureName(Row, aPos: integer): widestring; var MyPos: integer; begin if Row>0 then MyPos:=RowPictures[Row][aPos] else MyPos:=aPos; Result:= ''; if not FWorkbook.IsWorksheet(FActiveSheet-1) then exit; Result:=FWorkbook.WorkSheets[FActiveSheet-1].DrawingName[MyPos]; end; function TXLSFile.GetPicturesCount(Row: integer): integer; begin Result:=0; if not FWorkbook.IsWorksheet(FActiveSheet-1) then exit; if Row>0 then Result:=RowPictures[Row].Count else Result:= FWorkbook.WorkSheets[ActiveSheet-1].DrawingCount; end; function TXLSFile.GetRangeName(index: integer): widestring; begin Result:= FWorkbook.Globals.Names[index-1].Name; end; function TXLSFile.GetRangeR1(index: integer): integer; begin Result:= FWorkbook.Globals.Names[index-1].R1+1; end; function TXLSFile.GetRangeR2(index: integer): integer; begin Result:= FWorkbook.Globals.Names[index-1].R2+1; end; function TXLSFile.GetRangeC1(index: integer): integer; begin Result:= FWorkbook.Globals.Names[index-1].C1+1; end; function TXLSFile.GetRangeC2(index: integer): integer; begin Result:= FWorkbook.Globals.Names[index-1].C2+1; end; function TXLSFile.GetRangeSheet(index: integer): integer; begin Result:= FWorkbook.Globals.Names[index-1].RefersToSheet(FWorkbook.Globals.References.GetSheet)+1; end; procedure TXLSFile.InsertAndCopyRows(const FirstRow, LastRow, DestRow, aCount: integer; const OnlyFormulas: boolean); begin FWorkbook.InsertAndCopyRows(FActiveSheet-1, FirstRow-1, LastRow-1, DestRow-1, aCount, OnlyFormulas) end; procedure TXLSFile.InsertAndCopySheets(const CopyFrom, InsertBefore, SheetCount: integer); begin FWorkbook.InsertSheets(CopyFrom-1, InsertBefore-1, SheetCount); end; procedure TXLSFile.OpenFile(const FileName: TFileName); var WorkbookStr: widestring; begin WorkbookStr:=WorkbookStrS; FTemplate:=nil; FreeAndNil(FTmpTemplate); if FAdapter.TemplateStore<>nil then FTemplate:=FAdapter.TemplateStore.Storages[FileName] else begin FTmpTemplate:=TXlsStorageList.Create; FTmpTemplate.LoadFrom(SearchPathStr(FileName)); FTemplate:=FTmpTemplate; end; FWorkbook.LoadFromStream(FTemplate.Stream[WorkbookStr]); FActiveSheet:=FWorkbook.ActiveSheet+1; end; procedure TXLSFile.RefreshPivotTables; begin //Nothing end; procedure TXLSFile.Save(const AutoClose: boolean; const FileName: string; const OnGetFileName: TOnGetFileNameEvent); var aFileName: TFileName; OutputFileName: WideString; WorkbookStr: widestring; i:integer; DocOUT: TOle2Storage; StreamOUT: TOle2Stream; begin WorkbookStr:=WorkbookStrS; aFileName:=Filename; if Assigned (OnGetFileName) then OnGetFileName(Self,0,aFilename); OutputFileName:= aFileName; if FileExists(FileName) then raise Exception.CreateFmt(ErrCantWriteToFile, [FileName]); //this is to avoid a criptic ole xxxx error... //Create output file DocOUT:= TOle2Storage.Create(OutputFileName, Ole2_Write); try for i:=0 to FTemplate.Count-1 do if FTemplate[i].Name<>WorkbookStr then begin FTemplate[i].SaveToDoc(DocOUT); end; StreamOUT:= TOle2Stream.Create(DocOUT, WorkbookStr); try FWorkbook.SaveToStream(StreamOUT); finally FreeAndNil(StreamOut); end; //finally finally FreeAndNil(DocOUT); end; //Finally end; procedure TXLSFile.SelectSheet(const SheetNo:integer); begin FWorkbook.ActiveSheet:=SheetNo-1; end; procedure TXLSFile.SetActiveSheet(const Value: integer); begin FActiveSheet:=Value; end; procedure TXLSFile.SetActiveSheetName(const Value: WideString); begin FWorkbook.Globals.SheetName[FActiveSheet-1]:= Value; end; procedure TXLSFile.SetBounds(const aRangePos: integer); begin FirstColumn:=FWorkbook.Globals.Names[aRangePos-1].C1; LastColumn:=FWorkbook.Globals.Names[aRangePos-1].C2; end; function TXLSFile.SheetCount: integer; begin Result:=FWorkbook.Globals.SheetCount; end; procedure TXLSFile.AssignBlockData(const Row, Col: integer; const v: variant); begin AssignCellData(Row, Col, v); end; procedure TXLSFile.PasteBlockData; begin // Nothing end; procedure TXLSFile.PrepareBlockData(const R1, C1, R2, C2: integer); begin // Nothing end; function TXLSFile.MaxRow: integer; begin if not FWorkbook.IsWorkSheet(FActiveSheet-1) then begin; Result:=0;exit;end; Result:= FWorkbook.WorkSheets[FActiveSheet-1].Cells.RowList.Count; end; function TXLSFile.MaxCol: integer; var i: integer; begin Result:=0; if not FWorkbook.IsWorkSheet(FActiveSheet-1) then exit; for i:=0 to FWorkbook.WorkSheets[FActiveSheet-1].Cells.CellList.Count-1 do if FWorkbook.WorkSheets[FActiveSheet-1].Cells.CellList.MaxCol[i]+1> Result then Result:= FWorkbook.WorkSheets[FActiveSheet-1].Cells.CellList.MaxCol[i]+1; end; function TXLSFile.GetCellValue(aRow, aCol: integer): Variant; begin Result:= GetCellData(aRow, aCol-FirstColumn-1); end; procedure TXLSFile.SetCellValue(aRow, aCol: integer; const Value: Variant); begin AssignCellData(aRow, aCol-FirstColumn-1, Value); end; function TXLSFile.IsEmptyRow(const aRow: integer): boolean; begin if not FWorkbook.IsWorkSheet(FActiveSheet-1) then begin; Result:=true;exit;end; Result:= (aRow-1<0) or (aRow-1>= FWorkbook.WorkSheets[FActiveSheet-1].Cells.CellList.Count) or not FWorkbook.WorkSheets[FActiveSheet-1].Cells.RowList.HasRow(aRow-1); end; function TXLSFile.CanOptimizeRead: boolean; begin Result:=true; end; procedure TXLSFile.RefreshChartRanges(const VarStr: string); begin //not implemented end; function TXLSFile.IsWorksheet(const index: integer): boolean; begin Result:= FWorkbook.Sheets[index-1] is TWorkSheet; end; function TXLSFile.GetColumnWidth(aCol: integer): integer; begin if not FWorkbook.IsWorkSheet(FActiveSheet-1) then begin; Result:=0;exit;end; Result:= FWorkbook.WorkSheets[FActiveSheet-1].GetColWidth(aCol-1); end; function TXLSFile.GetRowHeight(aRow: integer): integer; begin if not FWorkbook.IsWorkSheet(FActiveSheet-1) then begin; Result:=0;exit;end; Result:= FWorkbook.WorkSheets[FActiveSheet-1].GetRowHeight(aRow-1); end; procedure TXLSFile.SetColumnWidth(aCol: integer; const Value: integer); begin if not FWorkbook.IsWorkSheet(FActiveSheet-1) then exit; FWorkbook.WorkSheets[FActiveSheet-1].SetColWidth(aCol-1, Value); end; procedure TXLSFile.SetRowHeight(aRow: integer; const Value: integer); begin if not FWorkbook.IsWorkSheet(FActiveSheet-1) then exit; FWorkbook.WorkSheets[FActiveSheet-1].SetRowHeight(aRow-1, Value); end; function TXLSFile.GetFirstColumn: integer; begin Result:=FirstColumn+1; end; function TXLSFile.GetCellValueX(aRow, aCol: integer): TXlsCellValue; begin Result:= GetCellDataX(aRow, aCol-FirstColumn-1); end; procedure TXLSFile.SetCellValueX(aRow, aCol: integer; const Value: TXlsCellValue); begin AssignCellDataX(aRow, aCol-FirstColumn-1, Value); end; function TXLSFile.GetAutoRowHeight(Row: integer): boolean; begin Result:=true; if not FWorkbook.IsWorkSheet(FActiveSheet-1) then exit; Result:=FWorkbook.WorkSheets[FActiveSheet-1].Cells.RowList.IsAutoRowHeight(Row-1); end; procedure TXLSFile.SetAutoRowHeight(Row: integer; const Value: boolean); begin if not FWorkbook.IsWorkSheet(FActiveSheet-1) then exit; FWorkbook.WorkSheets[FActiveSheet-1].Cells.RowList.AutoRowHeight(Row-1, Value); end; function TXLSFile.GetColorPalette(Index: TColorPaletteRange): LongWord; begin Result:=FWorkbook.Globals.ColorPalette[Index-1]; end; procedure TXLSFile.SetColorPalette(Index: TColorPaletteRange; const Value: LongWord); begin FWorkbook.Globals.ColorPalette[Index-1]:=Value; end; function TXLSFile.GetColumnFormat(aColumn: integer): integer; begin Result:=0; if not FWorkbook.IsWorkSheet(FActiveSheet-1) then exit; Result:=FWorkbook.WorkSheets[FActiveSheet-1].GetColFormat(aColumn-1); end; function TXLSFile.GetRowFormat(aRow: integer): integer; begin Result:=0; if not FWorkbook.IsWorkSheet(FActiveSheet-1) then exit; Result:=FWorkbook.WorkSheets[FActiveSheet-1].GetRowFormat(aRow-1); end; procedure TXLSFile.SetColumnFormat(aColumn: integer; const Value: integer); begin if not FWorkbook.IsWorkSheet(FActiveSheet-1) then exit; FWorkbook.WorkSheets[FActiveSheet-1].SetColFormat(aColumn-1, Value); end; procedure TXLSFile.SetRowFormat(aRow: integer; const Value: integer); begin if not FWorkbook.IsWorkSheet(FActiveSheet-1) then exit; FWorkbook.WorkSheets[FActiveSheet-1].SetRowFormat(aRow-1, Value); end; function TXLSFile.FormatListCount: integer; begin Result:=FWorkbook.Globals.XF.Count; end; function TXLSFile.GetFormatList(index: integer): TFlxFormat; var XF: TXFRecord; Font: TFontRecord; FontIndex:integer; FormatIndex: integer; begin XF:=FWorkbook.Globals.XF[index]; FontIndex:=XF.FontIndex; if FontIndex>4 then Dec(FontIndex); //Font number 4 does not exists if (FontIndex<0) or (FontIndex>=FWorkbook.Globals.Fonts.Count) then FontIndex:=0; Font:= FWorkbook.Globals.Fonts[FontIndex]; Result.Font.Name:= Font.Name; Result.Font.Size20:= Font.Height; Result.Font.ColorIndex:= Font.ColorIndex+1; Result.Font.Style:= Font.Style; Result.Font.Underline:= Font.Underline; Result.Borders.Left.Style:= XF.GetBorderStyle(10,0); Result.Borders.Right.Style:= XF.GetBorderStyle(10,4); Result.Borders.Top.Style:= XF.GetBorderStyle(11,0); Result.Borders.Bottom.Style:= XF.GetBorderStyle(11,4); Result.Borders.Left.ColorIndex:= XF.GetBorderColorIndex(12,0); Result.Borders.Right.ColorIndex:= XF.GetBorderColorIndex(12,7); Result.Borders.Top.ColorIndex:= XF.GetBorderColorIndex(14,0); Result.Borders.Bottom.ColorIndex:= XF.GetBorderColorIndex(14,7); Result.Borders.Diagonal.Style:=XF.GetBorderStyleExt(14,21); Result.Borders.Diagonal.ColorIndex:=XF.GetBorderColorIndexExt(14,14); Result.Borders.DiagonalStyle:=XF.DiagonalStyle; FormatIndex:=XF.FormatIndex; Result.Format:= FWorkbook.Globals.Formats[FormatIndex]; Result.FillPattern.Pattern:=XF.CellPattern+1; Result.FillPattern.FgColorIndex:=XF.CellFgColorIndex+1; Result.FillPattern.BgColorIndex:=XF.CellBgColorIndex+1; Result.HAlignment:=XF.HAlign; Result.VAlignment:=XF.VAlign; XF.FillMisc(Result.Locked, Result.Hidden, Result.Parent, Result.WrapText, Result.ShrinkToFit, Result.Rotation, Result.Indent); //all togheter, to sve some function calls... end; function TXLSFile.ColByIndex(const Row, ColIndex: integer): integer; begin Result:=0; if not FWorkbook.IsWorkSheet(FActiveSheet-1) then exit; if IsEmptyRow(Row) then exit; if (ColIndex<=0) or (ColIndex>FWorkbook.WorkSheets[FActiveSheet-1].Cells.CellList[Row-1].Count) then exit; Result:= FWorkbook.WorkSheets[FActiveSheet-1].Cells.CellList[Row-1][ColIndex-1].Column+1; end; function TXLSFile.ColIndexCount(const Row: integer): integer; begin Result:=0; if not FWorkbook.IsWorkSheet(FActiveSheet-1) then exit; if IsEmptyRow(Row) then exit; Result:= FWorkbook.WorkSheets[FActiveSheet-1].Cells.CellList[Row-1].Count; end; function TXLSFile.ColIndex(const Row, Col: integer): integer; begin Result:=0; if not FWorkbook.IsWorkSheet(FActiveSheet-1) then exit; if IsEmptyRow(Row) then exit; FWorkbook.WorkSheets[FActiveSheet-1].Cells.CellList[Row-1].Find(Col, Result); inc(Result); end; function TXLSFile.GetDefaultColWidth: integer; begin Result:=$A; if not FWorkbook.IsWorkSheet(FActiveSheet-1) then exit; Result:=FWorkbook.WorkSheets[FActiveSheet-1].DefColWidth; end; function TXLSFile.GetDefaultRowHeight: integer; begin Result:=$FF; if not FWorkbook.IsWorkSheet(FActiveSheet-1) then exit; Result:=FWorkbook.WorkSheets[FActiveSheet-1].DefRowHeight; end; function TXLSFile.GetShowGridLines: boolean; begin Result:=true; if not FWorkbook.IsWorkSheet(FActiveSheet-1) then exit; Result:=FWorkbook.WorkSheets[FActiveSheet-1].ShowGridLines; end; procedure TXLSFile.SetShowGridLines(const Value: boolean); begin if not FWorkbook.IsWorkSheet(FActiveSheet-1) then exit; FWorkbook.WorkSheets[FActiveSheet-1].ShowGridLines:=value; end; function TXLSFile.GetCellMergedBounds(aRow, aCol: integer): TXlsCellRange; begin if not FWorkbook.IsWorkSheet(FActiveSheet-1) then exit; Result:=FWorkbook.WorkSheets[FActiveSheet-1].CellMergedBounds(aRow-1, aCol-1); inc(Result.Left); inc(Result.Top); inc(Result.Right); inc(Result.Bottom); end; end.