Delphi 数据导出到Excel

好多办公软件特别是财务软件,都需要配备把数据导出到Excel,下面就来介绍两种数据导出方法

1.ADODB导出查询结果(此方法需要安装Excel)

2.二维表数据导出(根据Excel文件结构生成二进制文件流,不需要安装Excel)

3.如果涉及到复杂表头的(例如合并字段等),未做研究,下面也没介绍相关资料,请止步。

第一种,ADODB导出查询结果(此方法需要安装Excel)

//uses DB, ADODB, ComObj, ComCtrls,  excel2000,  StdCtrls, adoint,
var
  xlApp, xlBook, xlSheet, xlQuery: Variant;
  adoConnection, adoRecordset: Variant;
begin
  adoConnection := CreateOleobject(‘ADODB.Connection‘);
  adoRecordset := CreateOleobject(‘ADODB.Recordset‘);
  adoConnection.Open(
    ‘Provider=MSDASQL.1;Password=000000;Persist Security Info=True;User ID=my_username;Data Source=tax_ora;Extended Properties="DSN=tax_ora;UID=net_user;PWD=000000;DBQ=TAX_ORA101;DBA=W;APA=T;EXC=F;FEN=T;QTO=T;‘ + ‘FRC=10;FDL=10;LOB=T;RST=T;BTD=F;BNF=F;BAM=IfAllSuccessful;NUM=NLS;DPM=F;MTS=T;MDI=F;CSR=F;FWC=F;FBS=64000;TLO=O;MLD=0;ODA=F;"‘);
  adoRecordset.CursorLocation := adUseClient;
  adoRecordset.Open(‘select * from userinfo where rownum<100‘, adoConnection,
    1, 3);
  try
    xlApp := CreateOleobject(‘Excel.Application‘);
    xlBook := xlApp.Workbooks.Add;
    xlSheet := xlBook.WorkSheets[‘sheet1‘];

    // 设置这一列为 文本列 ,让 "00123" 正确显示,而不是自动转换为"123"
    xlSheet.Columns[‘C:C‘].NumberFormatLocal := ‘@‘;

    xlApp.Visible := True;

    // 把查询结果导入EXCEL数据
    xlQuery := xlSheet.QueryTables.Add(adoRecordset, xlSheet.Range[‘A1‘]);
    // 关键是这一句
    xlQuery.FieldNames := True;
    xlQuery.RowNumbers := False;
    xlQuery.FillAdjacentFormulas := False;
    xlQuery.PreserveFormatting := True;
    xlQuery.RefreshOnFileOpen := False;
    xlQuery.BackgroundQuery := True;
    // xlQuery.RefreshStyle := xlInsertDeleteCells;
    xlQuery.SavePassword := True;
    xlQuery.SaveData := True;
    xlQuery.AdjustColumnWidth := True;
    xlQuery.RefreshPeriod := 0;
    xlQuery.PreserveColumnInfo := True;
    xlQuery.FieldNames := True;
    xlQuery.Refresh;

    xlBook.SaveAs(‘c:\fromD.xls‘, xlNormal, ‘‘, ‘‘, False, False);

  finally
    if not VarIsEmpty(xlApp) then
    begin
      xlApp.DisplayAlerts := False;
      xlApp.ScreenUpdating := True;
      xlApp.Quit;
    end;
  end;
end;

ADODB导出查询结果

第二种,不需要安装Excel是它的绝对优势,而且不限于数据库表查询,你还可以导出listview,甚至你自定义的record数据。

var
  arXlsBegin: array[0..5] of Word = ($809, 8, 0, $10, 0, 0);
  arXlsEnd: array[0..1] of Word = ($0A, 00);
  arXlsString: array[0..5] of Word = ($204, 0, 0, 0, 0, 0);
  arXlsNumber: array[0..4] of Word = ($203, 14, 0, 0, 0);
  arXlsInteger: array[0..4] of Word = ($27E, 10, 0, 0, 0);
  arXlsBlank: array[0..4] of Word = ($201, 6, 0, 0, $17);

Procedure ExportExcelFile(FileName: string; bWriteTitle: Boolean);
//.....
implementation
//.....
Procedure ExportExcelFile(FileName: string; bWriteTitle: Boolean);
const
  coltitle: array [0 .. 3] of string = (‘第一行‘, ‘第二行‘, ‘第三行‘, ‘第四行‘);

type
  TArrContent = array [0 .. 3, 0 .. 3] of string;

var
  i, j: Integer;
  Col, row: Word;
  ABookMark: TBookMark;
  aFileStream: TFileStream;
  A: TArrContent;
  // ......
  procedure incColRow; // 增加行列号
  begin
    // if Col = aDataSet.FieldCount - 1 then
    if Col = Length(coltitle) - 1 then
    begin
      Inc(row);
      Col := 0;
    end
    else
      Inc(Col);
  end;

  procedure WriteStringCell(AValue: AnsiString); // 写字符串数据, 在Delphi7之后的版本,string使用Unicode编码的,要AnsiString,不然会出现中文乱码
  var
    L: Word;
  begin
    L := Length(AValue);
    arXlsString[1] := 8 + L;
    arXlsString[2] := row;
    arXlsString[3] := Col;
    arXlsString[5] := L;
    aFileStream.WriteBuffer(arXlsString, SizeOf(arXlsString));
    aFileStream.WriteBuffer(AValue[1], L);
    incColRow;
  end;

  procedure WriteIntegerCell(AValue: Integer); // 写整数
  var
    V: Integer;
  begin
    arXlsInteger[2] := row;
    arXlsInteger[3] := Col;
    aFileStream.WriteBuffer(arXlsInteger, SizeOf(arXlsInteger));
    V := (AValue shl 2) or 2;
    aFileStream.WriteBuffer(V, 4);
    incColRow;
  end;

  procedure WriteFloatCell(AValue: double); // 写浮点数
  begin
    arXlsNumber[2] := row;
    arXlsNumber[3] := Col;
    aFileStream.WriteBuffer(arXlsNumber, SizeOf(arXlsNumber));
    aFileStream.WriteBuffer(AValue, 8);
    incColRow;
  end;

// ......
begin
  for i := Low(A) to High(A) do
  begin
    for j := Low(A[i]) to High(A[i]) do
      A[i, j] := IntToStr(i) + ‘,‘ + IntToStr(j) + ‘ ‘;
  end;
  if FileExists(FileName) then
    DeleteFile(FileName); // 文件存在,先删除
  aFileStream := TFileStream.Create(FileName, fmCreate);
  Try // 写文件头
    aFileStream.WriteBuffer(arXlsBegin, SizeOf(arXlsBegin)); // 写列头
    Col := 0;
    row := 0;
    if bWriteTitle then
    begin
      for i := 0 to Length(coltitle) - 1 do
        WriteStringCell(coltitle[i]);
    end;

    for i := Low(A) to High(A) do
    begin
      for J := Low(A) to High(A) do
      begin
        WriteStringCell(A[i, j]);
        //此处可以判断A[i, j]的数据类型,分别调用
        //WriteIntegerCell()
        //WriteFloatCell()
      end;
    end;
    // 写文件尾
    aFileStream.WriteBuffer(arXlsEnd, SizeOf(arXlsEnd));
  Finally
    aFileStream.Free;
  end;
end;

文件流形式导出Excel

ExportExcelFile(‘d:\数据2.xls‘, True);

调用

调用结果

三、有一种直接把TStringList保存为Excel的,也可以,很方便,但是遇到数值字段的时候会变成科学记数法形式,所以我没有使用这个方法。

var
  s: TStringList;
  str: string;
  i, j: Integer;
begin
  str := ‘‘;
  for i := 0 to RzListView1.Columns.Count - 1 do
    str := str + RzListView1.Columns[i].DisplayName + Char(9);
  str := str + #13;

  for i := 0 to RzListView1.Items.Count - 1 do
  begin
    str := str + RzListView1.Items[i].Caption + Char(9);
    for j := 0 to RzListView1.Items[i].SubItems.Count - 1 do
    begin
      str := str + RzListView1.Items[i].SubItems[j] + Char(9);
    end;

    str := str + #13;
  end;
  s := TStringList.Create;
  s.Add(str);
  s.SaveToFile(‘c:\temp.xls‘); // 保存到c:\temp.xls
  s.Free;
end;

TStringList转Excel

此方法不做详细解释

此文章参考资料来自:Delphi 导出数据至Excel的7种方法

时间: 2024-10-25 17:13:06

Delphi 数据导出到Excel的相关文章

支持将数据导出到Excel文档的时候设置单元格格式的.NET控件Spire.DataExport

Spire.DataExport for .NET是e-iceblue公司推出的一款数据导出类.NET控件.作为一款专业的数据导出控件,Spire.DataExport for .NET可以帮助开发人员轻松快速的从各种主流数据库中导出数据并存储于各种文件格式中.他支持从SQL Command, DataTable,ListView中导出数据并存储于MS Excel,MS Word, HTML, XML, PDF, MS Access, DBF, SQL Script, SYLK, DIF, CS

数据导出至Excel文件--好库编程网http://code1.okbase.net/codefile/SerializeHelper.cs_2012122018724_118.htm

using System; using System.IO; using System.Data; using System.Collections; using System.Data.OleDb; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; /// <summary> /// Excel操作类 /// </summary> /// Microsoft Excel 11.0 Obj

tablib把数据导出为Excel、JSON、CSV等格式的Py库(写入数据并导出exl)

#tablib把数据导出为Excel.JSON.CSV等格式的Py库 #python 3 import tablib #定义列标题 headers = ('1列', '2列', '3列', '4列', '5列') #需写入的数据,按照一行一行的输入 #元组数据的个数必须和列数一致 data = [('23','23','34','23','34'),('sadf','23','sdf','23','fsad')] #写入数据 mylist = tablib.Dataset(*data, head

Qt中将QTableView中的数据导出为Excel文件

如果你在做一个报表类的程序,可能将内容导出为Excel文件是一项必须的功能.之前使用MFC的时候我就写过一个类,用于将grid中的数据导出为Excel文件.在使用了QtSql模块后,我很容易的将这个类改写应用在Qt程序中.类的名字叫“ExportExcelObject”.使用起来很简单: [cpp] view plaincopy // 1. declare an object // – fileName Excel 文件路径 // – sheetName Excel 工作表(sheet)名称 /

将数据库的数据导出到excel中

这篇文章主要介绍了asp中把数据导出为excel的2种方法:分别用excel组件.文件组件实现,需要的朋友可以参考下.我们在做项目的时候经常要将数据库的数据导出到excel中,很多asp用户并不知道怎么写.这里总结了两种方法来导出excel,希望能帮到大家. 方法一:用excel组件 方法二:使用文件组件 可以看出,第一种方法是直接导出的是excel文件,而第二张方法是到处的是文本文件,只不过后缀名改成了xls. 然后看起来就是excel了. 经过对比第一种方法的效率没有第二种方法的效率高,而且

C#创建Excel文件并将数据导出到Excel文件

C#创建Excel文件,这里实际上是从资源中提取一个事先创建好的Excel文件,文件提取成功后,使用OleDb方法连接Excel,向Excel文件中写入数据. 创建解决方案 菜单>新建>项目>Windows窗体应用程序: 添加相关组件: 添加两个DataGridView,一个TextBox,两个按钮 ,如下图: 添加Excel资源: 先在文件夹中新建一个Excel文件,在Sheet1表的第一行设置列名: 双击"Resources.resx"文件打开资源文件视图: 添加

使用原生php将数据库数据导出到excel文件中

最近在工作中遇到一个需求,需要将数据库中的数据导出到excel文件中,并下载excel文件.因为以前没做过,所以就百度了一下, 网上说的大多是使用PHPExcel类来操作excel文件,这还要去下载这个类才能使用,而我只想使用原生的php,不想那么麻烦,好在 也有网友说到关于原生php生成excel文件的方法,其实很简单,下面把我结合网上资料自己实践的代码分享一下. 一般我们这种导数据的操作都是通过用户在网页页面上点击某个按钮触发相应js方法,然后请求php接口来实现的,所以主要有两种 方法来完

asp.net 将repeater上数据导出到excel

1,首先得到一个DataTable public DataTable GetTable(string sql) { SqlConnnection con=new SqlConnection(ConfigurationManager.ConnectionStrings["connectionstringname"].ConnectionString); con.Open(); SqlCommand cmd = new SqlCommand(sql, con); SqlDataAdapte

JavaScript将网页表格数据导出为Excel文件

不使用服务器端的技术,直接使用js将网页中的表格数据导出为excel文件,支持所有浏览器:前提条件是:网页中的表格数据必须使用table标签排版且不能有任何错误. <!DOCTYPE HTML> <html> <head> <title>javascript exportExcel</title> </head> <body> <table id="name" border="1&quo