Настройка импортированного файла 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;