使用标题和设置列宽保存字符串网格

时间:2018-02-08 08:17:54

标签: delphi delphi-10.1-berlin

我想将所有String网格数据保存到.xls文件中。我找到了一个似乎没问题的解决方案,但缺少第一个固定行(列标题)。我怎么能保存它?另一件事是可以将col宽度设置为等于我的String网格吗?

非常感谢任何帮助。

procedure SaveToXls;
var
  lXls, lWb, lRange: OLEVariant;
  lArrData: Variant;
  lRowCount, lColCount, I, J: Integer;
begin
  lRowCount := stGrid.RowCount;
  lColCount := stGrid.ColCount;
  lArrData := VarArrayCreate([1, lRowCount, 1, lColCount], varVariant);

  for i := 1 to lRowCount do
    for j := 1 to lColCount do
      lArrData[i, j] := stGrid.Cells[j-1, i-1];

  lXls := CreateOLEObject('Excel.Application');
  lWb := lXls.Workbooks.Add;
  lRange := lWb.WorkSheets[1].Range[lWb.WorkSheets[1].Cells[1, 1],
  lWb.WorkSheets[1].Cells[lRowCount, lColCount]];

  lRange.Value := lArrData;
  lXls.Visible := True;
end;

1 个答案:

答案 0 :(得分:1)

对我来说代码有效。要设置列宽,假设使用可变字体,以下工作(Excel宽度是字符宽度的倍数' 0'对于可变字体):

function TForm1.CalcWidth: integer;
var
  iWidthZero : integer;
begin
  // assume variable font
  iWidthZero := stGrid.Canvas.TextWidth('0');
  Result := (stGrid.DefaultColWidth + iWidthZero - 1) div iWidthZero;
end;

并添加到您显示的功能

  lRange.ColumnWidth := CalcWidth;

在底部。

显然,如果您愿意,类似的方法可以逐列工作,但您必须相应地设置范围。