uxlsworkbookglobals.pas
来自「delphi 第三方控件很出色,表格制作的」· PAS 代码 · 共 446 行 · 第 1/2 页
PAS
446 行
begin
FreeAndNil(FSST);
FreeAndNil(FReferences);
FreeAndNil(FBoundSheets);
FreeAndNil(FMiscRecords);
FreeAndNil(FNames);
FreeAndNil(FDrawingGroup);
FreeAndNil(FXF);
FreeAndNil(FFonts);
FreeAndNil(FFormats);
inherited;
end;
function TWorkbookGlobals.GetActivesheet: integer;
begin
if FWindow1<>nil then Result:= FWindow1.ActiveSheet else Result:=0;
end;
function TWorkbookGlobals.GetColorPalette(Index: integer): LongWord;
begin
if FPaletteCache=nil then Result:=StandardPalette(Index) else Result:=FPaletteCache.Color[Index];
end;
function TWorkbookGlobals.GetSheetCount: integer;
begin
Result:= FBoundSheets.BoundSheets.Count;
end;
function TWorkbookGlobals.GetSheetName(const index: integer): Widestring;
begin
Result:= FBoundSheets.BoundSheets.SheetName[index];
end;
function TWorkbookGlobals.GetSheetOptionFlags(const index: integer): word;
begin
Result:= FBoundSheets.BoundSheets[index].OptionFlags;
end;
function TWorkbookGlobals.GetSheetVisible(const index: integer): TXlsSheetVisible;
begin
Result:= FBoundSheets.BoundSheets.SheetVisible[index];
end;
procedure TWorkbookGlobals.InsertAndCopyRowsAndCols(const FirstRow, LastRow, DestRow, aRowCount, FirstCol, LastCol, DestCol, aColCount: integer; const SheetInfo: TSheetInfo);
begin
FNames.ArrangeInsertRowsAndCols(DestRow, (LastRow -FirstRow +1)* aRowCount, DestCol, (LastCol -FirstCol +1)* aColCount, SheetInfo);
end;
procedure TWorkbookGlobals.InsertSheets(const CopyFrom: integer; BeforeSheet: integer;
const OptionFlags: word; const Name: WideString; const SheetCount: byte);
var
i, ofs: integer;
SheetInfo: TSheetInfo;
begin
for i:=0 to SheetCount-1 do
FBoundSheets.InsertSheet(BeforeSheet, OptionFlags, Name);
FReferences.InsertSheets(BeforeSheet, SheetCount);
SheetInfo.InsSheet:=-1;
if CopyFrom>=BeforeSheet then ofs:=SheetCount else ofs:=0;
SheetInfo.FormulaSheet:=CopyFrom + ofs;
SheetInfo.GetSheet:= FReferences.GetSheet;
SheetInfo.SetSheet:= FReferences.SetSheet;
FNames.InsertSheets(CopyFrom, BeforeSheet, SheetCount, SheetInfo );
end;
procedure TWorkbookGlobals.LoadFromStream(const DataStream: TStream;
const First: TBOFRecord; const SST: TSST);
var
RecordHeader: TRecordHeader;
R: TBaseRecord;
begin
Clear;
repeat
if (DataStream.Read(RecordHeader, sizeof(RecordHeader)) <> sizeof(RecordHeader)) then
raise Exception.Create(ErrExcelInvalid);
R:=LoadRecord(DataStream, RecordHeader);
try
if (R is TXFRecord) and (FXF.Count=0) then FMiscRecords.Add(TSubListRecord.CreateAndAssign(FXF));
if (R is TFontRecord) and (FFonts.Count=0) then FMiscRecords.Add(TSubListRecord.CreateAndAssign(FFonts));
if (R is TFormatRecord) and (FFormats.Count=0) then FMiscRecords.Add(TSubListRecord.CreateAndAssign(FFormats));
if (R is TPaletteRecord) then FPaletteCache:=(R as TPaletteRecord);
if (R is TXFRecord) or (R is TStyleRecord) then FPaletteIndex:=FMiscRecords.Count; //After the last Style record
if (R is TObProjRecord) then FHasMacro:=true;
if (R is TCodeNameRecord) then FCodeName:=(R as TCodeNameRecord).SheetName;
if (R is TBofRecord) then raise Exception.Create(ErrExcelInvalid)
else if (R is TIgnoreRecord) then FreeAndNil(R)
else if (R is TBoundSheetRecord) then FBoundSheets.Add(R as TBoundSheetRecord)
else if (R is TNameRecord) then FNames.Add(R as TNameRecord)
else if (R is TXFRecord) then FXF.Add(R as TXFRecord)
else if (R is TFontRecord) then FFonts.Add(R as TFontRecord)
else if (R is TFormatRecord) then FFormats.Add(R as TFormatRecord)
else if (R is TEOFRecord) then sEOF:=(R as TEOFRecord)
else if (R is TSSTRecord) then begin FSST.Load(R as TSSTRecord); FreeAndNil(R);end
else if (R is TSupBookRecord) then FReferences.AddSupbook(R as TSupBookRecord)
else if (R is TExternNameRecord) then begin; FReferences.AddExternName(R as TExternNameRecord);end
else if (R is TExternSheetRecord) then begin; FReferences.AddExternRef(R as TExternSheetRecord); FreeAndNil(R);end
else if (R is TDrawingGroupRecord) then FDrawingGroup.LoadFromStream(DataStream, R as TDrawingGroupRecord)
else if (R is TWindow1Record) then begin; FWindow1:=R as TWindow1Record; FMiscRecords.Add(R); end
else FMiscRecords.Add(R);
except
FreeAndNil(R);
Raise;
end; //Finally
until RecordHeader.id = xlr_EOF;
sBOF:=First; //Last statement
end;
procedure TWorkbookGlobals.SaveRangeToStream(const DataStream: TStream;
const SheetIndex: integer; const CellRange: TXlsCellRange);
begin
//Someday this can be optimized to only save texts on the range
//But even Excel does not do it...
if (sBOF=nil)or(sEOF=nil) then raise Exception.Create(ErrSectionNotLoaded);
sBOF.SaveToStream(DataStream);
FMiscRecords.SaveToStream(DataStream);
//FXF, FFonts and FFormats are saved in FMiscRecords.SaveToStream;
FBoundSheets.SaveRangeToStream(DataStream, SheetIndex);
FReferences.SaveToStream(DataStream);
FNames.SaveToStream(DataStream); //Should be after FBoundSheets.SaveToStream
//Images are not saved to the clipboard by excel
//FDrawingGroup.SaveToStream(DataStream);
FSST.SaveToStream(DataStream);
sEOF.SaveToStream(DataStream);
end;
procedure TWorkbookGlobals.SaveToStream(const DataStream: TStream);
begin
if (sBOF=nil)or(sEOF=nil) then raise Exception.Create(ErrSectionNotLoaded);
sBOF.SaveToStream(DataStream);
FMiscRecords.SaveToStream(DataStream);
//FXF, FFonts and FFormats are saved in FMiscRecords.SaveToStream;
FBoundSheets.SaveToStream(DataStream);
FReferences.SaveToStream(DataStream);
FNames.SaveToStream(DataStream); //Should be after FBoundSheets.SaveToStream
FDrawingGroup.SaveToStream(DataStream);
FSST.SaveToStream(DataStream);
sEOF.SaveToStream(DataStream);
end;
procedure TWorkbookGlobals.SetActiveSheet(const Value: integer);
begin
if FWindow1<>nil then FWindow1.ActiveSheet:=Value;
end;
procedure TWorkbookGlobals.SetColorPalette(Index: integer;
const Value: LongWord);
begin
if FPaletteCache=nil then
begin
//We have to create a standard palette first.
FMiscRecords.Insert(FPaletteIndex, TPaletteRecord.CreateStandard);
FPaletteCache:=FMiscRecords[FPaletteIndex] as TPaletteRecord;
end;
FPaletteCache.Color[Index]:= Value;
end;
procedure TWorkbookGlobals.SetFirstSheetVisible(const index: integer);
begin
if FWindow1<>nil then FWindow1.FirstSheetVisible:=index;
end;
procedure TWorkbookGlobals.SetSheetName(const index: integer;
const Value: Widestring);
begin
FBoundSheets.FSheetNames.Rename(FBoundSheets.BoundSheets.SheetName[index], Value);
FBoundSheets.BoundSheets.SheetName[index]:=Value;
end;
procedure TWorkbookGlobals.SetSheetVisible(const index: integer; const Value: TXlsSheetVisible);
begin
FBoundSheets.BoundSheets.SheetVisible[index]:=Value;
end;
procedure TWorkbookGlobals.SheetSetOffset(const index: integer; const Offset: cardinal);
begin
FBoundSheets.BoundSheets[index].SetOffset(Offset);
end;
function TWorkbookGlobals.TotalRangeSize(const SheetIndex: integer; const CellRange: TXlsCellRange): int64;
begin
Result:= inherited TotalRangeSize(SheetIndex, CellRange) +
FSST.TotalSize +
FReferences.TotalSize +
FBoundSheets.TotalRangeSize(SheetIndex) +
FMiscRecords.TotalSize +
FNames.TotalSize+
//Excel doesnt save images to the clipboard
//FDrawingGroup.TotalSize+
//FXF.TotalSize, FFonts.TotalSize and FFormats.TotalSize are not included in FMiscRecords.TotalSize;
FXF.TotalSize+
FFonts.TotalSize+
FFormats.TotalSize;
end;
function TWorkbookGlobals.TotalSize: int64;
begin
Result:= inherited TotalSize +
FSST.TotalSize +
FReferences.TotalSize +
FBoundSheets.TotalSize +
FMiscRecords.TotalSize +
FNames.TotalSize+
FDrawingGroup.TotalSize+
//FXF.TotalSize, FFonts.TotalSize and FFormats.TotalSize are not included in FMiscRecords.TotalSize;
FXF.TotalSize+
FFonts.TotalSize+
FFormats.TotalSize;
end;
end.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?