我写了一段代码从dbgrid中导出一个excel文件。下面是以下代码:
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文件,以便每列根据每个数据提供正确的宽度值?谢谢。
发布于 2018-07-31 20:46:41
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;
发布于 2018-07-30 10:04:08
您可以使用Columns[i].ColumnWidth
设置每列的宽度。
var
ColRange: Variant;
ColRange := xlsheet.Columns;
ColRange.Columns[1].ColumnWidth := 12;
https://stackoverflow.com/questions/51585984
复制相似问题