📄 rm_wawexcel.pas
字号:
Result := WorkBook.FSheets.IndexOf(Self);
end;
procedure TwawXLSWorksheet.SetTitle(Value: string);
begin
FTitle := Trim(Copy(Value, 1, 31));
end;
function TwawXLSWorksheet.GetColByIndex(i: Integer): TwawXLSCol;
begin
Result := TwawXLSCol(FCols.Items[i]);
end;
function TwawXLSWorksheet.GetRowByIndex(i: Integer): TwawXLSRow;
begin
Result := TwawXLSRow(FRows.Items[i]);
end;
function TwawXLSWorksheet.GetColsCount: Integer;
begin
Result := FCols.Count;
end;
function TwawXLSWorksheet.GetRowsCount: Integer;
begin
Result := FRows.Count;
end;
function TwawXLSWorksheet.GetRangesCount: Integer;
begin
Result := FRanges.Count;
end;
function TwawXLSWorksheet.GetXLSRange(RangeIndex: Integer): TwawXLSRange;
begin
Result := TwawXLSRange(FRanges.List[RangeIndex]);
end;
function TwawXLSWorksheet.GetCol(ColIndex: Integer): TwawXLSCol;
begin
Result := FindCol(ColIndex);
if Result = nil then
Result := AddCol(ColIndex);
end;
function TwawXLSWorksheet.GetRow(RowIndex: Integer): TwawXLSRow;
begin
Result := FindRow(RowIndex);
if Result = nil then
Result := AddRow(RowIndex);
end;
function TwawXLSWorksheet.FindRow(RowIndex: Integer): TwawXLSRow;
var
i: Integer;
begin
Result := nil;
for i := 0 to FRows.Count - 1 do
if TwawXLSRow(FRows.Items[i]).Ind = RowIndex then
begin
Result := TwawXLSRow(FRows.Items[i]);
break;
end;
end;
function TwawXLSWorksheet.AddRow(RowIndex: Integer): TwawXLSRow;
begin
Result := TwawXLSRow.Create;
Result.FInd := RowIndex;
FRows.Add(Result);
// change FDimensions
if (FDimensions.Top = -1) or (RowIndex < FDimensions.Top) then
FDimensions.Top := RowIndex;
if (FDimensions.Bottom = -1) or (RowIndex > FDimensions.Bottom) then
FDimensions.Bottom := RowIndex;
end;
function TwawXLSWorksheet.FindCol(ColIndex: Integer): TwawXLSCol;
var
i: Integer;
begin
Result := nil;
for i := 0 to FCols.Count - 1 do
if TwawXLSCol(FCols.Items[i]).Ind = ColIndex then
begin
Result := TwawXLSCol(FCols.Items[i]);
break;
end;
end;
function TwawXLSWorksheet.GetDefaultColumnPixelWidth: Integer;
begin
Result := GetCharacterWidth * (XLSDefaultColumnWidthInChars + 1); //waw
end;
function TwawXLSWorksheet.GetDefaultRowPixelHeight: Integer;
begin
Result := MulDiv(GetPixelPerInch, XLSDefaultRowHeight, wawPointPerInch14);
end;
function TwawXLSWorksheet.AddCol(ColIndex: Integer): TwawXLSCol;
begin
Result := TwawXLSCol.Create;
Result.FInd := ColIndex;
FCols.Add(Result);
// change FDimensions
if (FDimensions.Left = -1) or (ColIndex < FDimensions.Left) then
FDimensions.Left := ColIndex;
if (FDimensions.Right = -1) or (ColIndex > FDimensions.Right) then
FDimensions.Right := ColIndex;
end;
procedure TwawXLSWorksheet.SetMaxRangeLength(Value: Integer);
begin
if Value > FMaxRangeLength then
FMaxRangeLength := Value;
end;
procedure TwawXLSWorksheet.ResetMaxRangeLength;
var
i: Integer;
begin
FMaxRangeLength := 1;
for i := 0 to FRanges.Count - 1 do
SetMaxRangeLength(RangeByIndex[i].FPlace.Bottom - RangeByIndex[i].FPlace.Top + 1);
end;
function TwawXLSWorksheet.SeekTop(Value: Integer): Integer;
var
h_rule: Integer;
l_rule: Integer;
m_rule: Integer;
begin
case FRanges.Count of
0: Result := 0;
1:
begin
if RangeByIndex[0].FPlace.Top < Value then
Result := FRanges.Count
else
Result := 0;
end;
else
begin
if RangeByIndex[FRanges.Count - 1].FPlace.Top < Value then
Result := FRanges.Count
else
begin
l_rule := 0;
h_rule := FRanges.Count - 1;
repeat
begin
m_rule := h_rule + l_rule;
if (m_rule and 1) = 1 then
m_rule := (m_rule shr 1) + 1
else
m_rule := (m_rule shr 1);
if RangeByIndex[m_rule].FPlace.Top < Value then
l_rule := m_rule + 1
else
h_rule := l_rule;
end
until h_rule = l_rule;
Result := l_rule;
end;
end;
end;
end;
function TwawXLSWorksheet.ScanGet(Index: Integer; R: TRect; var RemoveFlag: Boolean): TwawXLSRange;
var
pos: Integer;
i: Integer;
fl_delete: Boolean;
fl_seek: Boolean;
begin
Result := TwawXLSRange(nil);
fl_seek := false;
if FRanges.Count = Index then
begin
Result := TwawXLSRange.Create(Self);
Result.FPlace := R;
FRanges.Add(Result);
end
else
begin
i := Index;
pos := Index;
repeat
begin
fl_delete := false;
if RectEqualRect(R, RangeByIndex[i].FPlace) then
begin
Result := RangeByIndex[i];
fl_seek := true;
Break;
end
else
if RectOverRect(R, RangeByIndex[i].FPlace) then
begin
RangeByIndex[i].Free;
FRanges.Delete(i);
RemoveFlag := true;
fl_delete := true;
end;
if not fl_delete and (RangeByIndex[pos].FPlace.Top <= R.Top) then Inc(pos);
if not fl_delete and (RangeByIndex[i].FPlace.Top <= R.Bottom) then Inc(i);
if FRanges.Count = i then Break;
end;
until RangeByIndex[i].FPlace.Top > R.Bottom;
if Result = nil then
begin
Result := TwawXLSRange.Create(Self);
Result.FPlace := R;
end;
if not fl_seek then
begin
if FRanges.Count > pos then
FRanges.Insert(pos, Result)
else
FRanges.Add(Result);
end;
end;
end;
function TwawXLSWorksheet.GetRangeSp(xl: Integer; yt: Integer;
xr: Integer; yb: Integer): TwawXLSRange;
var
Index: Integer;
RemoveFlag: Boolean;
R: TRect;
begin
RemoveFlag := False;
R := Rect(xl, yt, xr, yb);
Index := SeekTop(yt - FMaxRangeLength + 1);
if Index = FRanges.Count then
begin
Result := TwawXLSRange.Create(Self);
Result.FPlace := R;
FRanges.Add(Result);
end
else
Result := ScanGet(Index, R, RemoveFlag);
if RemoveFlag then ResetMaxRangeLength
else
SetMaxRangeLength(yb - yt + 1);
if (FDimensions.Left = -1) or (FDimensions.Left > R.Left) then
FDimensions.Left := R.Left;
if (FDimensions.Top = -1) or (FDimensions.Top > R.Top) then
FDimensions.Top := R.Top;
if (FDimensions.Right = -1) or (FDimensions.Right < R.Right) then
FDimensions.Right := R.Right;
if (FDimensions.Bottom = -1) or (FDimensions.Bottom < R.Bottom) then
FDimensions.Bottom := R.Bottom;
end;
function TwawXLSWorksheet.AddImage(Left: Integer; Top: Integer;
Right: Integer; Bottom: Integer; Picture: TPicture; OwnsImage: Boolean):
TwawImage;
begin
Result := FImages[FImages.Add(TwawImage.Create(Left, Top, Right, Bottom, Picture, OwnsImage))];
end;
function TwawXLSWorksheet.AddImageWithOffsets(Left: Integer;
LeftCO: Integer; Top: Integer; TopCO: Integer; Right: Integer;
RightCO: Integer; Bottom: Integer; BottomCO: Integer; Picture: TPicture;
OwnsImage: Boolean): TwawImage;
begin
Result := FImages[FImages.Add(TwawImage.CreateWithOffsets(Left, LeftCO, Top, TopCO, Right, RightCO, Bottom, BottomCO, Picture, OwnsImage))];
end;
function TwawXLSWorksheet.AddImageScaled(Left: Integer; LeftCO: Integer;
Top: Integer; TopCO: Integer; ScalePercentX: Integer;
ScalePercentY: Integer; Picture: TPicture; OwnsImage: Boolean):
TwawImage;
begin
Result := FImages[FImages.Add(TwawImage.CreateScaled(Left, LeftCO, Top, TopCO, ScalePercentX, ScalePercentY, Picture, OwnsImage))];
end;
function TwawXLSWorksheet.GetPageBreak(i: Integer): Integer;
begin
Result := Integer(FPageBreaks[i]); //????
end;
function TwawXLSWorksheet.GetPageBreaksCount: Integer;
begin
Result := FPageBreaks.Count;
end;
procedure TwawXLSWorksheet.AddPageBreakAfterRow(RowNumber: Integer);
begin
if FPageBreaks.IndexOf(Pointer(RowNumber)) = -1 then
FPageBreaks.Add(Pointer(RowNumber));
end;
procedure TwawXLSWorksheet.DeletePageBreakAfterRow(RowNumber: Integer);
begin
FPageBreaks.Remove(Pointer(RowNumber));
end;
function TwawXLSWorksheet.FindPageBreak(RowNumber: Integer): Integer;
begin
Result := FPageBreaks.IndexOf(Pointer(RowNumber));
end;
constructor TwawXLSWorkbook.Create;
begin
UserNameOfExcel := 'wawReport';
FSheets := TList.Create;
end;
destructor TwawXLSWorkbook.Destroy;
begin
ClearSheets;
FSheets.Free;
end;
procedure TwawXLSWorkbook.ClearSheets;
var
i: Integer;
begin
for i := 0 to FSheets.Count - 1 do
TwawXLSWorkSheet(FSheets[i]).Free;
FSheets.Clear;
end;
procedure TwawXLSWorkbook.SetUserNameOfExcel(Value: string);
begin
FUserNameOfExcel := Trim(Copy(Value, 1, 66));
end;
function TwawXLSWorkbook.GetSheetsCount: Integer;
begin
Result := FSheets.Count;
end;
function TwawXLSWorkbook.GetXLSWorkSheet(i: Integer): TwawXLSWorksheet;
begin
Result := TwawXLSWorkSheet(FSheets[i]);
end;
procedure TwawXLSWorkbook.SaveAsXLSToFile(FileName: string);
var
Writer: TwawExcelWriter;
begin
Writer := TwawExcelWriter.Create;
try
Writer.Save(Self, FileName);
finally
Writer.Free;
end;
end;
procedure TwawXLSWorkbook.SaveAsHTMLToFile(FileName: string);
var
Writer: TwawHTMLWriter;
begin
Writer := TwawHTMLWriter.Create;
try
Writer.Save(Self, FileName);
finally
Writer.Free;
end;
end;
function TwawXLSWorkbook.AddSheet: TwawXLSWorksheet;
begin
Result := TwawXLSWorkSheet.Create(Self);
FSheets.Add(Result);
end;
function TwawXLSWorkbook.GetSheetIndex(SheetTitle: string): Integer;
begin
for Result := 0 to SheetsCount - 1 do
if Sheets[Result].Title = SheetTitle then break;
if Result >= SheetsCount then Result := -1;
end;
procedure TwawXLSWorkbook.Clear;
begin
ClearSheets;
end;
procedure TwawCustomWriter.Save(WorkBook: TwawXLSWorkbook; FileName: string);
begin
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -