uxlssheet.pas
来自「DELPHI界面增强控件,非常好,里面有显示GIF的图片控件,更美观的下拉框控件」· PAS 代码 · 共 1,036 行 · 第 1/3 页
PAS
1,036 行
end;
GetMem(Data, DataSize);
try
FPrintRecords.Insert(k +1,TMarginRecord.Create(aId, Data, DataSize));
except
FreeMem(Data);
raise;
end; //Except
Margin:=(FPrintRecords[k+1] as TMarginRecord);
Margin.Value:=Value;
end;
function TSheet.GetSheetZoom: integer;
begin
if FZoom<>nil then Result:=FZoom.Zoom else Result:=100;
end;
procedure TSheet.SetSheetZoom(const Value: integer);
begin
if FZoom=nil then AddZoomRecord;
if FZoom=nil then exit;
FZoom.Zoom:=Value;
end;
{ TChart }
procedure TChart.ArrangeCopyRows(const RowOffset: integer);
begin
FChartRecords.ArrangeCopyRows(RowOffset);
end;
procedure TChart.ArrangeCopySheet(const SheetInfo: TSheetInfo);
begin
FChartRecords.ArrangeCopySheet(SheetInfo);
end;
procedure TChart.InsertAndCopyRows(const FirstRow, LastRow, DestRow,
aCount: integer; const SheetInfo: TSheetInfo; const OnlyFormulas: boolean);
begin
//Nothing, we never insert rows in a chart sheet
end;
procedure TChart.DeleteRows(const aRow, aCount: word; const SheetInfo: TSheetInfo);
begin
//Nothing, we never delete rows in a chart sheet
end;
procedure TChart.Clear;
begin
inherited;
if FChartRecords<>nil then FChartRecords.Clear;
end;
function TChart.DoCopyTo: TSheet;
begin
Result:= inherited DoCopyTo;
(Result as TChart).FChartRecords.CopyFrom(FChartRecords);
end;
constructor TChart.Create(const aWorkbookGlobals: TWorkbookGlobals);
begin
inherited;
FChartRecords:= TChartRecordList.Create;
FPrintRecords:=FChartRecords;
end;
destructor TChart.Destroy;
begin
FreeAndNil(FChartRecords);
inherited;
end;
procedure TChart.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 RecordHeader.Id=xlr_WINDOW2 then FWindow2:=R as TWindow2Record else
if RecordHeader.Id=xlr_SCL then FZoom:=R as TSCLRecord else
if RecordHeader.Id=xlr_FOOTER then FPageFooter:=R as TPageFooterRecord else
if RecordHeader.Id=xlr_HEADER then FPageHeader:=R as TPageHeaderRecord else
if RecordHeader.Id=xlr_PRINTGRIDLINES then FPrintGridLines:=R as TPrintGridLinesRecord else
if RecordHeader.Id=xlr_LEFTMARGIN then FLeftMargin:=R as TMarginRecord else
if RecordHeader.Id=xlr_RIGHTMARGIN then FRightMargin:=R as TMarginRecord else
if RecordHeader.Id=xlr_TOPMARGIN then FTopMargin:=R as TMarginRecord else
if RecordHeader.Id=xlr_BOTTOMMARGIN then FBottomMargin:=R as TMarginRecord else
if RecordHeader.Id=xlr_SETUP then FSetup:=R as TSetupRecord else
if RecordHeader.Id=xlr_WSBool then FWsBool:=R as TWsBoolRecord;
if (R is TLabelSSTRecord) then (R as TLabelSSTRecord).AttachToSST(SST);
if (R is TBofRecord) then raise Exception.Create(ErrExcelInvalid)
else if (R is TIgnoreRecord) then FreeAndNil(R)
else if (R is TDimensionsRecord) then begin; OriginalDimensions:=(R as TDimensionsRecord).Dim^; FreeAndNil(R);end
else if (R is TEOFRecord) then EOF:=(R as TEOFRecord)
else FChartRecords.Add(R) ;
except
FreeAndNil(R);
Raise;
end; //Finally
until RecordHeader.id = xlr_EOF;
BOF:=First; //Last statement
end;
procedure TChart.SaveToStream(const DataStream: TStream);
begin
if (BOF=nil)or(EOF=nil) then raise Exception.Create(ErrSectionNotLoaded);
BOF.SaveToStream(DataStream);
FChartRecords.SaveToStream(DataStream);
EOF.SaveToStream(DataStream);
end;
function TChart.TotalSize: int64;
begin
Result:= inherited TotalSize+
FChartRecords.TotalSize;
end;
procedure TChart.SaveRangeToStream(const DataStream: TStream;
const SheetIndex: integer; const CellRange: TXlsCellRange);
begin
//Can't save a chart range
SaveToStream(DataStream);
end;
function TChart.TotalRangeSize(const SheetIndex: integer; const CellRange: TXlsCellRange): int64;
begin
//Can't save a chart range
Result:=TotalSize;
end;
procedure TChart.ArrangeInsert(const InsPos, InsCount: integer; const SheetInfo: TSheetInfo);
begin
FChartRecords.ArrangeInsert( InsPos, InsCount, SheetInfo);
end;
procedure TChart.SetPageHeaderFooter(const P: TPageHeaderFooterRecord;
const s: Widestring);
var
OldSize: integer;
begin
if P=nil then exit;
OldSize:=P.DataSize;
P.Text:=s;
FChartRecords.AdaptSize(P.DataSize-OldSize);
end;
procedure TChart.AddZoomRecord;
begin
FZoom:=FChartRecords[FChartRecords.Add(TSCLRecord.CreateFromData(100))] as TSCLRecord;
end;
{ TChartList }
procedure TChartList.ArrangeInsert(const InsPos, InsCount: integer;
const SheetInfo: TSheetInfo);
var
i: integer;
begin
for i:=0 to Count -1 do Items[i].ArrangeInsert(InsPos, InsCount, SheetInfo);
end;
procedure TChartList.SaveToStream(const DataStream: TStream);
var
i:integer;
begin
for i:=0 to Count-1 do Items[i].SaveToStream(DataStream);
end;
{ TWorkSheet }
procedure TWorkSheet.Clear;
begin
inherited;
if FMiscRecords1<>nil then FMiscRecords1.Clear;
if FMiscRecords2<>nil then FMiscRecords2.Clear;
if FHPageBreaks<>nil then FHPageBreaks.Clear;
if FVPageBreaks<>nil then FVPageBreaks.Clear;
if FDrawing<>nil then FDrawing.Clear;
if FCells<>nil then FCells.Clear;
if FRanges<>nil then FRanges.Clear;
if FNotes<>nil then FNotes.Clear;
if FColumns<>nil then FColumns.Clear;
end;
function TWorkSheet.DoCopyTo: TSheet;
begin
Result:= inherited DoCopyTo;
(Result as TWorkSheet).FMiscRecords1.CopyFrom(FMiscRecords1);
(Result as TWorkSheet).FMiscRecords2.CopyFrom(FMiscRecords2);
(Result as TWorkSheet).FHPageBreaks.CopyFrom(FHPageBreaks);
(Result as TWorkSheet).FVPageBreaks.CopyFrom(FVPageBreaks);
(Result as TWorkSheet).FDrawing.CopyFrom(FDrawing);
(Result as TWorkSheet).FCells.CopyFrom(FCells);
(Result as TWorkSheet).FRanges.CopyFrom(FRanges);
(Result as TWorkSheet).FNotes.CopyFrom(FNotes);
(Result as TWorkSheet).FColumns.CopyFrom(FColumns);
(Result as TWorkSheet).FNotes.FixDwgIds((Result as TWorkSheet).FDrawing);
(Result as TWorkSheet).FDefColWidth:=FDefColWidth;
(Result as TWorkSheet).FDefRowHeight:=FDefRowHeight;
end;
constructor TWorkSheet.Create(const aWorkbookGlobals: TWorkbookGlobals);
begin
inherited;
FMiscRecords1:= TBaseRecordList.Create;
FMiscRecords2:= TBaseRecordList.Create;
FHPageBreaks:=THPageBreakList.Create;
FVPageBreaks:=TVPageBreakList.Create;
FDrawing:= TDrawing.Create(FWorkbookGlobals.DrawingGroup);
FColumns:= TColInfoList.Create;
FCells:= TCells.Create(aWorkbookGlobals, FColumns);
FRanges :=TRangeList.Create;
FNotes:= TNoteList.Create;
FPrintRecords:=FMiscRecords1;
FDefRowHeight:=$FF;
FDefColWidth:=$0A*DefColWidthAdapt;
end;
destructor TWorkSheet.Destroy;
begin
FreeAndNil(FRanges);
FreeAndNil(FCells);
FreeAndNil(FNotes);
FreeAndNil(FColumns);
//FDrawing should be freed after notes
FreeAndNil(FDrawing);
FreeAndNil(FVPageBreaks);
FreeAndNil(FHPageBreaks);
FreeAndNil(FMiscRecords1);
FreeAndNil(FMiscRecords2);
inherited;
end;
procedure TWorkSheet.LoadFromStream(const DataStream: TStream;
const First: TBOFRecord; const SST: TSST);
var
RecordHeader: TRecordHeader;
R: TBaseRecord;
MiscRecords: TBaseRecordList;
FShrFmlas: TShrFmlaRecordList;
LastFormula: TFormulaRecord;
begin
Clear;
MiscRecords:=FMiscRecords1;
FShrFmlas:= TShrFmlaRecordList.Create;
LastFormula:=nil;
try
repeat
if (DataStream.Read(RecordHeader, sizeof(RecordHeader)) <> sizeof(RecordHeader)) then
raise Exception.Create(ErrExcelInvalid);
R:=LoadRecord(DataStream, RecordHeader);
try
if RecordHeader.Id=xlr_WINDOW2 then
begin
MiscRecords:=FMiscRecords2;
FWindow2:=R as TWindow2Record;
end;
if RecordHeader.Id=xlr_SCL then FZoom:=R as TSCLRecord else
if RecordHeader.Id=xlr_FOOTER then FPageFooter:=R as TPageFooterRecord else
if RecordHeader.Id=xlr_HEADER then FPageHeader:=R as TPageHeaderRecord else
if RecordHeader.Id=xlr_PRINTGRIDLINES then FPrintGridLines:=R as TPrintGridLinesRecord else
if RecordHeader.Id=xlr_LEFTMARGIN then FLeftMargin:=R as TMarginRecord else
if RecordHeader.Id=xlr_RIGHTMARGIN then FRightMargin:=R as TMarginRecord else
if RecordHeader.Id=xlr_TOPMARGIN then FTopMargin:=R as TMarginRecord else
if RecordHeader.Id=xlr_BOTTOMMARGIN then FBottomMargin:=R as TMarginRecord else
if RecordHeader.Id=xlr_SETUP then FSetup:=R as TSetupRecord else
if RecordHeader.Id=xlr_WSBool then FWsBool:=R as TWsBoolRecord;
if (R is TFormulaRecord) then LastFormula:=R as TFormulaRecord;
if (R is TDefColWidthRecord) then FDefColWidth:= (R as TDefColWidthRecord).Width*DefColWidthAdapt;
if (R is TDefRowHeightRecord) then FDefRowHeight:= (R as TDefRowHeightRecord).Height;
if (R is TLabelSSTRecord) then (R as TLabelSSTRecord).AttachToSST(SST);
if (R is TBofRecord) then raise Exception.Create(ErrExcelInvalid)
else if (R is TDrawingRecord) then FDrawing.LoadFromStream(DataStream, R as TDrawingRecord, SST)
else if (R is TIgnoreRecord) then FreeAndNil(R)
else if (R is TDimensionsRecord) then begin; OriginalDimensions:=(R as TDimensionsRecord).Dim^; FreeAndNil(R);end
else if (R is TNoteRecord) then FNotes.AddRecord(R as TNoteRecord, (R as TNoteRecord).Row)
else if (R is TColInfoRecord) then FColumns.AddRecord(R as TColInfoRecord)
else if (R is TCellRecord) then FCells.AddCell(R as TCellRecord, (R as TCellRecord).Row)
else if (R is TMultipleValueRecord) then begin FCells.AddMultipleCells(R as TMultipleValueRecord);FreeAndNil(R);end
else if (R is TRowRecord) then FCells.AddRow(R as TRowRecord)
else if (R is TCondFmtRecord) then FRanges[FRanges.Add(TCondFmt.Create)].LoadFromStream(DataStream, R as TCondFmtRecord)
else if (R is TCellMergingRecord) then FRanges[FRanges.Add(TMergedCells.Create)].LoadFromStream(DataStream, R as TCellMergingRecord)
else if (R is TShrFmlaRecord) then FShrFmlas.Add(R as TShrFmlaRecord)
else if (R is THPageBreakRecord) then FHPageBreaks.AddRecord(R as THPageBreakRecord)
else if (R is TVPageBreakRecord) then FVPageBreaks.AddRecord(R as TVPageBreakRecord)
else if (R is TStringRecord) then begin if LastFormula=nil then raise Exception.Create(ErrExcelInvalid) else LastFormula.SetFormulaValue((R as TStringRecord).Value);FreeAndNil(R);end
else if (R is TArrayRecord) then begin if LastFormula=nil then raise Exception.Create(ErrExcelInvalid) else LastFormula.ArrayRecord:=R as TArrayRecord;end
else if (R is TEOFRecord) then EOF:=(R as TEOFRecord)
else MiscRecords.Add(R) ;
except
FreeAndNil(R);
Raise;
end; //Finally
until RecordHeader.id = xlr_EOF;
FNotes.FixDwgIds(FDrawing);
FCells.CellList.FixFormulas(FShrFmlas);
finally
FreeAndNil(FShrFmlas);
end; //finally
//this must be the last statment, so if there is an exception, we dont take First
BOF:= First;
end;
procedure TWorkSheet.SaveToStream(const DataStream: TStream);
begin
if (BOF=nil)or(EOF=nil) then raise Exception.Create(ErrSectionNotLoaded);
BOF.SaveToStream(DataStream);
FMiscRecords1.SaveToStream(DataStream);
FHPageBreaks.SaveToStream(DataStream);
FVPageBreaks.SaveToStream(DataStream);
FColumns.SaveToStream(DataStream);
FCells.SaveToStream(DataStream);
FDrawing.SaveToStream(DataStream);
FNotes.SaveToStream(DataStream);
FMiscRecords2.SaveToStream(DataStream);
FRanges.SaveToStream(DataStream);
EOF.SaveToStream(DataStream);
end;
procedure TWorkSheet.SaveRangeToStream(const DataStream: TStream;
const SheetIndex: integer; const CellRange: TXlsCellRange);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?