Настройка импортированного файла Excel из Delphi

Я пишу код для экспорта файла Excel из dbgrid. Вот следующий код:

    var i, x:integer;
sfile:string;
begin
XlApp:=createoleobject('Excel.Application');
XlBook:=XlApp.WorkBooks.Add;
XlSheet:= XlBook.worksheets.add;
for i:=0 to dbgrid1.fieldcount-1 do begin
xlsheet.cells[1,i+1].value:=dbgrid1.columns[i].title.caption;
end;
zquery1.first;
x:=1;
while not zquery1.eof do begin
xlsheet.cells[x+1,1].value:=x;
for i:=1 to dbgrid1.fieldcount-1 do begin
xlsheet.cells[x+1, i+1].value:=dbgrid1.fields[i].text;
end;
zquery1.next;
inc(x);
end;
xlapp.visible:=true;
end;

это работает просто отлично, но стол такой грязный. Как я могу настроить этот файл Excel так, чтобы каждый столбец давал правильное значение ширины в соответствии с данными? Благодарю.

2 ответа

Excel Range имеет AutoFit метод, который сделает это за вас одним вызовом, и вам не нужно экспериментировать, чтобы выяснить, какую ширину вам нужно назначить каждому столбцу.

Вот пример (протестированный в Delphi 2007), который создает двумерный вариантный массив, заполняет его образцом текста, который является слишком широким для размещения ячейки Excel по умолчанию, присваивает этот текст диапазону Excel и автоматически расширяет все ячейки в этом диапазоне до правильная ширина для текста (аналогично тому, что происходит, если дважды щелкнуть разделитель между столбцами в Excel). Вы должны быть в состоянии легко адаптировать оба этих способа для автоматической ширины текста (и гораздо более быстрый способ передачи данных в Excel через автоматизацию) для работы с вашим кодом.

Для демонстрации я поместил код в TButton.OnClick обработчик события.

uses
  ComObj, ActiveX;

procedure TForm3.Button1Click(Sender: TObject);
var
  xls, wb, Range: OLEVariant;
  arrData: Variant;
  RowCount, ColCount, i, j: Integer;
begin
  {create variant array where we'll copy our data}
  RowCount := 10;
  ColCount := 10;
  arrData := VarArrayCreate([1, RowCount, 1, ColCount], varVariant);

  {fill array}
  for i := 1 to RowCount do
    for j := 1 to ColCount do
      arrData[i, j] := Format('This is test text #%d-%d', [i, j]);

  {initialize an instance of Excel}
  xls := CreateOLEObject('Excel.Application');

  {create workbook}
  wb := xls.Workbooks.Add;

  {retrieve a range where data must be placed}
  Range := wb.WorkSheets[1].Range[wb.WorkSheets[1].Cells[1, 1],
                                  wb.WorkSheets[1].Cells[RowCount, ColCount]];

  { copy data from the array into an Excel Range, and then use AutoFit to size them }
  Range.Value := arrData;
  Range.Columns.AutoFit;

  {show Excel with our data}
  xls.Visible := True;
end;

Вы можете установить ширину каждого столбца, используя Columns[i].ColumnWidth,

var
  ColRange: Variant;

ColRange := xlsheet.Columns;
ColRange.Columns[1].ColumnWidth := 12;
Другие вопросы по тегам