home *** CD-ROM | disk | FTP | other *** search
/ Chip 2003 January / Chip_2003-01_cd1.bin / zkuste / delphi / kolekce / d567 / FLEXCEL.ZIP / XLSAdapter / XLSAdapter.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  2002-10-10  |  25.2 KB  |  818 lines

  1. unit XLSAdapter;
  2.  
  3. //Note: Excel uses 1-Based arrays, and that's the interface we present to our users.
  4. // but, TExcelWorkbook uses 0-Based arrays, to be consistent with the file format (made in C)
  5. //So here we have to add and substract 1 everywere to be consistent.
  6.  
  7. interface
  8.  
  9. uses
  10.   SysUtils, Classes,
  11.   UExcelAdapter, XlsBaseTemplateStore, UFlxMessages, UExcelRecords, XlsMessages,
  12.   UFlxRowComments,
  13.   {$IFDEF WIN32}WOLE2Stream,{$ENDIF}
  14.   {$IFDEF LINUX}KGsfStream,{$ENDIF}
  15.  
  16.   {$IFDEF ConditionalExpressions}{$if CompilerVersion >= 14} variants,{$IFEND}{$ENDIF} //Delphi 6 or above
  17.   UXlsSheet, UFlxFormats, UXlsXF;
  18.  
  19. type
  20.   TXLSAdapter = class(TExcelAdapter)
  21.   private
  22.     FTemplateStore: TXlsBaseTemplateStore;
  23.     procedure SetTemplateStore(const Value: TXLSBaseTemplateStore);
  24.     { Private declarations }
  25.   protected
  26.     { Protected declarations }
  27.   public
  28.     constructor Create(AOwner:TComponent);override;
  29.     function GetWorkbook: TExcelFile;override;
  30.     { Public declarations }
  31.   published
  32.     property TemplateStore: TXLSBaseTemplateStore read FTemplateStore write SetTemplateStore;
  33.     { Published declarations }
  34.   end;
  35.  
  36.   TXLSFile = class(TExcelFile)
  37.   private
  38.     FAdapter: TXLSAdapter;
  39.     FActiveSheet: integer;
  40.  
  41.     FWorkbook: TWorkbook;
  42.     FTemplate: TXlsStorageList;
  43.     FTmpTemplate: TXlsStorageList;
  44.  
  45.     FirstColumn,LastColumn: integer;
  46.  
  47.     RowPictures: TRowComments;
  48.     procedure ParsePictures;
  49.  
  50.   protected
  51.     function GetActiveSheet: integer; override;
  52.     procedure SetActiveSheet(const Value: integer); override;
  53.     function GetActiveSheetName: WideString; override;
  54.     procedure SetActiveSheetName(const Value: WideString); override;
  55.  
  56.     function GetColumnWidth(aCol: integer): integer;override;
  57.     function GetRowHeight(aRow: integer): integer;override;
  58.     procedure SetColumnWidth(aCol: integer; const Value: integer);override;
  59.     procedure SetRowHeight(aRow: integer; const Value: integer);override;
  60.  
  61.     function GetDefaultColWidth: integer;override;
  62.     function GetDefaultRowHeight: integer;override;
  63.  
  64.     function GetCommentsCount(Row: integer): integer; override;
  65.     function GetCommentText(Row, aPos: integer): widestring; override;
  66.     function GetPictureName(Row, aPos: integer): widestring;  override; //use row < 0 to return all
  67.     function GetPicturesCount(Row: integer): integer;  override; //use row < 0 to return all
  68.  
  69.  
  70.     function GetCellValue(aRow, aCol: integer): Variant; override;
  71.     procedure SetCellValue(aRow, aCol: integer; const Value: Variant); override;
  72.     function GetCellValueX(aRow, aCol: integer): TXlsCellValue; override;
  73.     procedure SetCellValueX(aRow, aCol: integer; const Value: TXlsCellValue); override;
  74.  
  75.     function GetAutoRowHeight(Row: integer): boolean;override;
  76.     procedure SetAutoRowHeight(Row: integer; const Value: boolean);override;
  77.  
  78.     function GetColumnFormat(aColumn: integer): integer; override;
  79.     function GetRowFormat(aRow: integer): integer;override;
  80.     procedure SetColumnFormat(aColumn: integer; const Value: integer);override;
  81.     procedure SetRowFormat(aRow: integer; const Value: integer);override;
  82.  
  83.     function GetColorPalette(Index: TColorPaletteRange): LongWord; override;
  84.     procedure SetColorPalette(Index: TColorPaletteRange; const Value: LongWord); override;
  85.  
  86.     function GetFormatList(index: integer): TFlxFormat; override;
  87.  
  88.     function GetShowGridLines: boolean; override;
  89.     procedure SetShowGridLines(const Value: boolean); override;
  90.  
  91.     function GetCellMergedBounds(aRow, aCol: integer): TXlsCellRange; override;
  92.  
  93.   public
  94.     constructor Create(const aAdapter: TXLSAdapter );
  95.     destructor Destroy; override;
  96.  
  97.     procedure Connect;override;
  98.     procedure Disconnect;override;
  99.  
  100.     procedure OpenFile(const FileName: TFileName);override;
  101.     procedure CloseFile; override;
  102.  
  103.     procedure InsertAndCopySheets (const CopyFrom, InsertBefore, SheetCount: integer);override;
  104.     function SheetCount: integer;override;
  105.     procedure SelectSheet(const SheetNo:integer); override;
  106.  
  107.     procedure DeleteMarkedRows(const Mark: widestring);override;
  108.     procedure RefreshChartRanges(const VarStr: string);override;
  109.     procedure MakePageBreaks(const Mark: widestring);override;
  110.     procedure RefreshPivotTables;override;
  111.  
  112.     procedure Save(const AutoClose: boolean; const FileName: string; const OnGetFileName: TOnGetFileNameEvent);override;
  113.  
  114.     procedure InsertAndCopyRows(const FirstRow, LastRow, DestRow, aCount: integer; const OnlyFormulas: boolean);override;
  115.     procedure DeleteRows(const aRow, aCount: integer);override;
  116.  
  117.     procedure BeginSheet;override;
  118.     procedure EndSheet(const RowOffset: integer);override;
  119.  
  120.     function CanOptimizeRead: boolean; override;
  121.  
  122.  
  123.     function GetExcelNameCount: integer;  override;
  124.     function GetRangeName(index: integer): widestring;  override;
  125.     function GetRangeR1(index: integer): integer; override;
  126.     function GetRangeR2(index: integer): integer; override;
  127.     function GetRangeC1(index: integer): integer; override;
  128.     function GetRangeC2(index: integer): integer; override;
  129.     function GetRangeSheet(index: integer): integer; override;
  130.  
  131.     procedure AssignPicture(const Row, aPos: integer; const Pic: string; const PicType: TXlsImgTypes); override; //use row < 0 to return all
  132.     procedure GetPicture(const Row, aPos: integer; const Pic: TStream; var PicType: TXlsImgTypes; var Anchor: TClientAnchor); override; //use row < 0 to return all
  133.  
  134.     procedure AssignComment(const Row, aPos: integer; const Comment: widestring); override;
  135.  
  136.     function CellCount(const aRow: integer): integer;override;
  137.     function GetCellData(const aRow, aColOffset: integer): variant;override;
  138.     function GetCellDataX(const aRow, aColOffset: integer): TXlsCellValue;override;
  139.     procedure AssignCellData(const aRow, aColOffset: integer; const Value: variant);override;
  140.     procedure AssignCellDataX(const aRow, aColOffset: integer; const Value: TXlsCellValue);override;
  141.     function MaxRow: integer; override;
  142.     function MaxCol: integer; override;
  143.     function IsEmptyRow(const aRow: integer): boolean; override;
  144.  
  145.     function ColByIndex(const Row, ColIndex: integer): integer;override;
  146.     function ColIndexCount(const Row: integer): integer; override;
  147.     function ColIndex(const Row, Col: integer): integer;override;
  148.  
  149.     procedure SetBounds(const aRangePos: integer);override;
  150.     function GetFirstColumn: integer; override;
  151.  
  152.     procedure PrepareBlockData(const R1,C1,R2,C2: integer);override;
  153.     procedure AssignBlockData(const Row,Col: integer; const v: variant);override;
  154.     procedure PasteBlockData;override;
  155.  
  156.     function IsWorksheet(const index: integer): boolean; override;
  157.  
  158.     function FormatListCount: integer;override;
  159.   end;
  160.  
  161.  
  162. procedure Register;
  163.  
  164. implementation
  165. {$R IXLSAdapter.res}
  166. procedure Register;
  167. begin
  168.   RegisterComponents('FlexCel', [TXLSAdapter]);
  169. end;
  170.  
  171. { TXLSAdapter }
  172.  
  173. constructor TXLSAdapter.Create(AOwner: TComponent);
  174. begin
  175.   inherited;
  176. end;
  177.  
  178. function TXLSAdapter.GetWorkbook: TExcelFile;
  179. begin
  180.   Result:= TXLSFile.Create(Self);
  181. end;
  182.  
  183. procedure TXLSAdapter.SetTemplateStore(const Value: TXLSBaseTemplateStore);
  184. begin
  185.   FTemplateStore := Value;
  186. end;
  187.  
  188. { TXLSFile }
  189.  
  190. procedure TXLSFile.AssignCellData(const aRow, aColOffset: integer; const Value: variant);
  191. var
  192.   V: TXlsCellValue;
  193. begin
  194.   if not FWorkbook.IsWorkSheet(FActiveSheet-1) then exit;
  195.     V.Value:=Value; V.XF:=-1;
  196.     FWorkbook.WorkSheets[FActiveSheet-1].Cells.CellList.Value[aRow-1, FirstColumn + aColOffset]:=V;
  197. end;
  198.  
  199. procedure TXLSFile.AssignCellDataX(const aRow, aColOffset: integer; const Value: TXlsCellValue);
  200. begin
  201.   if not FWorkbook.IsWorkSheet(FActiveSheet-1) then exit;
  202.   FWorkbook.WorkSheets[FActiveSheet-1].Cells.CellList.Value[aRow-1, FirstColumn + aColOffset]:=Value;
  203. end;
  204.  
  205. procedure TXLSFile.AssignComment(const Row, aPos: integer;
  206.   const Comment: widestring);
  207. begin
  208.   if FWorkbook.IsWorkSheet(ActiveSheet-1) then
  209.   begin
  210.     if Comment='' then FWorkbook.WorkSheets[ActiveSheet-1].Notes[Row-1].Delete(aPos) else
  211.     FWorkbook.WorkSheets[ActiveSheet-1].Notes[Row-1][aPos].Text:= Comment;
  212.   end;
  213. end;
  214.  
  215. procedure TXLSFile.AssignPicture(const Row, aPos: integer; const Pic: string; const PicType: TXlsImgTypes);
  216. var
  217.   MyPos: integer;
  218. begin
  219.   if Row>0 then MyPos:=RowPictures[Row][aPos] else MyPos:=aPos;
  220.   if FWorkbook.IsWorkSheet(ActiveSheet-1) then
  221.     FWorkbook.WorkSheets[ActiveSheet-1].AssignDrawing(MyPos, Pic, PicType);
  222. end;
  223.  
  224. procedure TXLSFile.GetPicture(const Row, aPos: integer; const Pic: TStream;
  225.   var PicType: TXlsImgTypes; var Anchor: TClientAnchor);
  226. var
  227.   MyPos: integer;
  228. begin
  229.   if Row>0 then MyPos:=RowPictures[Row][aPos] else MyPos:=aPos;
  230.   if FWorkbook.IsWorkSheet(ActiveSheet-1) then
  231.   begin
  232.     FWorkbook.WorkSheets[ActiveSheet-1].GetDrawingFromStream(MyPos, Pic, PicType);
  233.     Anchor:=FWorkbook.WorkSheets[ActiveSheet-1].GetAnchor(MyPos);
  234.     inc(Anchor.Col1);
  235.     inc(Anchor.Col2);
  236.     inc(Anchor.Row1);
  237.     inc(Anchor.Row2);
  238.   end;
  239. end;
  240.  
  241. procedure TXLSFile.ParsePictures;
  242. var
  243.   i:integer;
  244.  
  245. begin
  246.   FreeAndNil(RowPictures);
  247.   RowPictures:= TRowComments.Create;
  248.   if FWorkbook.IsWorkSheet(ActiveSheet-1) then
  249.     for i:=0 to FWorkbook.WorkSheets[ActiveSheet-1].DrawingCount-1 do
  250.       RowPictures.Add(FWorkbook.WorkSheets[ActiveSheet-1].DrawingRow[i]+1, i);
  251. end;
  252.  
  253.  
  254. procedure TXLSFile.BeginSheet;
  255. begin
  256.   ParsePictures;
  257. end;
  258.  
  259. function TXLSFile.CellCount(const aRow: integer): integer;
  260. begin
  261.   if not FWorkbook.IsWorkSheet(FActiveSheet-1) then begin; Result:=0; exit; end;
  262.   if aRow-1<FWorkbook.WorkSheets[FActiveSheet-1].Cells.CellList.Count then
  263.     Result:=LastColumn-FirstColumn+1
  264.   else Result:=0;
  265. end;
  266.  
  267. procedure TXLSFile.CloseFile;
  268. begin
  269.   //Nothing
  270. end;
  271.  
  272. procedure TXLSFile.Connect;
  273. begin
  274.   FWorkbook:= TWorkbook.Create;
  275. end;
  276.  
  277. constructor TXLSFile.Create(const aAdapter: TXLSAdapter);
  278. begin
  279.   inherited Create;
  280.   FAdapter:= aAdapter;
  281. end;
  282.  
  283. procedure TXLSFile.DeleteMarkedRows(const Mark: widestring);
  284. var
  285.   i:integer;
  286.   s: widestring;
  287. begin
  288.   if not FWorkbook.IsWorkSheet(FActiveSheet-1) then exit;
  289.   for i:=FWorkbook.WorkSheets[FActiveSheet-1].Cells.CellList.Count -1 downto 0 do
  290.   try
  291.     s:= FWorkbook.WorkSheets[FActiveSheet-1].Cells.CellList.Value[i,0].Value;
  292.     if (s=Mark) then
  293.       FWorkbook.DeleteRows(FActiveSheet-1, i, 1);
  294.   except
  295.     //nothing
  296.   end;//except
  297. end;
  298.  
  299. procedure TXLSFile.MakePageBreaks(const Mark: widestring);
  300. var
  301.   i:integer;
  302.   s: widestring;
  303.   V: TXlsCellValue;
  304. begin
  305.   if not FWorkbook.IsWorkSheet(FActiveSheet-1) then exit;
  306.   V.Value:=Unassigned; V.XF:=-1;
  307.   for i:=FWorkbook.WorkSheets[FActiveSheet-1].Cells.CellList.Count -1 downto 0 do
  308.   try
  309.     s:= FWorkbook.WorkSheets[FActiveSheet-1].Cells.CellList.Value[i,0].Value;
  310.     if (s=Mark) then
  311.     begin
  312.       FWorkbook.InsertPageBreak(FActiveSheet-1, i);
  313.       FWorkbook.WorkSheets[FActiveSheet-1].Cells.CellList.Value[i,0]:=V;
  314.     end;
  315.   except
  316.     //nothing
  317.   end;//except
  318. end;
  319.  
  320. procedure TXLSFile.DeleteRows(const aRow, aCount: integer);
  321. begin
  322.   FWorkbook.DeleteRows(FActiveSheet-1, aRow-1, aCount);
  323. end;
  324.  
  325. destructor TXLSFile.Destroy;
  326. begin
  327.   FreeAndNil(RowPictures);
  328.   FreeAndNil(FTmpTemplate);
  329.   inherited;
  330. end;
  331.  
  332. procedure TXLSFile.Disconnect;
  333. begin
  334.   FreeAndNil(FWorkbook);
  335. end;
  336.  
  337. procedure TXLSFile.EndSheet(const RowOffset: integer);
  338. begin
  339.   //Nothing
  340. end;
  341.  
  342. function TXLSFile.GetActiveSheet: integer;
  343. begin
  344.   Result:= FActiveSheet;
  345. end;
  346.  
  347. function TXLSFile.GetActiveSheetName: WideString;
  348. begin
  349.   Result:= FWorkbook.Globals.SheetName[FActiveSheet-1];
  350. end;
  351.  
  352. function TXLSFile.GetCellData(const aRow, aColOffset: integer): variant;
  353. begin
  354.   if not FWorkbook.IsWorkSheet(FActiveSheet-1) then begin; Result:=unassigned; exit; end;
  355.   Result:=FWorkbook.WorkSheets[FActiveSheet-1].Cells.CellList.Value[aRow-1,FirstColumn+aColOffset].Value;
  356. end;
  357.  
  358. function TXLSFile.GetCellDataX(const aRow, aColOffset: integer): TXlsCellValue;
  359. begin
  360.   if not FWorkbook.IsWorkSheet(FActiveSheet-1) then begin; Result.Value:=unassigned; Result.XF:=-1; exit; end;
  361.   Result:=FWorkbook.WorkSheets[FActiveSheet-1].Cells.CellList.Value[aRow-1,FirstColumn+aColOffset];
  362. end;
  363.  
  364. function TXLSFile.GetCommentsCount(Row: integer): integer;
  365. begin
  366.   if FWorkbook.IsWorkSheet(ActiveSheet-1) then
  367.     if Row-1<FWorkbook.WorkSheets[ActiveSheet-1].Notes.Count then
  368.       Result:=FWorkbook.WorkSheets[ActiveSheet-1].Notes[Row-1].Count
  369.     else
  370.       Result:=0
  371.   else
  372.     Result:=0;
  373. end;
  374.  
  375. function TXLSFile.GetCommentText(Row, aPos: integer): widestring;
  376. begin
  377.   if FWorkbook.IsWorkSheet(ActiveSheet-1) then
  378.     Result:=FWorkbook.WorkSheets[ActiveSheet-1].Notes[Row-1][aPos].Text
  379.   else
  380.     Result:='';
  381. end;
  382.  
  383. function TXLSFile.GetExcelNameCount: integer;
  384. begin
  385.   Result:=FWorkbook.Globals.Names.Count;
  386. end;
  387.  
  388. function TXLSFile.GetPictureName(Row, aPos: integer): widestring;
  389. var
  390.   MyPos: integer;
  391. begin
  392.   if Row>0 then MyPos:=RowPictures[Row][aPos] else MyPos:=aPos;
  393.   Result:= '';
  394.   if not FWorkbook.IsWorksheet(FActiveSheet-1) then exit;
  395.   Result:=FWorkbook.WorkSheets[FActiveSheet-1].DrawingName[MyPos];
  396. end;
  397.  
  398. function TXLSFile.GetPicturesCount(Row: integer): integer;
  399. begin
  400.   Result:=0;
  401.   if not FWorkbook.IsWorksheet(FActiveSheet-1) then exit;
  402.   if Row>0 then Result:=RowPictures[Row].Count else
  403.     Result:= FWorkbook.WorkSheets[ActiveSheet-1].DrawingCount;
  404. end;
  405.  
  406. function TXLSFile.GetRangeName(index: integer): widestring;
  407. begin
  408.   Result:= FWorkbook.Globals.Names[index-1].Name;
  409. end;
  410.  
  411. function TXLSFile.GetRangeR1(index: integer): integer;
  412. begin
  413.   Result:= FWorkbook.Globals.Names[index-1].R1+1;
  414. end;
  415.  
  416. function TXLSFile.GetRangeR2(index: integer): integer;
  417. begin
  418.   Result:= FWorkbook.Globals.Names[index-1].R2+1;
  419. end;
  420.  
  421. function TXLSFile.GetRangeC1(index: integer): integer;
  422. begin
  423.   Result:= FWorkbook.Globals.Names[index-1].C1+1;
  424. end;
  425.  
  426. function TXLSFile.GetRangeC2(index: integer): integer;
  427. begin
  428.   Result:= FWorkbook.Globals.Names[index-1].C2+1;
  429. end;
  430.  
  431. function TXLSFile.GetRangeSheet(index: integer): integer;
  432. begin
  433.   Result:= FWorkbook.Globals.Names[index-1].RefersToSheet(FWorkbook.Globals.References.GetSheet)+1;
  434. end;
  435.  
  436. procedure TXLSFile.InsertAndCopyRows(const FirstRow, LastRow, DestRow,
  437.   aCount: integer; const OnlyFormulas: boolean);
  438. begin
  439.   FWorkbook.InsertAndCopyRows(FActiveSheet-1, FirstRow-1, LastRow-1, DestRow-1, aCount, OnlyFormulas)
  440. end;
  441.  
  442. procedure TXLSFile.InsertAndCopySheets(const CopyFrom, InsertBefore,
  443.   SheetCount: integer);
  444. begin
  445.   FWorkbook.InsertSheets(CopyFrom-1, InsertBefore-1, SheetCount);
  446. end;
  447.  
  448. procedure TXLSFile.OpenFile(const FileName: TFileName);
  449. var
  450.   WorkbookStr: widestring;
  451. begin
  452.   WorkbookStr:=WorkbookStrS;
  453.   FTemplate:=nil;
  454.   FreeAndNil(FTmpTemplate);
  455.  
  456.   if FAdapter.TemplateStore<>nil then
  457.     FTemplate:=FAdapter.TemplateStore.Storages[FileName]
  458.   else
  459.   begin
  460.     FTmpTemplate:=TXlsStorageList.Create;
  461.     FTmpTemplate.LoadFrom(SearchPathStr(FileName));
  462.     FTemplate:=FTmpTemplate;
  463.   end;
  464.  
  465.   FWorkbook.LoadFromStream(FTemplate.Stream[WorkbookStr]);
  466.   FActiveSheet:=FWorkbook.ActiveSheet+1;
  467. end;
  468.  
  469.  
  470. procedure TXLSFile.RefreshPivotTables;
  471. begin
  472.   //Nothing
  473. end;
  474.  
  475.  
  476.  
  477. procedure TXLSFile.Save(const AutoClose: boolean; const FileName: string;
  478.   const OnGetFileName: TOnGetFileNameEvent);
  479. var
  480.   aFileName: TFileName;
  481.   OutputFileName: WideString;
  482.   WorkbookStr: widestring;
  483.  
  484.   i:integer;
  485.   DocOUT: TOle2Storage;
  486.   StreamOUT: TOle2Stream;
  487. begin
  488.   WorkbookStr:=WorkbookStrS;
  489.   aFileName:=Filename;
  490.   if Assigned (OnGetFileName) then OnGetFileName(Self,0,aFilename);
  491.   OutputFileName:= aFileName;
  492.  
  493.   if FileExists(FileName) then raise Exception.CreateFmt(ErrCantWriteToFile, [FileName]);  //this is to avoid a criptic ole xxxx error...
  494.  
  495.   //Create output file
  496.   DocOUT:= TOle2Storage.Create(OutputFileName, Ole2_Write);
  497.   try
  498.     for i:=0 to FTemplate.Count-1 do
  499.       if FTemplate[i].Name<>WorkbookStr then
  500.       begin
  501.         FTemplate[i].SaveToDoc(DocOUT);
  502.       end;
  503.  
  504.     StreamOUT:= TOle2Stream.Create(DocOUT, WorkbookStr);
  505.     try
  506.       FWorkbook.SaveToStream(StreamOUT);
  507.     finally
  508.       FreeAndNil(StreamOut);
  509.     end; //finally
  510.   finally
  511.     FreeAndNil(DocOUT);
  512.   end; //Finally
  513. end;
  514.  
  515. procedure TXLSFile.SelectSheet(const SheetNo:integer);
  516. begin
  517.   FWorkbook.ActiveSheet:=SheetNo-1;
  518. end;
  519.  
  520. procedure TXLSFile.SetActiveSheet(const Value: integer);
  521. begin
  522.   FActiveSheet:=Value;
  523. end;
  524.  
  525. procedure TXLSFile.SetActiveSheetName(const Value: WideString);
  526. begin
  527.   FWorkbook.Globals.SheetName[FActiveSheet-1]:= Value;
  528. end;
  529.  
  530. procedure TXLSFile.SetBounds(const aRangePos: integer);
  531. begin
  532.   FirstColumn:=FWorkbook.Globals.Names[aRangePos-1].C1;
  533.   LastColumn:=FWorkbook.Globals.Names[aRangePos-1].C2;
  534. end;
  535.  
  536. function TXLSFile.SheetCount: integer;
  537. begin
  538.   Result:=FWorkbook.Globals.SheetCount;
  539. end;
  540.  
  541. procedure TXLSFile.AssignBlockData(const Row, Col: integer; const v: variant);
  542. begin
  543.   AssignCellData(Row, Col, v);
  544. end;
  545.  
  546. procedure TXLSFile.PasteBlockData;
  547. begin
  548.   // Nothing
  549. end;
  550.  
  551. procedure TXLSFile.PrepareBlockData(const R1, C1, R2, C2: integer);
  552. begin
  553.   // Nothing
  554. end;
  555.  
  556. function TXLSFile.MaxRow: integer;
  557. begin
  558.   if not FWorkbook.IsWorkSheet(FActiveSheet-1) then begin; Result:=0;exit;end;
  559.   Result:= FWorkbook.WorkSheets[FActiveSheet-1].Cells.RowList.Count;
  560. end;
  561.  
  562. function TXLSFile.MaxCol: integer;
  563. var
  564.   i: integer;
  565. begin
  566.   Result:=0;
  567.   if not FWorkbook.IsWorkSheet(FActiveSheet-1) then exit;
  568.  
  569.   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
  570.     Result:= FWorkbook.WorkSheets[FActiveSheet-1].Cells.CellList.MaxCol[i]+1;
  571. end;
  572.  
  573. function TXLSFile.GetCellValue(aRow, aCol: integer): Variant;
  574. begin
  575.   Result:= GetCellData(aRow, aCol-FirstColumn-1);
  576. end;
  577.  
  578. procedure TXLSFile.SetCellValue(aRow, aCol: integer; const Value: Variant);
  579. begin
  580.   AssignCellData(aRow, aCol-FirstColumn-1, Value);
  581. end;
  582.  
  583. function TXLSFile.IsEmptyRow(const aRow: integer): boolean;
  584. begin
  585.   if not FWorkbook.IsWorkSheet(FActiveSheet-1) then begin; Result:=true;exit;end;
  586.   Result:=
  587.     (aRow-1<0) or (aRow-1>= FWorkbook.WorkSheets[FActiveSheet-1].Cells.CellList.Count) or
  588.     not FWorkbook.WorkSheets[FActiveSheet-1].Cells.RowList.HasRow(aRow-1);
  589. end;
  590.  
  591.  
  592. function TXLSFile.CanOptimizeRead: boolean;
  593. begin
  594.   Result:=true;
  595. end;
  596.  
  597. procedure TXLSFile.RefreshChartRanges(const VarStr: string);
  598. begin
  599.   //not implemented
  600. end;
  601.  
  602. function TXLSFile.IsWorksheet(const index: integer): boolean;
  603. begin
  604.   Result:= FWorkbook.Sheets[index-1] is TWorkSheet;
  605. end;
  606.  
  607.  
  608. function TXLSFile.GetColumnWidth(aCol: integer): integer;
  609. begin
  610.   if not FWorkbook.IsWorkSheet(FActiveSheet-1) then begin; Result:=0;exit;end;
  611.   Result:= FWorkbook.WorkSheets[FActiveSheet-1].GetColWidth(aCol-1);
  612. end;
  613.  
  614. function TXLSFile.GetRowHeight(aRow: integer): integer;
  615. begin
  616.   if not FWorkbook.IsWorkSheet(FActiveSheet-1) then begin; Result:=0;exit;end;
  617.   Result:= FWorkbook.WorkSheets[FActiveSheet-1].GetRowHeight(aRow-1);
  618. end;
  619.  
  620. procedure TXLSFile.SetColumnWidth(aCol: integer; const Value: integer);
  621. begin
  622.   if not FWorkbook.IsWorkSheet(FActiveSheet-1) then exit;
  623.   FWorkbook.WorkSheets[FActiveSheet-1].SetColWidth(aCol-1, Value);
  624. end;
  625.  
  626. procedure TXLSFile.SetRowHeight(aRow: integer; const Value: integer);
  627. begin
  628.   if not FWorkbook.IsWorkSheet(FActiveSheet-1) then exit;
  629.   FWorkbook.WorkSheets[FActiveSheet-1].SetRowHeight(aRow-1, Value);
  630. end;
  631.  
  632. function TXLSFile.GetFirstColumn: integer;
  633. begin
  634.   Result:=FirstColumn+1;
  635. end;
  636.  
  637. function TXLSFile.GetCellValueX(aRow, aCol: integer): TXlsCellValue;
  638. begin
  639.   Result:= GetCellDataX(aRow, aCol-FirstColumn-1);
  640. end;
  641.  
  642. procedure TXLSFile.SetCellValueX(aRow, aCol: integer;
  643.   const Value: TXlsCellValue);
  644. begin
  645.   AssignCellDataX(aRow, aCol-FirstColumn-1, Value);
  646. end;
  647.  
  648. function TXLSFile.GetAutoRowHeight(Row: integer): boolean;
  649. begin
  650.   Result:=true;
  651.   if not FWorkbook.IsWorkSheet(FActiveSheet-1) then exit;
  652.   Result:=FWorkbook.WorkSheets[FActiveSheet-1].Cells.RowList.IsAutoRowHeight(Row-1);
  653. end;
  654.  
  655. procedure TXLSFile.SetAutoRowHeight(Row: integer; const Value: boolean);
  656. begin
  657.   if not FWorkbook.IsWorkSheet(FActiveSheet-1) then exit;
  658.   FWorkbook.WorkSheets[FActiveSheet-1].Cells.RowList.AutoRowHeight(Row-1, Value);
  659. end;
  660.  
  661. function TXLSFile.GetColorPalette(Index: TColorPaletteRange): LongWord;
  662. begin
  663.   Result:=FWorkbook.Globals.ColorPalette[Index-1];
  664. end;
  665.  
  666. procedure TXLSFile.SetColorPalette(Index: TColorPaletteRange;
  667.   const Value: LongWord);
  668. begin
  669.   FWorkbook.Globals.ColorPalette[Index-1]:=Value;
  670. end;
  671.  
  672. function TXLSFile.GetColumnFormat(aColumn: integer): integer;
  673. begin
  674.   Result:=0;
  675.   if not FWorkbook.IsWorkSheet(FActiveSheet-1) then exit;
  676.   Result:=FWorkbook.WorkSheets[FActiveSheet-1].GetColFormat(aColumn-1);
  677. end;
  678.  
  679. function TXLSFile.GetRowFormat(aRow: integer): integer;
  680. begin
  681.   Result:=0;
  682.   if not FWorkbook.IsWorkSheet(FActiveSheet-1) then exit;
  683.   Result:=FWorkbook.WorkSheets[FActiveSheet-1].GetRowFormat(aRow-1);
  684. end;
  685.  
  686. procedure TXLSFile.SetColumnFormat(aColumn: integer; const Value: integer);
  687. begin
  688.   if not FWorkbook.IsWorkSheet(FActiveSheet-1) then exit;
  689.   FWorkbook.WorkSheets[FActiveSheet-1].SetColFormat(aColumn-1, Value);
  690. end;
  691.  
  692. procedure TXLSFile.SetRowFormat(aRow: integer; const Value: integer);
  693. begin
  694.   if not FWorkbook.IsWorkSheet(FActiveSheet-1) then exit;
  695.   FWorkbook.WorkSheets[FActiveSheet-1].SetRowFormat(aRow-1, Value);
  696. end;
  697.  
  698. function TXLSFile.FormatListCount: integer;
  699. begin
  700.   Result:=FWorkbook.Globals.XF.Count;
  701. end;
  702.  
  703. function TXLSFile.GetFormatList(index: integer): TFlxFormat;
  704. var
  705.   XF: TXFRecord;
  706.   Font: TFontRecord;
  707.   FontIndex:integer;
  708.   FormatIndex: integer;
  709. begin
  710.   XF:=FWorkbook.Globals.XF[index];
  711.  
  712.   FontIndex:=XF.FontIndex;
  713.   if FontIndex>4 then Dec(FontIndex); //Font number 4 does not exists
  714.   if (FontIndex<0) or (FontIndex>=FWorkbook.Globals.Fonts.Count) then FontIndex:=0;
  715.   Font:= FWorkbook.Globals.Fonts[FontIndex];
  716.   Result.Font.Name:= Font.Name;
  717.   Result.Font.Size20:= Font.Height;
  718.   Result.Font.ColorIndex:= Font.ColorIndex+1;
  719.   Result.Font.Style:= Font.Style;
  720.   Result.Font.Underline:= Font.Underline;
  721.  
  722.   Result.Borders.Left.Style:= XF.GetBorderStyle(10,0);
  723.   Result.Borders.Right.Style:= XF.GetBorderStyle(10,4);
  724.   Result.Borders.Top.Style:= XF.GetBorderStyle(11,0);
  725.   Result.Borders.Bottom.Style:= XF.GetBorderStyle(11,4);
  726.  
  727.   Result.Borders.Left.ColorIndex:= XF.GetBorderColorIndex(12,0);
  728.   Result.Borders.Right.ColorIndex:= XF.GetBorderColorIndex(12,7);
  729.   Result.Borders.Top.ColorIndex:= XF.GetBorderColorIndex(14,0);
  730.   Result.Borders.Bottom.ColorIndex:= XF.GetBorderColorIndex(14,7);
  731.  
  732.   Result.Borders.Diagonal.Style:=XF.GetBorderStyleExt(14,21);
  733.   Result.Borders.Diagonal.ColorIndex:=XF.GetBorderColorIndexExt(14,14);
  734.  
  735.   Result.Borders.DiagonalStyle:=XF.DiagonalStyle;
  736.  
  737.   FormatIndex:=XF.FormatIndex;
  738.   Result.Format:= FWorkbook.Globals.Formats[FormatIndex];
  739.  
  740.   Result.FillPattern.Pattern:=XF.CellPattern+1;
  741.   Result.FillPattern.FgColorIndex:=XF.CellFgColorIndex+1;
  742.   Result.FillPattern.BgColorIndex:=XF.CellBgColorIndex+1;
  743.  
  744.   Result.HAlignment:=XF.HAlign;
  745.   Result.VAlignment:=XF.VAlign;
  746.  
  747.   XF.FillMisc(Result.Locked, Result.Hidden, Result.Parent, Result.WrapText,
  748.               Result.ShrinkToFit, Result.Rotation, Result.Indent); //all togheter, to sve some function calls...
  749.  
  750. end;
  751.  
  752. function TXLSFile.ColByIndex(const Row, ColIndex: integer): integer;
  753. begin
  754.   Result:=0;
  755.   if not FWorkbook.IsWorkSheet(FActiveSheet-1) then exit;
  756.   if IsEmptyRow(Row) then exit;
  757.   if (ColIndex<=0) or (ColIndex>FWorkbook.WorkSheets[FActiveSheet-1].Cells.CellList[Row-1].Count) then exit;
  758.   Result:= FWorkbook.WorkSheets[FActiveSheet-1].Cells.CellList[Row-1][ColIndex-1].Column+1;
  759. end;
  760.  
  761. function TXLSFile.ColIndexCount(const Row: integer): integer;
  762. begin
  763.   Result:=0;
  764.   if not FWorkbook.IsWorkSheet(FActiveSheet-1) then exit;
  765.   if IsEmptyRow(Row) then exit;
  766.   Result:= FWorkbook.WorkSheets[FActiveSheet-1].Cells.CellList[Row-1].Count;
  767. end;
  768.  
  769. function TXLSFile.ColIndex(const Row, Col: integer): integer;
  770. begin
  771.   Result:=0;
  772.   if not FWorkbook.IsWorkSheet(FActiveSheet-1) then exit;
  773.   if IsEmptyRow(Row) then exit;
  774.   FWorkbook.WorkSheets[FActiveSheet-1].Cells.CellList[Row-1].Find(Col, Result);
  775.   inc(Result);
  776. end;
  777.  
  778. function TXLSFile.GetDefaultColWidth: integer;
  779. begin
  780.   Result:=$A;
  781.   if not FWorkbook.IsWorkSheet(FActiveSheet-1) then exit;
  782.   Result:=FWorkbook.WorkSheets[FActiveSheet-1].DefColWidth;
  783. end;
  784.  
  785. function TXLSFile.GetDefaultRowHeight: integer;
  786. begin
  787.   Result:=$FF;
  788.   if not FWorkbook.IsWorkSheet(FActiveSheet-1) then exit;
  789.   Result:=FWorkbook.WorkSheets[FActiveSheet-1].DefRowHeight;
  790. end;
  791.  
  792.  
  793. function TXLSFile.GetShowGridLines: boolean;
  794. begin
  795.   Result:=true;
  796.   if not FWorkbook.IsWorkSheet(FActiveSheet-1) then exit;
  797.   Result:=FWorkbook.WorkSheets[FActiveSheet-1].ShowGridLines;
  798. end;
  799.  
  800. procedure TXLSFile.SetShowGridLines(const Value: boolean);
  801. begin
  802.   if not FWorkbook.IsWorkSheet(FActiveSheet-1) then exit;
  803.   FWorkbook.WorkSheets[FActiveSheet-1].ShowGridLines:=value;
  804. end;
  805.  
  806.  
  807. function TXLSFile.GetCellMergedBounds(aRow, aCol: integer): TXlsCellRange;
  808. begin
  809.   if not FWorkbook.IsWorkSheet(FActiveSheet-1) then exit;
  810.   Result:=FWorkbook.WorkSheets[FActiveSheet-1].CellMergedBounds(aRow-1, aCol-1);
  811.   inc(Result.Left);
  812.   inc(Result.Top);
  813.   inc(Result.Right);
  814.   inc(Result.Bottom);
  815. end;
  816.  
  817. end.
  818.