Delphi中直接将DataSet中的数据写入Excel文件

简介:
Procedure TFormReport.ExportExcelFile(FileName:  string ; bWriteTitle: Boolean; aDataSet: TClientDataSet);
var
  arXlsBegin: array[
0 .. 5 ] of Word;
  arXlsEnd: array[
0 .. 1 ] of Word;
  arXlsString: array[
0 .. 5 ] of Word;
  arXlsNumber: array[
0 .. 4 ] of Word;
  arXlsInteger: array[
0 .. 4 ] of Word;
  arXlsBlank: array[
0 .. 4 ] of Word;

  i: integer;
  Col, row: word;
  ABookMark: TBookMark;
  aFileStream: TFileStream;
  procedure incColRow; 
// 增加行列号
  begin
    
if  Col  =  ADataSet.FieldCount  -   1  then begin
      Inc(Row);
      Col :
= 0 ;
    end 
else  begin
      Inc(Col);
    end;
  end;

  procedure WriteStringCell(AValue: 
string ); // 写字符串数据
  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(Pointer(AValue)
^ , 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
  arXlsBegin[
0 ]: = $ 809 ;
  arXlsBegin[
1 ]: = 8 ;
  arXlsBegin[
2 ]: = 0 ;
  arXlsBegin[
3 ]: = $ 10 ;
  arXlsBegin[
4 ]: = 0 ;
  arXlsBegin[
5 ]: = 0 ;


  arXlsEnd[
0 ]: = $0A;
  arXlsEnd[
1 ]: = 00 ;

  arXlsString[
0 ]: = $ 204 ;
  arXlsString[
1 ]: = 0 ;
  arXlsString[
2 ]: = 0 ;
  arXlsString[
3 ]: = 0 ;
  arXlsString[
4 ]: = 0 ;
  arXlsString[
5 ]: = 0 ;

  arXlsNumber[
0 ]: = $ 203 ;
  arXlsNumber[
1 ]: = 14 ;
  arXlsNumber[
2 ]: = 0 ;
  arXlsNumber[
3 ]: = 0 ;
  arXlsNumber[
4 ]: = 0 ;

  arXlsInteger[
0 ]: = $27E;
  arXlsInteger[
1 ]: = 10 ;
  arXlsInteger[
2 ]: = 0 ;
  arXlsInteger[
3 ]: = 0 ;
  arXlsInteger[
4 ]: = 0 ;

  arXlsBlank[
0 ]: = $ 201 ;
  arXlsBlank[
1 ]: = 6 ;
  arXlsBlank[
2 ]: = 0 ;
  arXlsBlank[
3 ]: = 0 ;
  arXlsBlank[
4 ]: = $ 17 ;


  
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 aDataSet.FieldCount  -   1   do
        WriteStringCell(aDataSet.Fields[i].FieldName);
    end;
    
// 写数据集中的数据
    aDataSet.DisableControls;
    ABookMark :
=  aDataSet.GetBookmark;
    aDataSet.First;
    
while  not aDataSet.Eof  do  begin
      
for  i : =   0  to aDataSet.FieldCount  -   1   do
        
case  ADataSet.Fields[i].DataType of
          ftSmallint, ftInteger, ftWord, ftAutoInc, ftBytes:
          WriteIntegerCell(aDataSet.Fields[i].AsInteger);
          ftFloat, ftCurrency, ftBCD:
          WriteFloatCell(aDataSet.Fields[i].AsFloat)
        
else
          WriteStringCell(aDataSet.Fields[i].AsString);
        end;
      aDataSet.Next;
    end;
    
// 写文件尾
    AFileStream.WriteBuffer(arXlsEnd, SizeOf(arXlsEnd));
    
if  ADataSet.BookmarkValid(ABookMark)
      then aDataSet.GotoBookmark(ABookMark);
  Finally
    AFileStream.Free;
    ADataSet.EnableControls;
  end;

end;



    本文转自 OldHawk  博客园博客,原文链接:http://www.cnblogs.com/taobataoma/archive/2007/06/12/780930.html,如需转载请自行联系原作者

相关文章
|
14天前
|
数据采集 数据可视化 数据挖掘
利用Python自动化处理Excel数据:从基础到进阶####
本文旨在为读者提供一个全面的指南,通过Python编程语言实现Excel数据的自动化处理。无论你是初学者还是有经验的开发者,本文都将帮助你掌握Pandas和openpyxl这两个强大的库,从而提升数据处理的效率和准确性。我们将从环境设置开始,逐步深入到数据读取、清洗、分析和可视化等各个环节,最终实现一个实际的自动化项目案例。 ####
|
2月前
|
数据采集 存储 JavaScript
自动化数据处理:使用Selenium与Excel打造的数据爬取管道
本文介绍了一种使用Selenium和Excel结合代理IP技术从WIPO品牌数据库(branddb.wipo.int)自动化爬取专利信息的方法。通过Selenium模拟用户操作,处理JavaScript动态加载页面,利用代理IP避免IP封禁,确保数据爬取稳定性和隐私性。爬取的数据将存储在Excel中,便于后续分析。此外,文章还详细介绍了Selenium的基本设置、代理IP配置及使用技巧,并探讨了未来可能采用的更多防反爬策略,以提升爬虫效率和稳定性。
126 4
|
13天前
|
Python
按条件将Excel文件拆分到不同的工作表
使用Python的pandas库,可以轻松将Excel文件按条件拆分到不同的工作表中。本文通过一个示例代码展示了如何生成一个包含总成绩表和三个班级表的Excel文件。代码首先创建了一个包含学生姓名、班级和各科成绩的数据框,然后按班级分组,将每个班级的数据分别写入不同的工作表。最后,生成的Excel文件将包含四个工作表,分别为总成绩表和三个班级的成绩表。
23 6
按条件将Excel文件拆分到不同的工作表
|
12天前
|
Python
批量将不同的工作簿合并到同一个Excel文件
本文介绍如何使用Python的`pandas`库批量合并不同工作簿至同一Excel文件。通过模拟生成三个班级的成绩数据,分别保存为Excel文件,再将这些文件合并成一个包含所有班级成绩的总成绩单。步骤包括安装必要库、生成数据、保存与合并工作簿。
22 6
|
12天前
|
Python
按条件将Excel文件拆分到不同的工作表
使用Python的pandas库,可以轻松将Excel文件按条件拆分为多个工作表。本文通过一个具体示例,展示了如何根据学生班级将成绩数据拆分到不同的工作表中,并生成一个包含总成绩表和各班级成绩表的Excel文件。代码简洁明了,适合初学者学习和应用。
27 6
|
21天前
|
前端开发
实现Excel文件和其他文件导出为压缩包,并导入
实现Excel文件和其他文件导出为压缩包,并导入
25 1
|
2月前
|
数据处理 Python
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
这篇文章介绍了如何使用Python读取Excel文件中的数据,处理后将其保存为txt、xlsx和csv格式的文件。
65 3
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
|
1月前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
43 4
|
2月前
|
JavaScript 前端开发 数据处理
Vue导出el-table表格为Excel文件的两种方式
Vue导出el-table表格为Excel文件的两种方式
82 6
|
2月前
|
easyexcel Java UED
SpringBoot中大量数据导出方案:使用EasyExcel并行导出多个excel文件并压缩zip后下载
在SpringBoot环境中,为了优化大量数据的Excel导出体验,可采用异步方式处理。具体做法是将数据拆分后利用`CompletableFuture`与`ThreadPoolTaskExecutor`并行导出,并使用EasyExcel生成多个Excel文件,最终将其压缩成ZIP文件供下载。此方案提升了导出效率,改善了用户体验。代码示例展示了如何实现这一过程,包括多线程处理、模板导出及资源清理等关键步骤。