笔者在实际工作中经常用Excel表做数据报表,大多数表格的数据都要从数据库中读取,这样我就用C++Builder做了一个报表程序,方便了很多,现在把它共享给C++Builder爱好者们,就算为丰富C++Builder的文档资料做点事情吧。
首先把Excel报表文件保存到一个指定目录下,最好放在可执行程序的子目录下,作为模板文件。可以把报表标题、表头等设置好。这里是保存在trpt子目录下。
然后建一个report目录,作为报表目标文件夹,存放填好数据的报表,可以由用户直接操作。
首先确定在你的机器中装有Office。这里一Office2000为例。
在C++Builder中新建一个工程,在窗体Form1上面放一个两个按钮SaveButton和ReadButton,分别用来保存数据到Excel表和显示刚刚保存的Excel表。
在SaveButton按钮的单击事件中把从数据库中取到的数据放入到指定的Excel表中并将改文件拷贝到report目录下。在ReadButto按钮的单击事件中显示report目录下的报表文件,方便用户修改和另外保存。
在Form1.h头文件中定义几个变量:
private: Variant Ex,Wb,Sheet,ERange,EBorders; |
并在文件头中包含如下语句:
#include "Excel_2K_SRVR.h" #include <oleserver.hpp></oleserver.hpp> |
在Form1.cpp的文件头中加入
#pragma link "Excel_2K_SRVR" |
主要代码如下:
void __fastcall TForm1:: SaveButtonClick(TObject *Sender) { try { SaveButton->Enabled = false; ReadButton->Enabled = false;//使两个按钮无效
file://取报表文件CardSend.xls的完整目录名 AnsiString ExcelFileName = GetCurrentDir()+"\\trpt\\table.xls";
if(!FileExists(ExcelFileName)) { Application->MessageBox("报表模板文件不存在,无法打开!", "错误",MB_ICONSTOP|MB_OK); return; } file://建立Excel的Ole对象Ex try { Ex = Variant::CreateObject("Excel.Application"); } catch(...) { Application->MessageBox("无法启动Excel","错误",MB_ICONSTOP|MB_OK); return; } file://设置Excel为不可见 Ex.OlePropertySet("Visible",false); file://打开指定的Excel报表文件。报表文件中最好设定只有一个Sheet。 Ex.OlePropertyGet("WorkBooks").OleProcedure("Open",ExcelFileName.c_str()); Wb = Ex.OlePropertyGet("ActiveWorkBook"); Sheet = Wb.OlePropertyGet("ActiveSheet");//获得当前默认的Sheet
file://清空Excel表,这里是用循环清空到第300行。对于一般的表格已经足够了。 AnsiString strRowTemp; AnsiString strRange; int iCols,iRows;//记录列数和行数
/*从第三行开始,到第300行止。一般第一行是表标题,第二行是副标题或者制表日期。*/ for(iRows=3;iRows<300;iRows++) { file://假设只有6列。 for (iCols = 1;iCols < 7; iCols++) { file://清空行 Sheet.OlePropertyGet("Cells",iRows,iCols).OlePropertySet("Value",""); } file://去掉表格边框 strRange = "A"+IntToStr(iRows)+":F"+IntToStr(iRows);//获取操作范围 ERange = Sheet.OlePropertyGet("Range",strRange.c_str()); EBorders = ERange.OlePropertyGet("Borders");//获取边框对象 EBorders.OlePropertySet("linestyle",xlNone); }
AnsiString strPtrDate; file://存放当前日期,作为制表日期 DateSeparator = '-'; ShortDateFormat = "yyyy/m/d";//设置为年/月/日格式
strPtrDate = DateToStr(Date());//取当前日期
AnsiString strYear = strPtrDate.SubString(1,4); strPtrDate = strPtrDate.SubString(6,strPtrDate.Length()-5); AnsiString strMonth = strPtrDate.SubString(1,strPtrDate.Pos("-")-1); AnsiString strDay = strPtrDate.SubString(strPtrDate.Pos("-")+1, strPtrDate.Length()-strPtrDate.Pos("-")); strPtrDate = strYear+"年"+strMonth+"月"+strDay+"日";
AnsiString strData = "报表标题";//报表标题 file://将报表标题置于第一行第一列。在此之前,应将报表文件的标题格式设定好。 Sheet.OlePropertyGet("Cells",1,1).OlePropertySet("Value", strData.c_str()); file://将制表日期置于表格第二行的右侧。 Sheet.OlePropertyGet("Cells",2,5).OlePropertySet("Value", strPtrDate.c_str());
iRows = 3;//在第三行放置表格的列名 Sheet.OlePropertyGet("Cells",iRows,1).OlePropertySet("Value","列名1"); Sheet.OlePropertyGet("Cells",iRows,2).OlePropertySet("Value","列名2"); Sheet.OlePropertyGet("Cells",iRows,3).OlePropertySet("Value","列名3"); Sheet.OlePropertyGet("Cells",iRows,4).OlePropertySet("Value","列名4"); Sheet.OlePropertyGet("Cells",iRows,5).OlePropertySet("Value","列名5"); Sheet.OlePropertyGet("Cells",iRows,6).OlePropertySet("Value","列名6"); file://画表格边框,在A3:F3之间取范围 strRange = "A"+IntToStr(iRows)+":F"+IntToStr(iRows); ERange = Sheet.OlePropertyGet("Range",strRange.c_str()); EBorders = ERange.OlePropertyGet("Borders"); EBorders.OlePropertySet("linestyle",xlContinuous); EBorders.OlePropertySet("weight",xlThin); EBorders.OlePropertySet("colorindex",xlAutomatic); iRows++; file://从数据库中取数据(略),假设数据集放入Query1中。 Query1->Open();//打开数据集 file://循环取数 while(!Query1->Eof) { file://循环取字段的数据放到Excel表对应的行列中 for(iCols=1;iCols<7;iCols++) { strRowTemp = Query1->Fields->Fields[iCols-1]->AsString; Sheet.OlePropertyGet("Cells",iRows,iCols).OlePropertySet("Value", strRowTemp.c_str()); } file://画该行的表格边框 strRange = "A"+IntToStr(iRows)+":F"+IntToStr(iRows); ERange = Sheet.OlePropertyGet("Range",strRange.c_str()); EBorders = ERange.OlePropertyGet("Borders"); EBorders.OlePropertySet("linestyle",xlContinuous); EBorders.OlePropertySet("weight",xlThin); EBorders.OlePropertySet("colorindex",xlAutomatic); iRows++; Query1->Next(); }//while结束
Wb.OleProcedure("Save");//保存表格 Wb.OleProcedure("Close");关闭表格 Ex.OleFunction("Quit");退出Excel file://定义目标文件名 AnsiString DestinationFile = GetCurrentDir()+"\\report\\table.xls"; file://将刚刚修改的Excel表格文件table.xls拷贝到report目录下 if(!CopyFile(ExcelFileName.c_str(),DestinationFile.c_str(),false)) { Application->MessageBox("复制文件操作失败,Excel文件可能正在使用中!", "错误",MB_ICONSTOP|MB_OK); return; } Application->MessageBox("成功完成报表保存!\n可以按\'打开Excel文件\' 按钮进行报表工作","提示",MB_ICONINFORMATION|MB_OK);
SaveButton ->Enabled = true; ReadButton ->Enabled=true; }//try结束 catch(...) { Application->MessageBox("操作Excel表格失败!", "错误",MB_ICONSTOP|MB_OK); Wb.OleProcedure("Close"); Ex.OleFunction("Quit"); SaveButton ->Enabled = true; ReadButton ->Enabled=false; } } |
至此,完成报表数据的写入工作。如果要对完成的Excel表进行操作,可以点击"打开Excel表文件按钮"(ReadButton),进行修改,保存,打印等操作。ReadButton的单击事件如下实现:
void __fastcall TForm1:: ReadButtonClick(TObject *Sender) { try { file://指定report目录下的报表文件用于用户操作 AnsiString ExcelFileName = GetCurrentDir();+"\\report\\table.xls";
if(!FileExists(ExcelFileName)) { Application->MessageBox("Excel表文件不存在,无法打开!", "错误",MB_ICONSTOP|MB_OK); return; }
try { Ex = Variant::CreateObject("Excel.Application"); } catch(...) { Application->MessageBox("无法启动Excel","错误",MB_ICONSTOP|MB_OK); return; } file://使Excel可见 Ex.OlePropertySet("Visible",true); file://打开Excel表格文件Table.xls Ex.OlePropertyGet("WorkBooks").OleProcedure("Open",ExcelFileName.c_str()); } catch(...) { Application->MessageBox("操作Excel表格错误!","错误",MB_ICONSTOP|MB_OK); Ex.OleFunction("Quit"); } } 以上关于C++BuilderExcel表格的操作仅作为个人观点和水平呈献给关心此问题的读者,如果有更好的方式方法,敬请指教,不胜感激。
|
分享到:
相关推荐
通过研究这些代码,你可以更深入地了解如何在C++Builder 2010中使用OLE技术操作Excel,并且可能也能学习到如何封装和复用二进制文件操作的代码。这将极大地提升你的C++编程能力和跨应用集成技能。
### C++Builder 使用 OLE 控制 Excel 的方法详解 #### 概述 本文将详细介绍如何使用 C++Builder 和 OLE(Object Linking and Embedding)技术来操控 Microsoft Excel 文件。这种方式能够实现自动化处理 Excel 表格...
### 使用C++Builder中的OLE技术存取Excel表数据 #### 概述 本文旨在探讨如何在C++Builder环境中运用OLE技术实现对Excel表格数据的读写操作。通过具体实例,详细介绍了实现这一功能的具体步骤和技术要点。 #### C++...
在本场景中,"ole控制excel-C++builder"指的是使用C++Builder开发的程序,通过OLE技术来操控Microsoft Excel进行数据处理和分析。下面将详细介绍如何在C++Builder中实现对Excel的OLE控制。 首先,你需要在C++...
在这个“C++ Builder (BCB) Oracle 导出 Excel 表”的场景中,开发者的目标是将Oracle数据库中的特定表格数据导出到Excel文件中。为了实现这一功能,我们需要了解以下关键知识点: 1. **ODAC组件**:ODAC是Devart...
这是对c++builder的ole的应用,可以连接office的word的应用
例如,libXL库可以让你直接在C++Builder项目中包含库文件,然后调用其API来创建、读取和修改Excel文件,而无需依赖Microsoft Office。 例如,使用libXL库,你可以这样创建一个Excel文件并填充数据: ```cpp #...
在开始之前,请确保你的开发环境中已安装 C++Builder 和相关的 Excel 操作组件(例如 Ole 自动化支持)。在 C++Builder 中,你需要引入必要的头文件,如 `Utilcls.h` 和 `"Excel_2K_SRVR.h"`,以便能够调用 Excel ...
在这个场景下,C++Builder 2010提供了一个叫做`TExcelApplication`的类,它封装了Excel的对象模型,使得程序员可以通过C++代码方便地控制Excel的工作簿、工作表和单元格。 首先,我们需要创建一个`...
2. 自动化对象:C++Builder 提供了四个 Ole Object Class 函数来包装 Excel 自动化对象的功能,分别是:设置对象属性、获得对象属性、调用对象方法和调用对象过程。 3. 对象、属性和方法:在 Excel 中,对象是一个 ...
8. **源代码兼容性**:C++Builder 6编写的代码可以与其他C++编译器保持良好的兼容性,这使得代码可以在不同的开发环境中轻松迁移。 9. **跨平台支持**:虽然C++Builder 6主要关注Windows平台,但通过第三方工具和库...
在实际操作中,开发者首先需要在PowerBuilder中创建一个OLE容器对象,然后实例化Excel应用程序,接着可以访问并操作工作表、工作簿和单元格。例如,通过`CreateObject`函数创建Excel对象,`Open`方法打开或创建一个...
在探讨C++Builder和Delphi的数据类型比较时,我们深入分析了两种编程环境中常见的数据类型,这不仅有助于理解这两种环境的特性和差异,还能为开发者选择合适的类型提供指导。以下是对给定表格中的数据类型进行的详细...
通过OLE,C++Builder的应用程序可以嵌入、链接到或者控制其他应用程序的对象,比如Word文档和Excel工作簿。 首先,你需要在C++Builder中引入相关的头文件,例如`#include <vcl.oledlg.hpp>`和`#include ...
C++Builder 6在标准C++的基础上,提供了面向对象编程的支持,使得开发者可以利用封装、继承和多态性来设计复杂的应用程序。 其次,书中会详细介绍C++Builder 6的IDE界面,包括工程管理、资源管理器、代码编辑器、类...
C++ Builder是由Borland公司推出的,该公司曾经因为TurboC 2.0、Borland C++ 3.1等产品在C和C++语言开发工具领域享有盛名。然而,随着微软Visual C++系列产品的崛起,Borland C++逐渐失去市场份额。但Borland并没有...
最后,对于并发和多用户环境下的数据库应用,书中会介绍如何处理并发控制、锁机制,以及如何在分布式系统中使用C++ Builder进行数据库连接和数据同步。 总的来说,《C++ Builder数据库开发经典案例解析》是一本全面...
(3) 内容广泛,兼容性强本书几乎涉及了C++Builder编程的所有领域,不仅适用于C++Builder 5,而且也适用于C++Builder 4和C++Builder 3等以前的版本。 (4) 体现了面向对象的技术和软件工程化的思想本书从总体上体现了...
我们在程序中处理Office文档的时候,常用的方法是OLE...在此提供了一个不依赖于OLE的对Excel操作的类。经测试在各个版本的vc和Borland C++下都能使用。兼容windows 系列下office 97 到office 2007所有版本的Excel文档。