📄 xlsadapter.pas
字号:
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].GetR1+1;
end;
function TXLSFile.GetRangeR2(index: integer): integer;
begin
Result:= FWorkbook.Globals.Names[index-1].GetR2+1;
end;
function TXLSFile.GetRangeC1(index: integer): integer;
begin
Result:= FWorkbook.Globals.Names[index-1].GetC1+1;
end;
function TXLSFile.GetRangeC2(index: integer): integer;
begin
Result:= FWorkbook.Globals.Names[index-1].GetC2+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.InsertAndCopyRowsAndCols(FActiveSheet-1, FirstRow-1, LastRow-1, DestRow-1, aCount, 0,0,0,0, OnlyFormulas);
IsFileModified := true;
end;
procedure TXLSFile.InsertAndCopyCols(const FirstCol, LastCol, DestCol,
aCount: integer; const OnlyFormulas: boolean);
begin
FWorkbook.InsertAndCopyRowsAndCols(FActiveSheet-1, 0,0,0,0, FirstCol-1, LastCol-1, DestCol-1, aCount, OnlyFormulas);
IsFileModified := true;
end;
procedure TXLSFile.InsertAndCopySheets(const CopyFrom, InsertBefore,
SheetCount: integer);
begin
FWorkbook.InsertSheets(CopyFrom-1, InsertBefore-1, SheetCount);
IsFileModified := true;
end;
procedure TXLSFile.OpenFileOrStream(const FileName: TFileName; const aStream: TStream);
var
WorkbookStr: widestring;
DocIN: TOle2Storage;
StreamIN: TOle2Stream;
Fn: string;
begin
WorkbookStr:=WorkbookStrS;
FTemplate:=nil;
FreeAndNil(FTmpTemplate);
if (FAdapter<>nil) and (FAdapter.TemplateStore<>nil) then
begin
FTemplate:=FAdapter.TemplateStore.Storages[FileName];
FWorkbook.LoadFromStream(FTemplate.Stream[WorkbookStr]);
end
else
begin
FTmpTemplate:=TXlsStorageList.Create;
if Trim(FileName)<>'' then Fn:=SearchPathStr(FileName) else Fn:='';
//This is to load all storages except workbook. For reading big files, makes no sense to keep workbook on memory 2 times
DocIN:= TOle2Storage.Create(Fn, Ole2_Read, false, aStream);
try
FTmpTemplate.LoadStorage(DocIN, false);
StreamIn:= TOle2Stream.Create( DocIN, WorkbookStr);
try
FWorkbook.LoadFromStream(StreamIn);
finally
FreeAndNil(StreamIn);
end; //finally
finally
FreeAndNil(DocIN);
end; //finally
FTemplate:=FTmpTemplate;
end;
FActiveSheet:=FWorkbook.ActiveSheet+1;
IsFileModified := false;
end;
procedure TXLSFile.OpenFile(const FileName: TFileName);
begin
OpenFileOrStream(FileName, nil);
end;
procedure TXLSFile.LoadFromStream(const aStream: TStream);
begin
OpenFileOrStream('', aStream);
end;
procedure TXLSFile.RefreshPivotTables;
begin
//Nothing
end;
procedure TXLSFile.SaveAsXls(const FileName: string; const DataStream: TStream);
var
WorkbookStr: widestring;
i:integer;
DocOUT: TOle2Storage;
StreamOUT: TOle2Stream;
begin
WorkbookStr:=WorkbookStrS;
//Create output file
DocOUT:= TOle2Storage.Create(FileName, Ole2_Write, AllowOverwritingFiles, DataStream);
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, IsFileModified);
finally
FreeAndNil(StreamOut);
end; //finally
finally
FreeAndNil(DocOUT);
end; //Finally
end;
procedure TXLSFile.SaveAsTextDelimited(const FileName: string;
const DataStream: TStream; const Delim: char);
{$IFNDEF TMSASGx}
var
OutStream: TFileStream;
{$ENDIF}
begin
{$IFNDEF TMSASGx}
if DataStream=nil then
begin
OutStream:=TFileStream.Create(FileName, fmCreate);
try
SaveAsTextDelim(OutStream, Self, Delim);
finally
FreeAndNil(OutStream);
end; //finally
end
else
SaveAsTextDelim(DataStream, Self, Delim);
{$ENDIF}
end;
procedure TXLSFile.Save(const AutoClose: boolean; const FileName: string; const OnGetFileName: TOnGetFileNameEvent; const OnGetOutStream: TOnGetOutStreamEvent=nil; const DataStream: TStream=nil);
var
aFileName: TFileName;
OutStream: TStream;
SF: TExcelSaveFormatNative;
begin
for SF:=Low(TExcelSaveFormatNative) to High(TExcelSaveFormatNative) do
if ((FAdapter<>nil) and (SF in FAdapter.SaveFormat))or
((FAdapter=nil) and (SF = snXLS)) then
begin
aFileName:=Filename;
OutStream:=nil;
if Assigned(DataStream) then
begin
//Save to stream
OutStream:=DataStream;
end
else
if Assigned (OnGetOutStream) then
begin
//SaveToStream
OnGetOutStream(Self,integer(SF),OutStream);
end else
begin
//SaveToFile
if Assigned (OnGetFileName) then OnGetFileName(Self,integer(SF),aFilename);
if (not AllowOverwritingFiles) and FileExists(aFileName) then raise Exception.CreateFmt(ErrCantWriteToFile, [aFileName]); //this is to avoid a criptic ole xxxx error...
end;
case SF of
snXLS: SaveAsXls(aFileName, OutStream);
snCSVComma: SaveAsTextDelimited(aFileName, OutStream, ',');
snCSVSemiColon: SaveAsTextDelimited(aFileName, OutStream, ';');
snTabDelimited: SaveAsTextDelimited(aFileName, OutStream, #9);
else raise Exception.Create(ErrInternal);
end; //case
end;
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.SetActiveSheetCodeName(const Value: WideString);
var
i: integer;
begin
for i:=0 to FWorkbook.Sheets.Count-1 do
begin
if FWorkbook.Sheets[i].CodeName= Value then raise Exception.CreateFmt(ErrDuplicatedSheetName,[Value]);
end;
FWorkbook.Sheets[FActiveSheet-1].CodeName:= Value;
end;
procedure TXLSFile.SetBounds(const aRangePos: integer);
begin
FirstColumn:=FWorkbook.Globals.Names[aRangePos-1].GetC1;
LastColumn:=FWorkbook.Globals.Names[aRangePos-1].GetC2;
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;
with FWorkbook.WorkSheets[FActiveSheet-1].Cells.RowList do
for i:=0 to Count-1 do
if HasRow(i) then
if Items[i].MaxCol> Result then Result:= Items[i].MaxCol; //MaxCol is 0 based, but references the last used col +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.GetColumnWidthHiddenIsZero(aCol: integer): integer;
begin
if not FWorkbook.IsWorkSheet(FActiveSheet-1) then begin; Result:=0;exit;end;
Result:= FWorkbook.WorkSheets[FActiveSheet-1].GetColWidth(aCol-1, true);
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;
function TXLSFile.GetRowHeightHiddenIsZero(aRow: integer): integer;
begin
if not FWorkbook.IsWorkSheet(FActiveSheet-1) then begin; Result:=0;exit;end;
Result:= FWorkbook.WorkSheets[FActiveSheet-1].GetRowHeight(aRow-1, true);
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);
RestoreObjectSizes();
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);
RestoreObjectSizes();
end;
function TXLSFile.GetColumnHidden(const aCol: integer): boolean;
begin
if not FWorkbook.IsWorkSheet(FActiveSheet-1) then begin; Result:=false;exit;end;
if (aCol<1)or (aCol>Max_Columns+1) then begin; result:=false;exit;end;
Result:= FWorkbook.WorkSheets[FActiveSheet-1].GetColHidden(aCol-1);
end;
function TXLSFile.GetRowHidden(const aRow: integer): boolean;
begin
if not FWorkbook.IsWorkSheet(FActiveSheet-1) then begin; Result:=false;exit;end;
Result:= FWorkbook.WorkSheets[FActiveSheet-1].GetRowHidden(aRow-1);
end;
procedure TXLSFile.SetColumnHidden(const aCol: integer; const Value: boolean);
begin
if not FWorkbook.IsWorkSheet(FActiveSheet-1) then exit;
if (aCol<1)or (aCol>Max_Columns+1) then exit;
FWorkbook.WorkSheets[FActiveSheet-1].SetColHidden(aCol-1, Value);
RestoreObjectSizes();
end;
procedure TXLSFile.SetRowHidden(const aRow: integer; const Value: boolean);
begin
if not FWorkbook.IsWorkSheet(FActiveSheet-1) then exit;
FWorkbook.WorkSheets[FActiveSheet-1].SetRowHidden(aRow-1, Value);
RestoreObjectSizes();
end;
function TXLSFile.GetFirstColumn: integer;
begin
Result:=FirstColumn+1;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -