1. 功能预览

运行预览

模板样式


存储返参

导出的Excel

2. 代码实现

//执行sql的函数
procedure TForm1.GetReportData(astrsql:string);
var
strSQL,err:string; i:integer;
begin
strSQL :='set QUOTED_IDENTIFIER off '+astrsql;
//strSQL := astrsql ;
//查询 可支持多个结果集的返回
DM.qryReport.Active:=False;
DM.qryReport.Close;
DM.qryReport.SQL.Clear;
DM.qryReport.SQL.Add(strSQL);
try
DM.qryReport.Open;
except on E: Exception do
begin
showmessage('执行SQL'+strsql+'异常!'+E.Message);
Exit;
end;
end;
end;
//获取桌面的路径
function TForm1.GetShellFolders(strDir: string): string;
const
regPath = '\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders';
var
Reg: TRegistry;
strFolders: string;
begin
Reg := TRegistry.Create;
try
Reg.RootKey := HKEY_CURRENT_USER;
if Reg.OpenKey(regPath, false) then
begin
strFolders := Reg.ReadString(strDir);
end;
finally
Reg.Free;
end;
result := strFolders;
end;
//文件导出按钮的事件
procedure TForm1.btn1Click(Sender: TObject);
var
excel,sheet :variant;
iValidRows: Integer; // 工作表的有效行
iValidCols: Integer; // 工作表的有效列
i,j,k,affect:integer;
strTemp,FieldName,reportname : string;//FieldName:对应数据的FieldName,
isList,isReadRowCol,isListLine :boolean;//isList:是否包含list,isReadRowCol:是否已经读取到了list开始的行号和列号,isListLine:本行是不是包含List
listColBegin,listColEnd:integer;//list的开始列号和结束列号
aAdoDataSetMaster,aAdoDataSetList :TADODataSet;
begin
GetReportData(trim(cbb2.Text));
aAdoDataSetMaster :=TADODataSet.Create(Self);
aAdoDataSetList:=TADODataSet.Create(Self); aAdoDataSetMaster.Recordset :=DM.qryReport.Recordset; //master数据集
aAdoDataSetList.Recordset:=DM.qryReport.NextRecordset(affect);//list数据集 excel := createoleobject('Excel.Application');
excel.WorkBooks.open(trim(cbb1.Text));
try
sheet := excel.Application.ActiveSheet;//.WorkSheets['sheet1']; iValidRows := sheet.UsedRange.Rows.Count; // 有效行数
iValidCols := sheet.UsedRange.Columns.Count; // 有效列数
//ShowMessage(IntToStr(iValidRows) + ', ' + IntToStr(iValidCols)); listColEnd := ;
isReadRowCol := false;
if aAdoDataSetList.recordcount> then //list数据集有数据
begin
isList := true
end
else
isList := false; if isList then
begin
for i := to iValidRows do
begin
for j := to iValidCols do
begin
// 读工作表单元格
strTemp := trim(sheet.Cells.Item[i, j]);
if pos('(<list>)',strTemp)= then continue;
if pos('(<list>)',strTemp)> then
begin
if listColBegin= then listColBegin := j;
listColEnd := j;
isReadRowCol := true;
end;
end;
if isReadRowCol then
begin
for k:= to aAdoDataSetList.recordcount- do
begin
excel.ActiveSheet.Rows[i+].Insert;
for j := listColBegin to listColEnd do
begin
strTemp := trim(sheet.Cells.Item[i, j]);
sheet.Cells.Item[i+, j]:=strTemp;
end
end;
break;//只要找到一个就行了
end;
end;
end;
iValidRows := sheet.UsedRange.Rows.Count; // 有效行数
iValidCols := sheet.UsedRange.Columns.Count; // 有效列数
//ShowMessage(IntToStr(iValidRows) + ', ' + IntToStr(iValidCols));
aAdoDataSetMaster.first;
aAdoDataSetList.first;
for i := to iValidRows do
begin
isListLine := false;
for j := to iValidCols do
begin
// 读工作表单元格
strTemp := trim(sheet.Cells.Item[i, j]);
if (pos('(<field>)',strTemp)=) and (pos('(<list>)',strTemp)=) then continue;
if pos('(<field>)',strTemp)> then
begin
FieldName := copy(strTemp,pos('(<field>)',strTemp)+length('(<field>)'),pos('(</field>)',strTemp)-pos('(<field>)',strTemp)-length('(<field>)'));
strTemp := stringreplace(strTemp,strTemp,aAdoDataSetMaster.FieldByName(FieldName).AsString,[rfReplaceAll]);
sheet.Cells.Item[i, j] := strTemp;
end
else if pos('(<list>)',strTemp)> then
begin
FieldName := copy(strTemp,pos('(<list>)',strTemp)+length('(<list>)'),pos('(</list>)',strTemp)-pos('(<list>)',strTemp)-length('(<list>)'));
strTemp := stringreplace(strTemp,strTemp,aAdoDataSetList.FieldByName(FieldName).AsString,[rfReplaceAll]);
sheet.Cells.Item[i, j] := strTemp;
isListLine := true;
end;
end;
if isListLine then aAdoDataSetList.Next;
end;
reportname:=GetShellFolders('Desktop')+'\外挂报表-Excel导出数据.xlsx';
sheet.SaveAs(reportname);
//excel.ActiveWorkBook.SaveAs('g:\aa.xls');
finally
excel.Quit;
sheet := Unassigned;
excel := Unassigned;
end;
showmessage('导出完成:'+reportname);
end;

Delphi实现带有格式的Excel导出功能的更多相关文章

  1. Atitit.excel导出 功能解决方案 php java C#.net版总集合.doc

    Atitit.excel导出 功能解决方案 php java C#.net版总集合.docx 1.1. Excel的保存格式office2003 office2007/2010格式1 1.2. 类库选 ...

  2. 用SpringMvc实现Excel导出功能

    以前只知道用poi导出Excel,最近用了SpringMvc的Excel导出功能,结合jxl和poi实现,的确比只用Poi好,两种实现方式如下: 一.结合jxl实现: 1.引入jxl的所需jar包: ...

  3. 利用Aspose.Cells完成easyUI中DataGrid数据的Excel导出功能

    我准备在项目中实现该功能之前,google发现大部分代码都是利用一般处理程序HttpHandler实现的服务器端数据的Excel导出,但是这样存在的问题是ashx读取的数据一般都是数据库中视图的数据, ...

  4. excel导出功能优化

    先说说优化前,怎么做EXCEL导出功能的: 1. 先定义一个VO类,类中的字段按照EXCEL的顺序定义,并且该类只能用于EXCEL导出使用,不能随便修改. 2. 将查询到的结果集循环写入到这个VO类中 ...

  5. excel导出功能原型

    本篇博客是记录自己实现的excel导出功能原型,下面我将简单介绍本原型: 这是我自制的窗体,有一个ListView和一个Button(导出)控件. 这是我在网上找到了使用exel需要引用的库. usi ...

  6. java利用EasyPoi实现Excel导出功能

    easypoi功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板 语言( ...

  7. asp.net excel导出功能

    以下是我在项目开发中所做的关于Excel导出功能,不足之处还望大家指正,相互学习 protected void btn_Export_Click(object sender, EventArgs e) ...

  8. 使用NPOI实现简单的Excel导出功能

    [1]NPOI是啥? NPOI是指构建在POI 3.x版本之上的一个程序,NPOI可以在没有安装Office的情况下对Word或Excel文档进行读写操作. POI是一个开源的Java读写Excel. ...

  9. C#导出带有格式的Excel(列宽,合并单元格,显示边框线,加背景颜色等)

    源地址:http://blog.sina.com.cn/s/blog_74f702e60101au55.html 导出excel相关设置:http://blog.csdn.net/wanmingtom ...

随机推荐

  1. 垃圾回收gc --翻译

    原文在https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management.基本保持了平译,并在一些地方做了概念解释.(转 ...

  2. 架构师成长之路5.4-Saltstack配置管理(LAMP架构案例)

    点击架构师成长之路 架构师成长之路5.4-Saltstack配置管理(LAMP架构案例) 配置管理工具: Pupper:1. 采用ruby编程语言:2. 安装环境相对较复杂:3.不支持远程执行,需要F ...

  3. kotlin项目开发基础之gradle初识

    在Android Studio推出之后默认的打包编译工具就变为gradle了,我想对于一名Android程序员而言没人不对它知晓,但是对于它里面的一些概念可能并不是每个人都了解,只知道这样配置就ok了 ...

  4. 使用rpm安装mysql5.6(简单安装 实验使用)

    [root@localhost mysql]# cd /usr [root@localhost mysql]# mkdir mysql [root@localhost mysql]# cd mysql ...

  5. 【BZOJ3534】【Luogu P3317】 [SDOI2014]重建 变元矩阵树,高斯消元

    题解看这里,主要想说一下以前没见过的变元矩阵树还有前几个题见到的几个小细节. 邻接矩阵是可以带权值的.求所有生成树边权和的时候我们有一个基尔霍夫矩阵,是度数矩阵减去邻接矩阵.而所谓变元矩阵树实际上就是 ...

  6. dlsym用法

    1. 包含头文件 #include<dlfcn.h> 2. 函数定义 void *dlsym(void *handle, const char* symbol); handle是使用dlo ...

  7. spark 三种数据集的关系(一)

    Catalyst Optimizer: Dataset 数据集仅可用Scala或Java.但是,我们提供了以下上下文来更好地理解Spark 2.0的方向数据集是在2015年作为Apache Spark ...

  8. js-10s倒计时后关闭窗口

    效果: html: <h1 id="h1">10s后关闭窗口</h1> <a id="a1">启动</a> js ...

  9. js中的“==”与“===”的区别

    console(34 == "34")  输出true console(34 === "34")  输出false 因此,==  只判断值,不判断类型,实际上里 ...

  10. JDK_API剖析之java.util包

    Java的实用工具类库java.util包.在这个包中,Java提供了一些实用的方法和数据结构. 一.接口 1.Collection<E> 接口 自1.2开始有 继承Iterable< ...