存取Excel表格
我以下的程序拆迁执行时为何会出错?
#include <vcl.h>
#pragma hdrstop
#include "excel.h"
#include "vcl\utilcls.h" // util classes实用类说明
#define PG OlePropertyGet
#define PS OlePropertySet
#define FN OleFunction
#define PR OleProcedure
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//-----------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//----------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Variant Ex,Wb,Sh1;
Ex=Variant::CreateObject("Excel.Application");
Ex.PG("WorkBooks").PR("Open","c:\temp\book1.xls");
Wb=Ex.PG("ActiveWorkBook");
Sh1=Wb.PG("ActiveSheet");
for (int i=1;i<=10;i++)
for (int j=1;j<=10;j++)
Sh1.PG("Cells",i,j).PS("Value",i*100+j);
Wb.PR("Save","c:\temp\book1.xls");
Wb.PR("Close","c:\temp\book1.xls");
return;
}
//----------------------------------------------------------------------
问题点数:30、回复次数:27Top
1 楼zzroom(徐子陵)回复于 2001-02-12 13:50:00 得分 0
我用的是C++BUILDER5。Top
2 楼Hank(星星农场)回复于 2001-02-12 15:09:00 得分 0
没有心情和你仔细分析了,反正问题很多,再说,你连文件存在测试都没有,Excel97有没有安装也不知道?算了,看一下我的代码:
void __fastcall TInvoiceform::BitBtn3Click(TObject *Sender)
{
OpenDialog1->Filter="*.XLS|*.XLS";
OpenDialog1->DefaultExt="*.XLS";
if (OpenDialog1->Execute())
{
Variant MSSheet,MSExcel=CreateOleObject("Excel.Application");
MSExcel.OlePropertyGet("WorkBooks").OleProcedure("Open",OpenDialog1->FileName);
MSSheet=MSExcel.OlePropertyGet("ActiveWorkBook").OlePropertyGet("ActiveSheet");
Table2->Close();
Table2->EmptyTable();
Table2->Open();
MSExcel.OlePropertySet("Visible",False);
int Linesing=1;
while (Trim(MSSheet.OlePropertyGet("Cells",Linesing,1).OlePropertyGet("Value"))!="")
{
try
{
StrToFloat(Trim(MSSheet.OlePropertyGet("Cells",Linesing,4).OlePropertyGet("Value")));
if (!Table2->FindKey(ARRAYOFCONST((Trim(MSSheet.OlePropertyGet("Cells",Linesing,1).OlePropertyGet("Value"))))))
{
Table2->Edit();
Table2->Append();
Table2->FieldByName("SHORTCODE")->AsString=Trim(MSSheet.OlePropertyGet("Cells",Linesing,1).OlePropertyGet("Value"));
Table2->FieldByName("SELECODE")->AsString=Trim(MSSheet.OlePropertyGet("Cells",Linesing,3).OlePropertyGet("Value"));
Table2->FieldByName("SELEPRICE")->AsFloat=MSSheet.OlePropertyGet("Cells",Linesing,4).OlePropertyGet("Value");
Table2->Post();
}
else
{
Linesing++;
continue;
}
}
catch(...)
{
Linesing++;
continue;
}
Linesing++;
}
MSExcel.OlePropertyGet("ActiveWorkBook").OleProcedure("Close");
Application->MessageBox("读取完成!","Invoice Process System",MB_OK+MB_ICONINFORMATION);
}
}Top
3 楼BCB(天下三分明月夜,二分无赖是扬州)回复于 2001-02-12 16:42:00 得分 30
要用\\,不要我也常搞错
;
Wb.PR("Save","c:\\temp\\book1.xls");
Wb.PR("Close","c:\\temp\\book1.xls");
");
Ex.PG("WorkBooks").PR("Open","c:\\temp\\book1.xls");
Top
4 楼BCB(天下三分明月夜,二分无赖是扬州)回复于 2001-02-12 16:46:00 得分 0
C语言就是有点怪,一个不注意的小问题
会使你忙几天都找不出头绪;Top
5 楼BCB(天下三分明月夜,二分无赖是扬州)回复于 2001-02-12 17:03:00 得分 0
明白了?将" \ "改成“\\"试试Top
6 楼zzroom(徐子陵)回复于 2001-02-12 23:27:00 得分 0
致BCB:我已将" \ "改成“\\",可还是报错,为何?Top
7 楼BCB(天下三分明月夜,二分无赖是扬州)回复于 2001-02-13 08:20:00 得分 0
还错?!头"excel.h"干什么用的,
你的机器上有没有装office97?
你贴的那段程序其实就是我发表在计算机世界电子版上的文章,
我是试好后再发表的,原程序给你再贴一下:
#include "Unit1.h" // C++Builder程序片段
#include "vcl\utilcls.h" // util classes实用类说明
// …省写此处原一段代码
// 请在此处插入上面提及的四个宏定义语句
void __fastcall TForm1::Button1Click(TObject *Sender)
{ Variant Ex,Wb,Sh1;
Ex=Variant::CreateObject("Excel.Application");
Ex.PG("WorkBooks").PR("Open","c:\\book1.xls");
Wb=Ex.PG("ActiveWorkBook"); Sh1=Wb.PG("ActiveSheet");
Edit1->Text=Sh1.PG("Cells",1,1).PG("Value");
for (int i=1;i<=10;i++)
for (int j=1;j<=10;j++)
Sh1.PG("Cells",i,j).PS("Value",i*100+j);
Wb.PR("Save"); Wb.PR("Close");
}
使用这种方法的程序运行时,必须保证系统中同时有MS OFFICE
Top
8 楼BCB(天下三分明月夜,二分无赖是扬州)回复于 2001-02-13 08:22:00 得分 0
你试的那段代码运行时出现什么错误?Top
9 楼zzroom(徐子陵)回复于 2001-02-13 13:09:00 得分 0
我装的是office2000,程序报执行OleProcedure函数出错。
Top
10 楼BCB(天下三分明月夜,二分无赖是扬州)回复于 2001-02-13 13:45:00 得分 0
可能问题就在这里,我的程序是在office97中
试的Top
11 楼BCB(天下三分明月夜,二分无赖是扬州)回复于 2001-02-13 14:01:00 得分 0
我问大家一个问题,下列语句
Workbooks.Open FileName:="C:\rb010212.xls", Editable:=False
怎样改成C++BUILDER的语句?
Top
12 楼hejlcs(南国豆)回复于 2001-02-13 14:37:00 得分 0
(1)去掉#include "excel.h"
(2)"\"改为"\\"
(3)将
Wb.PR("Save","c:\temp\book1.xls");
Wb.PR("Close","c:\temp\book1.xls");
改为
Wb.PR("Save");
Wb.PR("Close");
(4)c++builder5.0+MSOffice2000下测试OK!Top
13 楼javaw(感觉总会有这么一天)回复于 2001-02-13 15:28:00 得分 0
BCB,看来你是高手,我想问问学习C++Builder有写什么好书?想人家VC的《dissecting MFC》《inside Visaul C++》等,我做了一段时间的CB了,发觉入门较易(我的入门可能与你说的不同:-)),但是要作好还是不很容易,有没有什么好书推荐几本?wangyujia@263.netTop
14 楼zzroom(徐子陵)回复于 2001-02-13 21:00:00 得分 0
多谢BCB,按你说的我已将问题解决。
再问多一个问题:
通过什么知道MsAccess2000有哪些方法和函数,例如新建一个工作表、新建一个工作薄用什么命令?Top
15 楼BCB(天下三分明月夜,二分无赖是扬州)回复于 2001-02-14 09:38:00 得分 0
其实谈不上是什么高手,好多东西也在学,跟大家探讨着;
C++BUILDER 的书不多,全是入门的东西,未见什么好书,
全是抄自C++BUILDER的HELP,各种书都看看,日积月累;
MSACESS2000没试过,很抱歉
Top
16 楼BCB(天下三分明月夜,二分无赖是扬州)回复于 2001-02-14 10:00:00 得分 0
BCB5上有一组OFFICE97与OFFICE2000控件,
未试过,不知好用不好用?Top
17 楼zzroom(徐子陵)回复于 2001-02-14 13:01:00 得分 0
再次多谢BCB!
我上一个问题是这样意思:
打开一个已经存在的工作薄用"open",而新建一个工作表、新建一个工作薄又用什么命令?
什么地方有MsAccess2000全部方法和函数的资料? Top
18 楼BCB(天下三分明月夜,二分无赖是扬州)回复于 2001-02-14 14:37:00 得分 0
首先用EXCEL的宏录制功能录制一下,看宏语句是什么?
新建一Workbook的宏语句是:
Workbooks.Add
新建一WorkSheet的宏语句是:
Worksheets.Add
再到EXECL的BASIC里查一下ADD方法!
改成BCB:
Ex=Variant::CreateObject("Excel.Application");
Varint Wb1=Ex.PG("WorkBooks").FN("Add");
Varint Sh2=Wb1.PG("WorkSheets").FN("Add");
试一试,若不行就将其中的 FN改PR再试试
Top
19 楼BCB(天下三分明月夜,二分无赖是扬州)回复于 2001-02-15 11:06:00 得分 0
最近我也在编读Excel表格,对不完善地方,有一点改动,供参考:
void __fastcall TForm1::Button1Click(TObject *Sender)
{ Variant Ex,Wb,Sh1;
Ex=Variant::CreateObject("Excel.Application");
if (VarIsEmpty(Ex))
{
ShowMessage("系统没有 Ms Excel !");
return;
}
Ex.PS("Visible",false); // Excel 是否可见
Ex.PS("DisplayAlerts",false); // 是否要出现警告
Ex.PG("WorkBooks").PR("Open","c:\\book1.xls");
Wb=Ex.PG("ActiveWorkBook"); // 工作薄对象
Sh1=Wb.PG("ActiveSheet"); // 工作表对象
Edit1->Text=Sh1.PG("Cells",1,1).PG("Value");
for (int i=1;i<=10;i++)
for (int j=1;j<=10;j++)
Sh1.PG("Cells",i,j).PS("Value",i*100+j);
Wb.PR("Save"); Wb.PR("Close");// 关闭工作薄
Ex.PR("Quit"); // 退出Ms Excel
}
Top
20 楼zzroom(徐子陵)回复于 2001-02-15 13:31:00 得分 0
再问BCB:
为何用FN?我曾经用过PR(“add"),不行。现在去试试FN。
再次多谢!Top
21 楼BCB(天下三分明月夜,二分无赖是扬州)回复于 2001-02-15 14:04:00 得分 0
我也糊里糊涂,没有资料可查,
有返回值的可能就要FN,Top
22 楼zzroom(徐子陵)回复于 2001-02-15 23:21:00 得分 0
请大家各抒己见!Top
23 楼zzroom(徐子陵)回复于 2001-02-16 10:31:00 得分 0
打开一个已经存在的工作薄用"open",而新建一个工作表、新建一个工作薄又用什么命令?
什么地方有MsAccess2000全部方法和函数的资料? Top
24 楼BCB(天下三分明月夜,二分无赖是扬州)回复于 2001-02-16 10:37:00 得分 0
首先用EXCEL的宏录制功能录制一下,看宏语句是什么?
Top
25 楼zzroom(徐子陵)回复于 2001-02-16 23:21:00 得分 0
致BCB:
再次多谢你!
yhec是你的邮箱吗?我可否直接发信给你?可告诉我你的OICQ吗?
Email: zzroom@21cn.comTop
26 楼zzroom(徐子陵)回复于 2001-02-17 12:45:00 得分 0
致BCB:
再次多谢你!
yhec是你的邮箱吗?我可否直接发信给你?可告诉我你的OICQ吗?
Email: zzroom@21cn.com Top
27 楼BCB(天下三分明月夜,二分无赖是扬州)回复于 2001-02-17 15:54:00 得分 0
yes
17461273
Top




