直接将数据导出到Excel文件,直接操作文件没有使用Variant

VS2008环境使用MFC操作读取excel文件 VS 2008 MFC EXCEL 阅读详情

unit xls_un;

interface

uses 
      Windows, Messages, SysUtils,   Classes,
      Forms, Dialogs,db, dbctrls,  comctrls, DBGrids;

  const 
  {BOF} 
      CBOF             =   $0009; 
      BIT_BIFF5   =   $0800;
      BOF_BIFF5   =   CBOF   or   BIT_BIFF5; 
  {EOF} 
      BIFF_EOF   =   $000a; 
  {Document   types} 
      DOCTYPE_XLS   =   $0010; 
  {Dimensions} 
      DIMENSIONS   =   $0000; 
  type 
      TAtributCell  =  (acHidden,acLocked,acShaded,acBottomBorder,acTopBorder, acBorder,
                                 acRightBorder,acLeftBorder,acLeft,acCenter,acRight,acFill);
  
      TSetOfAtribut  =  set   of   TatributCell;

     TXLSWriter  =  class(Tobject)
     private 
          fstream:TFileStream; 
          procedure   WriteWord(w:word); 
      protected 
          procedure   WriteBOF; 
          procedure   WriteEOF; 
          procedure   WriteDimension; 
      public 
          maxCols,maxRows:Word; 
          procedure   CellWord(vCol,vRow:word;aValue:word;vAtribut:TSetOfAtribut=[]); 
          procedure   CellDouble(vCol,vRow:word;aValue:double;vAtribut:TSetOfAtribut=[]); 
          procedure   CellStr(vCol,vRow:word;aValue:String;vAtribut:TSetOfAtribut=[]); 
          procedure   WriteField(vCol,vRow:word;Field:TField);
          constructor   create(vFileName:string); 
          destructor   destroy;override; 
      end; 
  
  procedure   SetCellAtribut(value:TSetOfAtribut;var   FAtribut:array   of   byte);
  //导出 DataSet 到Excel 文件 
  procedure   DataSetToXLS(ds:TDataSet;fname:String);
  //导出 DataGrid 到Excel 文件
  procedure   DataGridToXLS(dg:TDBGrid;fname:String);
  //导出listView 到Excel 文件
  procedure   ListViewToXLS(lv:TListView;fname: string);
  implementation
  
procedure   DataSetToXLS(ds:TDataSet;fname:String); 
var   c,r:Integer; 
    xls:TXLSWriter; 
begin 
    xls:=TXLSWriter.create(fname); 
    if   ds.FieldCount   >   xls.maxcols   then 
        xls.maxcols:=ds.fieldcount+1; 
    try 
        xls.writeBOF; 
        xls.WriteDimension; 
        for   c:=0   to   ds.FieldCount-1   do 
            xls.Cellstr(0,c,ds.Fields[c].FieldName); 
        r:=1; 
        ds.first; 
        while   (not   ds.eof)   and   (r   <=   xls.maxrows)   do   begin 
            for   c:=0   to   ds.FieldCount-1   do 
                xls.WriteField(r,c,ds.Fields[c]); 
            inc(r); 
            ds.next; 
        end; 
        xls.writeEOF; 
    finally 
        xls.free; 
    end; 
end; 
  
procedure   DataGridToXLS(dg:TDBGrid;fname:String); 
var   c,r:Integer;
    xls:TXLSWriter;
begin 
  dg.DataSource.DataSet.DisableControls; 
    xls:=TXLSWriter.create(fname);
    if   dg.FieldCount   >   xls.maxcols   then
        xls.maxcols:=dg.FieldCount+1;
    try
        xls.writeBOF;
        xls.WriteDimension;
        for   c:=1   to   dg.FieldCount-1   do
            xls.Cellstr(0,c,dg.Columns.Items[c].Title.Caption);
        r:=1;
        dg.DataSource.DataSet.First;
        while   (not   dg.DataSource.DataSet.eof)   and   (r   <=   xls.maxrows)   do   begin
            for   c:=1   to   dg.FieldCount-1   do
                xls.WriteField(r,c,dg.Fields[c]);
            inc(r);
            dg.DataSource.DataSet.Next;
        end;
        xls.writeEOF;
    finally
        xls.free;
    end;
  dg.DataSource.DataSet.EnableControls;   
end; 
  

procedure  ListViewToXLS(lv:TListView;fname: string);
var  c,r:Integer;
     xls:TXLSWriter;
begin
    xls:=TXLSWriter.create(fname); 
    if   lv.Columns.Count >  xls.maxcols   then
        xls.maxcols:=lv.Columns.Count+1;
    try
        xls.writeBOF;
        xls.WriteDimension;
        //write title
        for   c:=0   to   lv.Columns.Count-1   do
            xls.Cellstr(0,c,lv.Columns.Items[c].Caption);
        //Write Data   
        for c:=1 to lv.Items.Count do
        begin
           xls.CellStr(c,0,lv.Items.Item[c-1].Caption);
           for r:=0 to lv.Items.Item[c-1].SubItems.Count-1 do
              xls.CellStr(c,r+1,lv.Items.Item[c-1].SubItems.Strings[r]);
        end;
        xls.writeEOF;
    finally
        xls.free;
    end;
end;


  
{   TXLSWriter   } 
  
constructor   TXLSWriter.create(vFileName:string); 
begin 
    inherited   create; 
    if   FileExists(vFilename)   then 
        fStream:=TFileStream.Create(vFilename,fmOpenWrite) 
    else 
        fStream:=TFileStream.Create(vFilename,fmCreate); 
  
    maxCols:=100;       // 
    maxRows:=65535;   // 
end; 
  
destructor   TXLSWriter.destroy; 
begin 
    if   fStream   <>   nil   then 
        fStream.free; 
    inherited; 
end; 
  
procedure   TXLSWriter.WriteBOF; 
begin 
    Writeword(BOF_BIFF5); 
    Writeword(6);                       //   count   of   bytes 
    Writeword(0); 
    Writeword(DOCTYPE_XLS); 
    Writeword(0); 
end; 
  
procedure   TXLSWriter.WriteDimension; 
begin 
    Writeword(DIMENSIONS);     //   dimension   OP   Code 
    Writeword(8);                       //   count   of   bytes 
    Writeword(0);                       //   min   cols 
    Writeword(maxRows);           //   max   rows 
    Writeword(0);                       //   min   rowss 
    Writeword(maxcols);           //   max   cols 
end; 
  
procedure   TXLSWriter.CellDouble(vCol,   vRow:   word;   aValue:   double; 
    vAtribut:   TSetOfAtribut); 
var     FAtribut:array   [0..2]   of   byte; 
begin 
    Writeword(3);                       //   opcode   for   double 
    Writeword(15);                     //   count   of   byte 
    Writeword(vCol); 
    Writeword(vRow); 
    SetCellAtribut(vAtribut,fAtribut); 
    fStream.Write(fAtribut,3); 
    fStream.Write(aValue,8); 
end; 
  
procedure   TXLSWriter.CellWord(vCol,vRow:word;aValue:word;vAtribut:TSetOfAtribut=[]); 
var     FAtribut:array   [0..2]   of   byte; 
begin 
    Writeword(2);                       //   opcode   for   word 
    Writeword(9);                       //   count   of   byte 
    Writeword(vCol); 
    Writeword(vRow); 
    SetCellAtribut(vAtribut,fAtribut); 
    fStream.Write(fAtribut,3); 
    Writeword(aValue); 
end; 
  
procedure   TXLSWriter.CellStr(vCol,   vRow:   word;   aValue:   String; 
    vAtribut:   TSetOfAtribut); 
var     FAtribut:array   [0..2]   of   byte; 
    slen:byte; 
begin 
    Writeword(4);                       //   opcode   for   string 
    slen:=length(avalue); 
    Writeword(slen+8);             //   count   of   byte 
    Writeword(vCol); 
    Writeword(vRow); 
    SetCellAtribut(vAtribut,fAtribut); 
    fStream.Write(fAtribut,3); 
    fStream.Write(slen,1); 
    fStream.Write(aValue[1],slen); 
end;

procedure SetCellAtribut(value:TSetOfAtribut;var   FAtribut:array   of   byte); 
var 
      i:integer; 
begin 
  //reset 
    for   i:=0   to   High(FAtribut)   do 
        FAtribut[i]:=0; 
  
          {Byte   Offset           Bit       Description                                           Contents
          0                     7           Cell   is   not   hidden                             0b 
                                            Cell   is   hidden                                     1b 
                                6           Cell   is   not   locked                             0b 
                                            Cell   is   locked                                     1b 
                                5-0       Reserved,   must   be   0                           000000b 
          1                     7-6       Font   number   (4   possible) 
                                5-0       Cell   format   code 
          2                     7           Cell   is   not   shaded                             0b 
                                            Cell   is   shaded                                     1b 
                                6           Cell   has   no   bottom   border               0b 
                                            Cell   has   a   bottom   border                 1b 
                                5           Cell   has   no   top   border                     0b 
                                            Cell   has   a   top   border                       1b 
                                4           Cell   has   no   right   border                 0b 
                                            Cell   has   a   right   border                   1b 
                                3           Cell   has   no   left   border                   0b 
                                            Cell   has   a   left   border                     1b 
                                2-0       Cell   alignment   code 
                                                      general                                         000b 
                                                      left                                               001b 
                                                      center                                           010b 
                                                      right                                             011b 
                                                      fill                                               100b 
                                                      Multiplan   default   align.       111b 
          } 
  
          //     bit   sequence   76543210 
  
          if     acHidden   in   value   then               //byte   0   bit   7: 
                  FAtribut[0]   :=   FAtribut[0]   +   128; 
  
          if     acLocked   in   value   then               //byte   0   bit   6: 
                  FAtribut[0]   :=   FAtribut[0]   +   64   ; 
  
          if     acShaded   in   value   then               //byte   2   bit   7: 
                  FAtribut[2]   :=   FAtribut[2]   +   128; 
  
          if     acBottomBorder   in   value   then   //byte   2   bit   6 
                  FAtribut[2]   :=   FAtribut[2]   +   64   ; 
  
          if     acTopBorder   in   value   then         //byte   2   bit   5 
                  FAtribut[2]   :=   FAtribut[2]   +   32; 

          if     acRightBorder   in   value   then     //byte   2   bit   4 
                  FAtribut[2]   :=   FAtribut[2]   +   16; 
  
          if     acLeftBorder   in   value   then       //byte   2   bit   3 
                  FAtribut[2]   :=   FAtribut[2]   +   8; 
  
          if     acLeft   in   value   then                   //byte   2   bit   1 
                  FAtribut[2]   :=   FAtribut[2]   +   1 
          else   if     acCenter   in   value   then     //byte   2   bit   1 
                  FAtribut[2]   :=   FAtribut[2]   +   2 
          else   if   acRight   in   value   then         //byte   2,   bit   0   dan   bit   1 
                  FAtribut[2]   :=   FAtribut[2]   +   3 
          else   if   acFill   in   value   then           //byte   2,   bit   0 
                  FAtribut[2]   :=   FAtribut[2]   +   4; 
end; 
  
procedure  TXLSWriter.WriteWord(w:   word);
begin 
    fstream.Write(w,2); 
end; 
  
procedure   TXLSWriter.WriteEOF; 
begin 
    Writeword(BIFF_EOF); 
    Writeword(0); 
end; 
  
procedure TXLSWriter.WriteField(vCol,   vRow:   word;   Field:   TField); 
begin 
    case   field.DataType   of
          ftString,ftWideString,ftBoolean,ftDate,ftDateTime,ftTime: 
              Cellstr(vcol,vrow,field.asstring);
          ftAutoInc,ftSmallint,ftInteger,ftWord: 
              CellWord(vcol,vRow,field.AsInteger); 
          ftFloat,   ftBCD: 
              CellDouble(vcol,vrow,field.AsFloat); 
    else 
              Cellstr(vcol,vrow,EmptyStr);
    end;
end;


end.

 

PLSQL Developer新手必看:如何避免安装过程中的常见坑 本文为PL/SQL Developer新手提供了详尽的安装与配置避坑指南。从版本选择、注册码使用、汉化包安装到Oracle客户端连接配置,逐一解析常见问题并提供解决方案,帮助开发者快速搭建稳定的PL/SQL开发环境,顺利开启Oracle数据库编程工作。 阅读详情

相关推荐

东方马达步进电机AZM66AK-HS100+AZD-KD调试经验记录

东方马达步进电机AZM66AK-HS100+AZD-KD调试经验记录(20170803YC) 本次总结主要实现的功能如下:用MEXE02软件在步进电机驱动器中设置好控制动作,每个控制动作有一个特定的编号。之后通过PC和驱动器之间的485通讯,发送相关指令,使步进电机按照一定编号的控制动作运转。 参考资料:东方马达步进电机AZM66AK-HS100+AZD-KD的产品手册,可在官网下载。 A....

dahailuoa6的博客 1万+

XLSReadWriteII5 Cell Comments 单元注释

XLSReadWriteII5、6可以为Cell加入注释,通过TXLSComment读写Cell指定注释。

lyhoo163的专栏 3087

java三角套利_三角对冲套利-EA原理全解析

它是两个直盘货币和一个交叉盘货币之间的相互对冲,交易员往往受到外界因素的影响无法严格执行造成亏损。该系统经过大量数据统计分析和严格的科学论证计算,并通过多年实盘交易验证可以达到稳定盈利。希望交易员严格按照交易规则执行。此策略利用交叉外汇对的市场价格与其合成价格的价差来实现套利,还以EUR/USD和GBP为例:1,我们关注三个外汇对:EUR/USD,GBP/USD,以及GBP/EUR2,计算GBP/...

weixin_29531897的博客 2418

Delphi里如何保存并关闭excel

procedure TForm1.Button6Click(Sender: TObject); var    xlstest, thesheet:Variant; begin   try     xlstest:=CreateOleObject('Excel.Application');   except     Exit;   end;   

beyondqd的专栏 7930

CTF实战:Wireshark数据包分析从入门到精通(附经典题型解析)

本文详细介绍了Wireshark在CTF比赛中的数据包分析技巧,从基础抓包到高级协议解析,涵盖HTTP流量分析、USB键盘数据还原等实战案例。通过经典题型解析,帮助读者掌握精准过滤、文件提取等核心技能,提升CTF竞赛中的网络流量分析能力。

pz890123的博客 586

Ubuntu下OpenOCD+GDB的安装、编译及使用

目标开发板(芯片):stm32mp157aaa 仿真器:ST-Link 操作系统:Ubuntu 18.04 调试软件:OpenOCD OpenOCD的安装 首先下载OpenOCD有多种方式,可以GitHub上下载,目录下打开终端,输入 git clone git://git.code.sf.net/p/openocd/code openocd 下载完整的OpenOCD的文件夹。进入到OpenOCD的目录下,开始安装。 接着,OpenOCD适用于微处理器的debug和烧写,需要下载相关库 sud

蓝冰露的博客 9524

mfc对Excel的操作

mfc对Excel的操作:导入数据,导出数据。

Goodenough的博客 5518

在mac OS下安装SQL Developer

最近一直在折腾Oracle数据库,但由于电脑是mac系统,plsql developer用不了,远程管理一直不是很方便。后来听说Navicat不错,就也装了个试试看,发现界面看起来确实不错。今天心血来潮,想试试oracle自己开发的client。用惯plsql developer的人也可以来试试看,毕竟是自己人开发的,兼容性应该会不错吧。下面就把安装过程分享给新手或者需要帮助的朋友。 1.

bonbonboo的专栏 2万+

C++使用VARIANT实现二维数组的操作

VARIANT变量是COM组件之间互相通信的重要的参数变量之一,它可以容纳多种不同的类型,如short、long、double等,包括各类指针和数组。组件之间的互相调用是比较耗时的,尤其带当组件位于不同进程中时,因此,减少传递次数是提高效率的一种有效方法。其中,Excel表格的操作就可能涉及到大量数据,一次传递一个二维数组是提高对Excel表的操作效率。下面以两种不同方式来实现VARIANT二维数

曾经沧海 1935

【逆向实战】Unity游戏资源提取与解密全攻略:从AssetBundle到libil2cpp.so的破解技巧

本文详细介绍了Unity游戏资源提取与解密的完整流程,涵盖从AssetBundle到libil2cpp.so的破解技巧。通过AssetStudio和Il2CppDumper等工具,读者可以学习如何提取未加密资源、处理加密文件,并掌握动态dump技术。文章还提供了自动化脚本编写和常见问题解决方案,帮助逆向工程爱好者高效完成资源提取任务。

weixin_29012765的博客 1046

STM32 SAES硬件加密协处理器全模式工程实践指南

AES(高级加密标准)是嵌入式系统中最基础且关键的对称密码算法,其硬件加速实现直接影响安全、性能与功耗平衡。Secure AES Coprocessor(SAES)作为STMicroelectronics在STM32U5等高安全MCU中集成的专用密码协处理器,不仅支持标准ECB/CBC/CTR模式,更原生兼容GCM和CCM等认证加密模式,具备抗侧信道、密钥保护与DMA卸载能力。理解其寄存器状态机(CHMOD/MODE/CPHASE)、NPBLB数据对齐机制及GCM四阶段编程范式,是规避Tag校验失败、IV错

weixin_42311427的博客 76

MFC导出到Excel

软件:vs2013 程序功能:将ListControl内容导出到Excel里 步骤: 第一步:创建基于对话框的MFC工程 第二步:添加库、添加Excel类库 在工程名上右键,选择“添加”—“类”(或者点击菜单栏的“项目”-&gt;“添加类”),选择“TypeLib中的MFC类”(MFC Class From TypeLib) 类来源选“注册表”,在可用的类型库中选择“Microso...

cai_niaocainiao的博客 9004

Mamba-UNet:用于医学图像分割的类似UNet的纯视觉Mamba网络

所提出的Mamba-UNet的架构如图2所示,其灵感来源于UNet [24] 和 Swin-UNet [3]。首先将大小为 H × W × 1 的2D灰度图像分割成类似于ViT和VMamba的块 [5,16],然后转换为维度为 H/4 × W/4 × 16 的1D序列。一个初始的线性嵌入层将特征维度调整为任意大小C。这些块令牌随后通过多个VSS块和块合并层进行处理,以创建分层特征。块合并层负责下采样和维度增加,而VSS块则专注于学习特征表示。

AI浩 7549

使用MFC操作EXCEL文件

一、加载 1、 在VC6.0里创建一个MFC工程 2、打开MFCClassWizard窗口(查看—>建立类向导),选择Automation,单击AddClass按钮,选择Froma type library...,弹出文件选择对话框,之后定位到C:\Program Files\MicrosoftOffice\OFFICE11\EXCEL.EXE,在生成类中添加所有的对象(其实添加需要的即可

目前打算换一个工作,有招聘windows c++方向的也欢迎联系,北京、济南 最好 5万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Delphi 导出数据至Excel的7种方法

一; delphi 快速导出excel uses ComObj,clipbrd; function ToExcel(sfilename:string; ADOQuery:TADOQuery):boolean; const xlNormal=-4143; var y : integer; tsList : TStringList; s,filename :strin

crkres9527 1万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

c语言程序导出到excel里,C++中实现把表的数据导出到EXCEL并打印实例代码

实现把表的数据导出到EXCEL并打印实例代码首先加入这两句:#include "utilcls.h" #include "comobj.hpp"下面正式开始:void __fastcall TMainForm::ToExcel(TADOQuery *TT,AnsiString str){//TT为被导出数据的表,str为命令(具体看代码底部的if语句)#define PG OlePropertyG...

weixin_35686326的博客 2454

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

在Delphi中使用Interface而不使用Variant控制Microsoft Excel

此文背景:  最近,我想通过Interface完全控制数据排版格式导出到Excel。不愿意使用Variant是因为Variant操作慢,编码时需清晰Excel对象层次结构,调试不方便。摸索过程:  基本的操作简单,我搞不定的就是PageSetup与选定一列或一行。别看下面代码简单,我可是花了一天半时间看,搜,问(太菜,惭愧中...)。此文目的:  数据共享并期望数据共享。procedu

swayi21的专栏 2867

qt sqlite导出excel

void Result_num::on_pushButton_output_clicked() { QSqlDatabase mydb=QSqlDatabase::addDatabase("QSQLITE"); mydb.setDatabaseName("./caminfo.db"); mydb.open(); model = new QSqlTableModel...

kingtail的博客 2454

delphi导出数据至Excel的七种方法

delphi导出数据至Excel的七种方法 2012-01-17 00:00 一;delphi 快速导出excel uses ComObj,clipbrd; function ToExcel(sfilename:string; ADOQuery:TADOQuery):boolean;const xlNormal=-4143;var...

dgtcrc6719的博客 444

使用VC++操作Excel文件

本文档适用于: Microsoft Foundation Classes (MFC), Microsoft Visual C++, 32-bit Editions, version 6.0 以上Microsoft OLE 库  第一步:建立一个自动化工程 启动VC 6.0,打开新建对话框,新建一个MFC AppWizard(exe)工程,这里工程明设置为TestExcel。

xjkstar的专栏 1041

【史上最全】五种C语言操作Excel文件的方法全面深入指南

在C语言中操作Excel文件是一项常见且重要的任务,特别是在数据处理和科学计算领域。尽管C语言本身并不直接支持Excel文件的读写操作,但通过多种方法和技术,我们仍然可以高效地完成这项任务。本文将详细介绍几种常用的C语言操作Excel文件的方法,包括使用CSV格式、调用COM接口、使用第三方库等,并对每种方法的优缺点进行深入分析。

极客代码 4975

StringGrid数据、Excel文件之间的直接转化

/************************************************************************************ * C++ Buider 利用变体类Variant提供的4个方法向OLE服务程序提交操作命令    * *     Variant Variant::OlePropertyGet(属性名,参数。。。);    // 获取对象属性

haiqian119的专栏 2000

《MFC如何添加EXCEL库和操作EXCEL》

EXCEL工作簿、工作表、单元格、行、列 我们在使用EXCEL时,需要搞清楚EXCEL应用程序、工作簿、工作表以及单元格的关系,还有如何设置字体和背景以及边框的属性。总之,就是1个工作簿(workbook)中含有很多个工作表(worksheet),工作表(worksheet)由行(cols)和列(rows)组成,行和列又由很多个单元格(cell)组成。由于在项目中使用到了EXCEL进行数据统计,...

GodLei1995 5532

VS2010 MFC中对Excel进行读写操作

在MFC对话框中实现Excel的读写操作

TX_TYX的博客 3825
上一篇: Delphi的SOAP Header问题
下一篇: C#语言中的字符串数组赋初值
helodd
博客等级 码龄24年 40粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值