⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rm_wawexcel.pas

📁 这是一个功能强大
💻 PAS
📖 第 1 页 / 共 3 页
字号:
    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 + -