好多办公软件特别是财务软件,都需要配备把数据导出到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,
, );
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 := ;
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[..] of Word = ($, , , $, , );
arXlsEnd: array[..] of Word = ($0A, );
arXlsString: array[..] of Word = ($, , , , , );
arXlsNumber: array[..] of Word = ($, , , , );
arXlsInteger: array[..] of Word = ($27E, , , , );
arXlsBlank: array[..] of Word = ($, , , , $); Procedure ExportExcelFile(FileName: string; bWriteTitle: Boolean);
//.....
implementation
//.....
Procedure ExportExcelFile(FileName: string; bWriteTitle: Boolean);
const
coltitle: array [ .. ] of string = ('第一行', '第二行', '第三行', '第四行'); type
TArrContent = array [ .. , .. ] 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) - then
begin
Inc(row);
Col := ;
end
else
Inc(Col);
end; procedure WriteStringCell(AValue: AnsiString); // 写字符串数据, 在Delphi7之后的版本,string使用Unicode编码的,要AnsiString,不然会出现中文乱码
var
L: Word;
begin
L := Length(AValue);
arXlsString[] := + L;
arXlsString[] := row;
arXlsString[] := Col;
arXlsString[] := L;
aFileStream.WriteBuffer(arXlsString, SizeOf(arXlsString));
aFileStream.WriteBuffer(AValue[], L);
incColRow;
end; procedure WriteIntegerCell(AValue: Integer); // 写整数
var
V: Integer;
begin
arXlsInteger[] := row;
arXlsInteger[] := Col;
aFileStream.WriteBuffer(arXlsInteger, SizeOf(arXlsInteger));
V := (AValue shl ) or ;
aFileStream.WriteBuffer(V, );
incColRow;
end; procedure WriteFloatCell(AValue: double); // 写浮点数
begin
arXlsNumber[] := row;
arXlsNumber[] := Col;
aFileStream.WriteBuffer(arXlsNumber, SizeOf(arXlsNumber));
aFileStream.WriteBuffer(AValue, );
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 := ;
row := ;
if bWriteTitle then
begin
for i := to Length(coltitle) - 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 := to RzListView1.Columns.Count - do
str := str + RzListView1.Columns[i].DisplayName + Char();
str := str + #; for i := to RzListView1.Items.Count - do
begin
str := str + RzListView1.Items[i].Caption + Char();
for j := to RzListView1.Items[i].SubItems.Count - do
begin
str := str + RzListView1.Items[i].SubItems[j] + Char();
end; str := str + #;
end;
s := TStringList.Create;
s.Add(str);
s.SaveToFile('c:\temp.xls'); // 保存到c:\temp.xls
s.Free;
end;

TStringList转Excel

此方法不做详细解释

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

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

  1. 学习笔记 DataGridView数据导出为Excel

    DataGridView数据导出为Excel   怎样把WinForm下的“DGV”里的绑定数据库后的数据导出到Excel中. 比如:在窗体里有个一“DGV”,DataGridView1,绑定了数据源 ...

  2. 将C1Chart数据导出到Excel

    大多数情况下,当我们说将图表导出到Excel时,意思是将Chart当成图片导出到Excel中.如果是这样,你可以参考帮助文档中保存和导出C1Chart章节. 不过,也有另一种情况,当你想把图表中的数据 ...

  3. vb.net-三种将datagridview数据导出为excel文件的函数

    第一种方法较慢,但是数据格式都比较好,需要引用excel的 Microsoft.Office.Interop.Excel.dll  office.dll #Region "导出excel函数 ...

  4. 数据导出至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; ...

  5. 数据导出到Excel中

    自己修改后的一个数据导出到Excel的方法,粘出来与大家共享. 只需要将             System.Web.HttpContext.Current.Response.Charset =   ...

  6. asp.net将数据导出到excel

    本次应用datatable导出,若用gridview(假设gridview设为了分页显示)会出现只导出当前页的情况. protected void btnPrn_Click(object sender ...

  7. 将datagrid中数据导出到excel中 -------<<工作日志2014-6-6>>

    前台datagrid数据绑定 #region 导出到excel中    /// <summary>    /// 2014-6-6    /// </summary>    / ...

  8. 机房收费系统——在VB中将MSHFlexGrid控件中的数据导出到Excel

    机房收费系统中,好多查询的窗体都包含同一个功能:将数据库中查询到的数据显示在MSHFlexGrid控件中,然后再把MSHFlexGrid控件中的数据导出到Excel表格中. 虽然之前做过学生信息管理系 ...

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

    如果你在做一个报表类的程序,可能将内容导出为Excel文件是一项必须的功能.之前使用MFC的时候我就写过一个类,用于将grid中的数据导出为Excel文件.在使用了QtSql模块后,我很容易的将这个类 ...

随机推荐

  1. 5.list集合添加姓名{张三,李四,王五,二丫,钱六,孙七},将二丫替换为王小丫, 写入到"D:\\stuinfo.txt"

    package cn.it.text; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayLis ...

  2. 通过Long类型的出生日期算年龄

    package com.utils; import java.text.ParseException; import java.text.SimpleDateFormat; import java.u ...

  3. svg---基础1

    svg:可缩放矢量图形是基于可扩展标记语言(标准通用标记语言的子集),用于描述二维矢量图形的一种图形格式.它由万维网制定,是一个开放标准. 官网:http://www.w3.org/2000/svg ...

  4. linux下编译时遇到fatal error: openssl/sha.h: No such file or directory怎么办?

    答:安装ssl开发库 ubuntu下的安装方法为: sudo apt-get install libssl-dev -y

  5. 关于html中的 script标签中的 代码写法有效性? easyui tabs的href不能载入内容页面

    script标签, 即 html中的 js脚本区域中: 它其实就是一个 普通的 html标签, 在 html 渲染器 parser 看来, 它跟其他任何的普通 的 html标签 , 比如 p 标签, ...

  6. HDU 3565 Bi-peak Number(数位DP)题解

    题意:我们定义每一位先严格递增(第一位不为0)后严格递减的数为峰(比如1231),一个数由两个峰组成称为双峰,一个双峰的价值为每一位位数和,问L~R双峰最大价值 思路:数位DP.显然这个问题和pos有 ...

  7. eclipse 下修改Dynamic Web Modulle 的问题

    上图右侧圈中位置  有提示对应jdk版本. 若在eclipse修改Dynamic Web Modulle 为3.0失败,可以去项目工作空间文件中的.seting文件下修改: 上图对应的 <ins ...

  8. Redhat更换yum源

    redhat 默认自带的 yum 源需要注册,才能更新,所以对于我们来说需要替换掉redhat的yum源.下文更换为网易的. 删除原有的yum rpm -qa|grep yum|xargs rpm - ...

  9. lambda 委托 匿名方法

    委托: delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类.与其它的类不同,delegate类能够拥有一个签名(signature),并且它只能持有与它的签名相匹配的方法的 ...

  10. zookeeper调试命令

    转载自 https://www.cnblogs.com/andy6/p/7674028.html 一.zkServer.sh 1.查看 zkServer.sh 帮助信息[root@bigdata05 ...