如何在OLE中调用Excel文件,并打印...

sasa_sasa 2003-02-17 01:40:48
我用OLE控件调节器用一个Excel文件,但打印工具被屏蔽,请问如何解决: OleContainer1->CreateObjectFromFile("c:\\执行情况总表.xls",false);

...全文
281 11 打赏 收藏 转发到动态 举报
写回复
用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表格的操作仅作为个人观点和水平呈献给关心此问题的读者,如果有更好的方式方法,敬请指教,不胜感激。

13,826

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧