社区
C++ Builder
帖子详情
如何在OLE中调用Excel文件,并打印...
sasa_sasa
2003-02-17 01:40:48
我用OLE控件调节器用一个Excel文件,但打印工具被屏蔽,请问如何解决: OleContainer1->CreateObjectFromFile("c:\\执行情况总表.xls",false);
...全文
281
11
打赏
收藏
如何在OLE中调用Excel文件,并打印...
我用OLE控件调节器用一个Excel文件,但打印工具被屏蔽,请问如何解决: OleContainer1->CreateObjectFromFile("c:\\执行情况总表.xls",false);
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
11 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
baffling
2003-05-28
打赏
举报
回复
gz
yjflf
2003-03-17
打赏
举报
回复
以上代码在98下不好用啊
liye20000
2003-02-26
打赏
举报
回复
gz
猎人66
2003-02-19
打赏
举报
回复
我们用QQ聊吧,
QQ:81547289
sasa_sasa
2003-02-17
打赏
举报
回复
我的机器上有打印驱动..嵌入WORD好用...
我不懂电脑
2003-02-17
打赏
举报
回复
可能是你没有安装打印驱动程序。
sasa_sasa
2003-02-17
打赏
举报
回复
你们的方法.我试过了.这些方法是在调用Excel,而不是把Excel嵌入到OLE中,
如果把Excel嵌入OLE中时,打印图标就被屏蔽了....这该如何是好呀??
lining_cumt985
2003-02-17
打赏
举报
回复
给你一段代码先(采用OLE方式):
#include "utilcls.h"
#include "excel_97.h"
try
{
Variant MSExcel=CreateOleObject("Excel.Application"); //创建Excel Ole对象
MSExcel.OlePropertyGet("WorkBooks").OleProcedure("Add"); //添加WorkBook
MSExcel.OlePropertySet("Visible",True); //使Excel可视
//不显示背景的网格线
MSExcel.OlePropertyGet("ActiveWindow").OlePropertySet("DisplayGridlines",False);
//设置列宽
MSExcel.OlePropertyGet("ActiveWorkBook").OlePropertyGet("ActiveSheet").OlePropertyGet("Columns",1).OlePropertySet("ColumnWidth",20);
//设置行高
MSExcel.OlePropertyGet("ActiveWorkBook").OlePropertyGet("ActiveSheet").OlePropertyGet("Rows",1).OlePropertySet("RowHeight",50);
//为单元格填值
MSExcel.OlePropertyGet("ActiveWorkBook").OlePropertyGet("ActiveSheet").OlePropertyGet("Cells",1,1).OlePropertySet("Value","SaveTheEarth的Excel例子");
//合并单元格
MSExcel.OlePropertyGet("ActiveWorkBook").OlePropertyGet("ActiveSheet").OlePropertyGet("Range","A1:D1").OleFunction("Merge");
//设置字体
MSExcel.OlePropertyGet("ActiveWorkBook").OlePropertyGet("ActiveSheet").OlePropertyGet("Range","A1:D1").OlePropertyGet("Font").OlePropertySet("Name","隶书");
MSExcel.OlePropertyGet("ActiveWorkBook").OlePropertyGet("ActiveSheet").OlePropertyGet("Range","A1:D1").OlePropertyGet("Font").OlePropertySet("Size",18);
MSExcel.OlePropertyGet("ActiveWorkBook").OlePropertyGet("ActiveSheet").OlePropertyGet("Range","A1:D1").OlePropertyGet("Font").OlePropertySet("Bold",True);
MSExcel.OlePropertyGet("ActiveWorkBook").OlePropertyGet("ActiveSheet").OlePropertyGet("Range","A1:D1").OlePropertyGet("Font").OlePropertySet("Italic",True);
MSExcel.OlePropertyGet("ActiveWorkBook").OlePropertyGet("ActiveSheet").OlePropertyGet("Range","A1:D1").OlePropertyGet("Font").OlePropertySet("Underline",True);
MSExcel.OlePropertyGet("ActiveWorkBook").OlePropertyGet("ActiveSheet").OlePropertyGet("Range","A1:D1").OlePropertyGet("Font").OlePropertySet("Color",clRed);
//设置对齐方式
//垂直对齐 1:左端对齐,3:居中, 4:右端对齐
MSExcel.OlePropertyGet("ActiveWorkBook").OlePropertyGet("ActiveSheet").OlePropertyGet("Range","A1:D1").OlePropertySet("HorizontalAlignment",3);
//水平对齐 1:顶端对齐,2:居中, 3:底端对齐
MSExcel.OlePropertyGet("ActiveWorkBook").OlePropertyGet("ActiveSheet").OlePropertyGet("Range","A1:D1").OlePropertySet("VerticalAlignment",2);
for (int i=3;i < 10;i++)
{
for (int j=1;j<5;j++)
{
// 显示边框
MSExcel.OlePropertyGet("ActiveWorkBook").OlePropertyGet("ActiveSheet").OlePropertyGet("Cells",i,j).OleFunction("BorderAround",1,2,1);
MSExcel.OlePropertyGet("ActiveWorkBook").OlePropertyGet("ActiveSheet").OlePropertyGet("Cells",i,j).OlePropertySet("Value",IntToStr(i+j));
};
};
MSExcel.OlePropertyGet("ActiveWorkBook").OleProcedure("Close");
}
catch(...)
{
Application->MessageBox("没有安装Microsoft Excel办公软件!","系统信息",MB_OK+MB_ICONWARNING);
devie
2003-02-17
打赏
举报
回复
Microsoft Excel作为一个功能强大的电子表格处理软件,已经得到了广泛的应用。在数据库应用软件开发过程中,如果能实现数据库与Excel文件的数据交换,那么一方面能增加数据库数据的来源,另一方面也能方便用户对数据库数据的进一步处理。
C++ Builder是一个可视化快速应用程序开发工具,它提供的OLE Automation机制使得开发人员在应用程序中就能调用Excel,实现数据交换。
在C++ Builder中调用Excel,首先要为Excel建立一个OLE对象,然后通过设定该对象的属性和调用该对象的方法来操纵Excel。C++ Builder通过CreateOleObject()来建立OLE对象;用OlePropertySet(propname,value)来设置OLE对象的属性;用OlePropertyGet(propname)获得OLE对象的属性;通过OleFunction(oleFuncName,[val,...])和OleProcedure(oleProcName,[val,...])来调用OLE对象的方法。
C++ Builder中使用OLE自动化操纵Excel,必须掌握Excel的自动化对象及VBA关于Excel的对象方法和属性,这些都在Microsoft Office(完全安装)的VBAXL8.HLP帮助文件中可以找到,在此就不再赘述。下面以将数据库中的数据转到Excel工作薄中为例,说明C++ Builder操纵Excel的具体方法。
首先新建一个表单Form1,保存单元文件Unit1.cpp,保存工程文件Project1.bpr。然后在表单中加入数据访问控件TTable,将Name属性设为Table1,DatabaseName属性设为BCDEMOS,TableName属性设为Country.db。在表单中加入一个按钮控件TButton,将其Name属性设为Button1,Caption属性设为 “转换为Excel文件”。双击Button1,在Button1Click()函数中加入如下代码:
Variant ex,newxls;
int i,j=1;
try
{
ex=CreateOleObject(″Excel.Application″); //启动Excel
}
catch(...)
{
ShowMessage(″无法启动Excel″);
}
ex.OlePropertySet(″Visible″,(Variant)true); //使Excel启动后可见
newxls=(ex.OleFunction(″Workbooks″)).OleFunction(″Add″);//新建一个工作薄
Table1-〉Active=true;
//打开数据库
Table1-〉First();
for(i=0;i〈Table1-〉FieldCount;i++)
//将字段名写到工作薄的第一行
{
(ex.OleFunction(″Cells″)).OlePropertySet(″Item″,(Variant)1,(Variant)(i+1),(Variant)Table1-〉Fields[i]-〉FieldName);
}
while(!Table1-〉Eof)
//将数据库中的记录依次写到工作薄中
{
j=j+1;
for(i=0;i〈Table1-〉FieldCount;i++)
{
(ex.OleFunction(″Cells″)).OlePropertySet(″Item″,(Variant)j,(Variant)(i+1),
(Variant)Table1-〉Fields[i]-〉AsString);
}
Table1-〉Next();
}
newxls.OleFunction(″SaveAs″,(Variant)filename);
//保存工作薄,filename是工作薄的全文件名
ex.OleFunction(″Quit″);
//退出Excel,释放OLE对象
注意,要使用OLE自动化对象,在编译之前还必须在Unit1.cpp文件前面加上#include ″ComObj.hpp″。
运行程序就可以实现将数据库中的数据转换到Excel工作薄中。同样的道理,使用OlePropertyGet()函数,也可以将Excel工作薄中的数据读到数据库中去。
sasa_sasa
2003-02-17
打赏
举报
回复
但这个方法,不能把Excel嵌入OLE控件中,有没有更好的方法.使Excel文件嵌入OLE中,并可打印....
请高手指教
cscer
2003-02-17
打赏
举报
回复
在C++Builder中用Ole控制Excel表
黑龙江省通信公司 姜宏华
利用C++Builder的快速报表做表格是比较麻烦的事儿。如果打出来的表格需要手工修改数据,或者要保存成可以编辑的文件,那怎么办?现在许多单位用的都是Excel表格,如何让程序做出来的报表和Excel兼容,也是问题。那么就可以让C++Builder直接操作Excel表,这样就方便多了。
笔者在实际工作中经常用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>
在Form1.cpp的文件头中加入
#pragma link "Excel_2K_SRVR"
主要代码如下:
void __fastcall TForm1:: SaveButtonClick(TObject *Sender)
{
try
{
SaveButton->Enabled = false;
ReadButton->Enabled = false;//使两个按钮无效
//取报表文件CardSend.xls的完整目录名
AnsiString ExcelFileName = GetCurrentDir()+"\\trpt\\table.xls";
if(!FileExists(ExcelFileName))
{
Application->MessageBox("报表模板文件不存在,无法打开!",
"错误",MB_ICONSTOP|MB_OK);
return;
}
//建立Excel的Ole对象Ex
try
{
Ex = Variant::CreateObject("Excel.Application");
}
catch(...)
{
Application->MessageBox("无法启动Excel","错误",MB_ICONSTOP|MB_OK);
return;
}
//设置Excel为不可见
Ex.OlePropertySet("Visible",false);
//打开指定的Excel报表文件。报表文件中最好设定只有一个Sheet。
Ex.OlePropertyGet("WorkBooks").OleProcedure("Open",ExcelFileName.c_str());
Wb = Ex.OlePropertyGet("ActiveWorkBook");
Sheet = Wb.OlePropertyGet("ActiveSheet");//获得当前默认的Sheet
//清空Excel表,这里是用循环清空到第300行。对于一般的表格已经足够了。
AnsiString strRowTemp;
AnsiString strRange;
int iCols,iRows;//记录列数和行数
/*从第三行开始,到第300行止。一般第一行是表标题,第二行是副标题或者制表日期。*/
for(iRows=3;iRows<300;iRows++)
{ //假设只有6列。
for (iCols = 1;iCols < 7; iCols++)
{
//清空行
Sheet.OlePropertyGet("Cells",iRows,iCols).OlePropertySet("Value","");
}
//去掉表格边框
strRange = "A"+IntToStr(iRows)+":F"+IntToStr(iRows);//获取操作范围
ERange = Sheet.OlePropertyGet("Range",strRange.c_str());
EBorders = ERange.OlePropertyGet("Borders");//获取边框对象
EBorders.OlePropertySet("linestyle",xlNone);
}
AnsiString strPtrDate; //存放当前日期,作为制表日期
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 = "报表标题";//报表标题
//将报表标题置于第一行第一列。在此之前,应将报表文件的标题格式设定好。
Sheet.OlePropertyGet("Cells",1,1).OlePropertySet("Value",
strData.c_str());
//将制表日期置于表格第二行的右侧。
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");
//画表格边框,在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++;
//从数据库中取数据(略),假设数据集放入Query1中。
Query1->Open();//打开数据集
//循环取数
while(!Query1->Eof)
{
//循环取字段的数据放到Excel表对应的行列中
for(iCols=1;iCols<7;iCols++)
{
strRowTemp = Query1->Fields->Fields[iCols-1]->AsString;
Sheet.OlePropertyGet("Cells",iRows,iCols).OlePropertySet("Value",
strRowTemp.c_str());
}
//画该行的表格边框
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
//定义目标文件名
AnsiString DestinationFile =
GetCurrentDir()+"\\report\\table.xls";
//将刚刚修改的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
{
//指定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;
}
//使Excel可见
Ex.OlePropertySet("Visible",true);
//打开Excel表格文件Table.xls
Ex.OlePropertyGet("WorkBooks").OleProcedure("Open",ExcelFileName.c_str());
}
catch(...)
{
Application->MessageBox("操作Excel表格错误!","错误",MB_ICONSTOP|MB_OK);
Ex.OleFunction("Quit");
}
}
以上关于C++BuilderExcel表格的操作仅作为个人观点和水平呈献给关心此问题的读者,如果有更好的方式方法,敬请指教,不胜感激。
VC
打印
word,
excel
文本
文件
的方法
关于VC如何打开一个
excel
,这方面的资料很多了,一般用的是
OLE
Avtive Control/假设当你打开了一个
excel
文件
,并获得了它的 workbook的handle,相应的接口为: 代码如下:C
Ole
Variant covTrue((short)true); ...
Access 2000数据库系统设计(PDF)---002
1457.2.4 处理外部
文件
中
的图像 1487.2.5 将字段数据类型转换为Access数据 类型 1497.2.6 使用链接表管理器加载项重新 链接表 1507.2.7 导入表和将数据库
文件
链接为表 1507.3 导入和链接电子数据表
文件
1517.3.1 ...
Access 2000数据库系统设计(PDF)---001
1457.2.4 处理外部
文件
中
的图像 1487.2.5 将字段数据类型转换为Access数据 类型 1497.2.6 使用链接表管理器加载项重新 链接表 1507.2.7 导入表和将数据库
文件
链接为表 1507.3 导入和链接电子数据表
文件
1517.3.1 ...
Access 2000数据库系统设计(PDF)---018
1487.2.5 将字段数据类型转换为Access数据类型 1497.2.6 使用链接表管理器加载项重新链接表 1507.2.7 导入表和将数据库
文件
链接为表 1507.3 导入和链接电子数据表
文件
1517.3.1 通过导入
Excel
工作表创建一个表 1517....
Access 2000数据库系统设计(PDF)---003
1457.2.4 处理外部
文件
中
的图像 1487.2.5 将字段数据类型转换为Access数据 类型 1497.2.6 使用链接表管理器加载项重新 链接表 1507.2.7 导入表和将数据库
文件
链接为表 1507.3 导入和链接电子数据表
文件
1517.3.1 ...
C++ Builder
13,826
社区成员
102,678
社区内容
发帖
与我相关
我的任务
C++ Builder
C++ Builder相关内容讨论区
复制链接
扫一扫
分享
社区描述
C++ Builder相关内容讨论区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章