📄 uxlsrowcolentries.pas
字号:
if k<Count then Delete(k);
dec(k);
end;
if Cell=nil then exit;
if Col+1> FRowRecordList[Row].MaxCol then FRowRecordList[Row].MaxCol:=Col+1;
if Col< FRowRecordList[Row].MinCol then FRowRecordList[Row].MinCol:=Col;
if Row>=Count then AddRecord(Cell, Row) else Items[Row].Insert(Index, Cell);
except
FreeAndNil(Cell);
raise;
end; //except
{$ENDIF}
end;
procedure TCellList.SetFormat(const Row, Col, XF: integer);
var
Index: integer;
Value: TXlsCellValue;
begin
if (Row<0) or (Row>Max_Rows) then raise Exception.CreateFmt(ErrInvalidRow,[Row]);
if (Col>Max_Columns)or (Col<0) then raise Exception.CreateFmt(ErrInvalidCol,[Col]);
if FRowRecordList.HasRow(Row) and (Row<Count) and (Row>=0) and Items[Row].Find(Col,Index) then
Items[Row][Index].XF:=XF else
begin
Value.Value:=null;
Value.XF:=XF;
SetValue(Row,Col,Value);
end;
end;
procedure TCellList.ArrangeInsertSheet(const SheetInfo: TSheetInfo);
var
Data: PArrayOfByte;
i, k: integer;
it: TCellRecordList;
begin
for i:=0 to Count-1 do
begin
it:=Items[i];
for k:=0 to it.Count-1 do
if it.Items[k] is TFormulaRecord then
begin
Data:= it.Items[k].Data;
ArrangeInsertSheets(Data, 22, 22 + GetWord(Data, 20), SheetInfo);
end;
end;
end;
{ TCells }
procedure TCells.AddCell(const aRecord: TCellRecord; const aRow: integer);
begin
FCellList.AddRecord(aRecord, aRow);
end;
procedure TCells.AddMultipleCells(const aRecord: TMultipleValueRecord);
var
OneRec: TCellRecord;
begin
while not aRecord.Eof do
begin
OneRec:=aRecord.ExtractOneRecord;
FCellList.AddRecord( OneRec, OneRec.Row);
end;
end;
procedure TCells.AddRow(const aRecord: TRowRecord);
begin
FRowList.AddRecord(aRecord);
end;
procedure TCells.ArrangeInsertRowsAndCols(const InsRowPos, InsRowCount, InsColPos, InsColCount: integer;
const SheetInfo: TSheetInfo);
begin
FRowList.ArrangeInsertRowsAndCols(InsRowPos, InsRowCount, InsColPos, InsColCount, SheetInfo);
FCellList.ArrangeInsertRowsAndCols(InsRowPos, InsRowCount, InsColPos, InsColCount, SheetInfo);
end;
procedure TCells.Clear;
begin
if FRowList<>nil then FRowList.Clear;
if FCellList<>nil then FCellList.Clear;
end;
procedure TCells.CopyFrom(const aList: TCells);
begin
FRowList.CopyFrom(aList.FRowList);
FCellList.CopyFrom(aList.FCellList);
end;
constructor TCells.Create(const aGlobals: TWorkbookGlobals; const aColInfoList: TColInfoList);
begin
inherited Create;
FRowList:=TRowRecordList.Create;
FCellList:=TCellList.Create(aGlobals, FRowList, aColInfoList);
end;
procedure TCells.DeleteRows(const aRow, aCount: word; const SheetInfo: TSheetInfo);
begin
FRowList.DeleteRows(aRow, aCount, SheetInfo);
FCellList.DeleteRows(aRow, aCount, SheetInfo);
end;
procedure TCells.DeleteCols(const aCol, aCount: word; const SheetInfo: TSheetInfo);
begin
FCellList.DeleteCols(aCol, aCount, SheetInfo);
ArrangeCols;
end;
destructor TCells.Destroy;
begin
FreeAndNil(FRowList);
FreeAndNil(FCellList);
inherited;
end;
procedure TCells.InsertAndCopyRows(const FirstRow, LastRow, DestRow,
aCount: integer; const SheetInfo: TSheetInfo; const OnlyFormulas: boolean);
begin
FRowList.InsertAndCopyRows(FirstRow, LastRow, DestRow, aCount, SheetInfo);
FCellList.InsertAndCopyRows(FirstRow, LastRow, DestRow, aCount, SheetInfo, OnlyFormulas);
end;
procedure TCells.InsertAndCopyCols(const FirstCol, LastCol, DestCol,
aCount: integer; const SheetInfo: TSheetInfo; const OnlyFormulas: boolean);
begin
FCellList.InsertAndCopyCols(FirstCol, LastCol, DestCol, aCount, SheetInfo, OnlyFormulas);
ArrangeCols;
end;
procedure TCells.ArrangeCols;
var
i: integer;
begin
for i:= 0 to FRowList.Count-1 do
if (FRowList.HasRow(i)) then
begin
if ((i<FCellList.Count) and (FCellList[i]<>nil) and (FCellList[i].Count>0)) then
begin
FRowList[i].MinCol:= FCellList[i][0].Column;
FRowList[i].MaxCol:= FCellList[i][FCellList[i].Count-1].Column+1;
end
else
begin
FRowList[i].MinCol:= 0;
FRowList[i].MaxCol:= 0;
end;
end;
end;
function TCells.DimensionsSize: integer;
begin
Result:= SizeOf(TDimensionsRec)+SizeOf(TRecordHeader);
end;
procedure TCells.CalcUsedRange(var CellRange: TXlsCellRange);
var
i: integer;
begin
CellRange.Top:=0;
while (int64(CellRange.Top)<RowList.Count) and not RowList.HasRow(CellRange.Top) do inc(CellRange.Top);
CellRange.Bottom:=RowList.Count-1;
CellRange.Left:=0;
CellRange.Right:=0;
for i:=CellRange.Top to RowList.Count-1 do
if RowList.HasRow(i) then
begin
if RowList[i].MaxCol>CellRange.Right then CellRange.Right:=RowList[i].MaxCol;
if RowList[i].MinCol<CellRange.Left then CellRange.Left:=RowList[i].MinCol;
end;
if CellRange.Right>0 then Dec(CellRange.Right); //MaxCol is the max col+1
end;
procedure TCells.WriteDimensions(const DataStream: TStream; const CellRange: TXlsCellRange);
var
DimRec: TDimensionsRecord;
DimRecDat: PDimensionsRec;
begin
GetMem(DimRecDat, SizeOf(TDimensionsRec));
try
DimRecDat.FirstRow:=CellRange.Top;
DimRecDat.LastRow:=CellRange.Bottom+1; //This adds an extra row. Dimensions do from firstrow to lastrow+1
DimRecDat.FirstCol:=CellRange.Left;
DimRecDat.LastCol:=CellRange.Right+1;
DimRecDat.Extra:=0;
DimRec:=TDimensionsRecord.Create(xlr_DIMENSIONS, PArrayOfByte(DimRecDat), SizeOf(TDimensionsRec));
except
FreeMem(DimRecDat);
raise;
end;
try
DimRec.SaveToStream(DataStream);
finally
FreeAndNil(DimRec);
end; //Finally
end;
procedure TCells.SaveToStream(const DataStream: TStream);
var
CellRange: TXlsCellRange;
begin
FixRows;
CalcUsedRange(CellRange);
SaveRangetoStream(DataStream, CellRange);
end;
function TCells.TotalSize: int64;
begin
TotalSize:= DimensionsSize + FRowList.TotalSize + FCellList.TotalSize;
end;
procedure TCells.FixRows;
var
i: integer;
begin
if FRowList.Count>= FCellList.Count then exit;
for i:=0 to FCellList.Count - 1 do
if (not FRowList.HasRow(i) and (FCellList[i].Count>0)) then FRowList.AddRow(i);
if (FCellList.Count >0) then FRowList.AddRow(FCellList.Count-1);
end;
procedure TCells.SaveRangeToStream(const DataStream: TStream; const CellRange: TXlsCellRange);
var
i,k,j, Written :integer;
begin
FixRows;
WriteDimensions(DataStream, CellRange);
i:=CellRange.Top;
while (i<=CellRange.Bottom) do
begin
k:=0;Written:=0;
while (Written<32) and (k+i<=CellRange.Bottom) do
begin
if FRowList.HasRow(k+i) then
begin
FRowList[k+i].SaveRangeToStream(DataStream, CellRange.Left, CellRange.Right);
//inc(Written); //We want 32 records in total, counting blanks. that's why not here
end;
inc(Written);
inc(k);
end;
for j:= i to k+i-1 do
if (j<=CellRange.Bottom) and (j<FCellList.Count) then FCellList[j].SaveRangeToStream(DataStream, CellRange);
inc(i, k);
end;
end;
function TCells.TotalRangeSize(const CellRange: TXlsCellRange): int64;
begin
TotalRangeSize:= DimensionsSize + FRowList.TotalRangeSize(CellRange) + FCellList.TotalRangeSize(CellRange);
end;
procedure TCells.ArrangeInsertSheet(const SheetInfo: TSheetInfo);
begin
FCellList.ArrangeInsertSheet(SheetInfo);
end;
{ TRangeList }
procedure TRangeList.CopyFrom(const aRangeList: TRangeList);
var
i: integer;
begin
for i:=0 to aRangeList.Count - 1 do
Add(aRangeList.Items[i].CopyTo);
end;
procedure TRangeList.DeleteRowsOrCols(const aRow, aCount: word;
const SheetInfo: TSheetInfo; const UseCols: boolean);
var
i: integer;
begin
for i:=0 to Count-1 do Items[i].DeleteRowsOrCols(aRow, aCount, SheetInfo, UseCols);
end;
procedure TRangeList.InsertAndCopyRowsOrCols(const FirstRow, LastRow, DestRow,
aCount: integer; const SheetInfo: TSheetInfo; const UseCols: boolean);
var
i: integer;
begin
for i:=0 to Count-1 do Items[i].InsertAndCopyRowsOrCols(FirstRow, LastRow, DestRow, aCount, SheetInfo, UseCols);
end;
procedure TRangeList.SaveRangeToStream(const DataStream: TStream; const CellRange: TXlsCellRange);
var
i:integer;
begin
for i:=0 to Count-1 do Items[i].SaveRangeToStream(DataStream, CellRange);
end;
procedure TRangeList.SaveToStream(const DataStream: TStream);
var
i:integer;
begin
for i:=0 to Count-1 do Items[i].SaveToStream(DataStream);
end;
function TRangeList.TotalRangeSize(const CellRange: TXlsCellRange): int64;
var
i:integer;
begin
Result:=0;
for i:=0 to Count-1 do Result:=Result+Items[i].TotalRangeSize(CellRange);
end;
function TRangeList.TotalSize: int64;
var
i:integer;
begin
Result:=0;
for i:=0 to Count-1 do Result:=Result+Items[i].TotalSize;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -