📄 tmsuxlsrowcolentries.pas
字号:
if (Adjustment <> 1) and (Adjustment >= 0) then
MaxWidth := Round(MaxWidth * Adjustment) ;
if MaxWidth > 32767 then
MaxWidth := 32767;
if MaxWidth > 0 then
TExcelFile(Workbook).ColumnWidth[Column + 1]:= MaxWidth;
end;
procedure TCellList.RecalcColWidths(const Workbook: pointer; const Col1, Col2: integer; const IgnoreStrings: Boolean; const Adjustment: Extended);
var
ColCalc: TColWidthCalc;
RowMultDisplay: Extended;
ColMultDisplay: Extended;
c: integer;
begin
ColCalc := TColWidthCalc.Create(FGlobals);
try
RowMultDisplay := RowMult;
ColMultDisplay := ColMult;
for c := Col1 to Col2 do
begin
AutofitColumn(Workbook, c, ColCalc, RowMultDisplay, ColMultDisplay, IgnoreStrings, Adjustment);
end;
finally
FreeAndNil(ColCalc);
end;
end;
procedure TCellList.ArrangeInsertRowsAndCols(const InsRowPos, InsRowCount,
InsColPos, InsColCount: integer; const SheetInfo: TSheetInfo);
begin
inherited ArrangeInsertRowsAndCols(InsRowPos, InsRowCount, InsColPos, InsColCount, SheetInfo);
if (InsColCount > 0) then
FColInfoList.ArrangeInsertCols(InsColPos, InsColCount, SheetInfo);
end;
procedure TCellList.InsertAndCopyCols(const FirstCol, LastCol, DestCol,
aCount: integer; const SheetInfo: TSheetInfo;
const OnlyFormulas: boolean);
var
NewFirstCol: integer;
NewLastCol: integer;
begin
inherited InsertAndCopyCols(FirstCol, LastCol, DestCol, aCount, SheetInfo, OnlyFormulas);
if (aCount > 0) then
begin
NewFirstCol := FirstCol;
NewLastCol := LastCol;
if (DestCol <= FirstCol) then
begin
NewFirstCol := FirstCol + (LastCol - FirstCol + 1) * aCount;
NewLastCol := LastCol + (LastCol - FirstCol + 1) * aCount;
end;
FColInfoList.CopyCols(NewFirstCol, NewLastCol, DestCol, aCount, SheetInfo);
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: TOle2File; 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: TOle2File);
var
CellRange: TXlsCellRange;
begin
CalcUsedRange(CellRange);
SaveRangetoStream(DataStream, CellRange);
end;
function TCells.TotalSize: int64;
begin
Result := FixTotalSize(false);
end;
function TCells.FixTotalSize(const NeedsRecalc: boolean): int64;
begin
Result:= DimensionsSize + FRowList.TotalSize + FCellList.FixTotalSize(NeedsRecalc);
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: TOle2File; const CellRange: TXlsCellRange);
var
i,k,j, Written :integer;
begin
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, false) + 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: TOle2File; 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: TOle2File);
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;
{ TRowHeightCalc }
constructor TRowHeightCalc.Create(const aWg: TWorkbookGlobals);
begin
inherited Create;
Wg := aWg;
bmp := TBitmap.Create;
bmp.Height := 1;
bmp.Width := 1;
Canvas := bmp.Canvas;
InitXF;
end;
procedure TRowHeightCalc.InitXF();
var
i: integer;
xf: TXFRecord;
FontIndex: integer;
Fr: TFontRecord;
begin
SetLength (XFHeight, Wg.XF.Count);
FillChar(XFHeight[0], Length(XFHeight), 0);
SetLength (XFFonts, Length(XFHeight));
FillChar(XFFonts[0], Length(XFFonts), 0);
for i := 0 to Length(XFHeight) - 1 do
begin
xf := Wg.XF[i];
FontIndex := xf.GetActualFontIndex(Wg.Fonts);
Fr := Wg.Fonts[FontIndex];
XFFonts[i] := Fr.FlxFont;
Canvas.Font.Name := XFFonts[i].Name;
Canvas.Font.Size := Round(XFFonts[i].Size20 / 20);
XFHeight[i] := Ceil(Canvas.TextHeight('Mg') * RowMult);
end;
end;
function CalcAngle(const ExcelRotation: integer; var Vertical: boolean): extended;
begin
Vertical:=ExcelRotation=255;
if ExcelRotation<0 then Result:=0
else if ExcelRotation<=90 then Result:=ExcelRotation*2*pi/360
else if ExcelRotation<=180 then Result:=(90-ExcelRotation)*2*pi/360
else Result:=0;
end;
function TRowHeightCalc.CalcCellHeight(const Row: integer; const Col: integer; const val: TRichString; const XF: integer; const Workbook: pointer; const RowMultDisplay: Extended; const ColMultDisplay: Extended): integer;
begin
Result := 255;
end;
destructor TRowHeightCalc.Destroy;
begin
FreeAndNil(bmp);
inherited;
end;
{ TColWidthCalc }
constructor TColWidthCalc.Create(const aWg: TWorkbookGlobals);
begin
inherited Create;
Wg := aWg;
bmp := TBitmap.Create;
bmp.Height := 1;
bmp.Width := 1;
Canvas := bmp.Canvas;
InitXF;
end;
procedure TColWidthCalc.InitXF();
var
i: integer;
xf: TXFRecord;
FontIndex: integer;
Fr: TFontRecord;
begin
SetLength (XFFonts, Wg.XF.Count);
FillChar(XFFonts[0], Length(XFFonts), 0);
for i := 0 to Length(XFFonts) - 1 do
begin
xf := Wg.XF[i];
FontIndex := xf.GetActualFontIndex(Wg.Fonts);
Fr := Wg.Fonts[FontIndex];
XFFonts[i] := Fr.FlxFont;
end;
end;
function TColWidthCalc.CalcCellWidth(const Row: integer; const Col: integer; const val: TRichString; const XF: integer; const Workbook: pointer; const RowMultDisplay: Extended; const ColMultDisplay: Extended): integer;
begin
Result := 0;
end;
destructor TColWidthCalc.Destroy;
begin
FreeAndNil(bmp);
inherited;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -