麻烦各位高手,用c++Builder读取excel数据出错,请大家帮帮忙

ipowerful 2012-07-20 04:30:17
程序很简单,我想把excel的数据读进c++builder的数组或者数据库中,但是遇到一些问题,我还在上学,才刚上手BCB,希望大家帮帮忙。
运行后显示Isbound()@c:\bcb\emuvcl\utilcl.h/4249;继续运行时报错,错误出现处已注释标出
以下是程序:
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "ComObj.hpp"
#include"Utilcls.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
#define PG OlePropertyGet
#define PS OlePropertySet
#define FN OleFunction
#define PR OleProcedure
//---------------------------------------------------------------------------

void __fastcall TForm1::N15Click(TObject *Sender)
{

Variant ExcelApp;
Variant Workbook1;
Variant Sheet1;
ExcelApp.PG("workbooks").FN("open", "G:\project\dungou\data\操作参数.xls"); //提示本行出现错误
Workbook1.PG("Sheets", 1).PR("Select");
Sheet1 = Workbook1.PG("ActiveSheet");
for(int i=2;i<=20;i++){
HS[i-2]=StrToFloat(Sheet1.PG("Cells", i, 1).PG("Value")); //HS dt pm为定义的数组
dt[i-2]=StrToFloat(Sheet1.PG("Cells", i, 2).PG("Value"));
pm[i-2]=StrToFloat(Sheet1.PG("Cells", i, 3).PG("Value"));
};
ExcelApp.Exec(Procedure("Quit"));
ExcelApp=Unassigned;
Workbook1=Unassigned;
Sheet1=Unassigned;
}
能不能帮忙修改一下呢,感激不尽!
...全文
405 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
孙员外 2012-12-19
  • 打赏
  • 举报
回复
有了妖哥和洪七这样的好汉,CSDN才有的发展啊
ipowerful 2012-07-21
  • 打赏
  • 举报
回复
恩 就是这个问题 搞定了 非常感谢!!!
hong_qi 2012-07-20
  • 打赏
  • 举报
回复
仔细看了一下,还差一句关键代码:

ExcelApp.PG(WideString(L"Workbooks")).FN(WideString(L"open"), WideString(L"d:\\新建 Microsoft Excel 工作表.xls"));
Workbook1 = ExcelApp.PG( WideString(L"ActiveWorkbook"));//加上这一句
//Workbook1.PG("Sheets", 1).PR("Select");//这句不要也行
Sheet1 = Workbook1.PG("ActiveSheet");
for(int i=2;i<=20;i++)
{
HS[i-2]=StrToFloat(Sheet1.PG("Cells", i, 1).PG("Value")); //HS dt pm为定义的数组
dt[i-2]=StrToFloat(Sheet1.PG("Cells", i, 2).PG("Value"));
pm[i-2]=StrToFloat(Sheet1.PG("Cells", i, 3).PG("Value"));
};
ExcelApp.PG(WideString(L"Workbooks")).FN(WideString(L"close"));//这一句在Quit前
ExcelApp.Exec(Procedure("Quit"));

上面的代码用cbXE2调试通过,能正常读出数据。
Java_Open_Source 2012-07-20
  • 打赏
  • 举报
回复
你的那个XLS打开了吗,会不会被Excel打开了,然后使用程序读就出问题了。
ccrun.com 2012-07-20
  • 打赏
  • 举报
回复
楼主,请认认真真仔仔细细看看我在5楼的回复。

另外,6楼不是我回复的,不要影响你的思路。
ipowerful 2012-07-20
  • 打赏
  • 举报
回复
void __fastcall TForm1::N15Click(TObject *Sender)
{
int i;
Variant ExcelApp;
Variant Workbook1;
Variant Sheet1;
try
{
ExcelApp = Variant::CreateObject(WideString (L"Excel.Application"));
}
catch(...)
{
MessageBox( NULL, "无法启动 Excel,请检查 Excel程序 是否安装。 ", "错误", MB_OK|MB_ICONSTOP );
return;
}
ExcelApp.OlePropertySet( WideString(L"Visible"),false);//这一句可要可不要。

ExcelApp.PG(WideString(L"Workbooks")).FN(WideString(L"open"), WideString(L"G:\\project\\dungou\\data\\操作参数.xls"));
Workbook1.PG(WideString(L"Sheets"), 1).PR(WideString(L"Select"));
Sheet1 = Workbook1.PG(WideString(L"ActiveSheet"));
// for(i=2;i<=20;i++){
// HS[i-2]=StrToFloat(Sheet1.PG("Cells", i, 1).PG("Value"));
// dt[i-2]=StrToFloat(Sheet1.PG("Cells", i, 2).PG("Value"));
// pm[i-2]=StrToFloat(Sheet1.PG("Cells", i, 3).PG("Value"));
// };
WideString str=Sheet1.PG(WideString(L"Cells"), 4, 2).PG(WideString(L"Value"));//换了一个简单的输入先试一下
ExcelApp.Exec(Procedure(WideString(L"Quit")));
ExcelApp.PG(WideString(L"Workbooks")).FN(WideString(L"close"));
ExcelApp=Unassigned;
Workbook1=Unassigned;
Sheet1=Unassigned;
文件是有的,我的excel是10的,还特意存成了97-03兼容版的XLS。。。
PS:现在能运行到Sheet1 = Workbook1.PG(WideString(L"ActiveSheet"))的那一行了,然后开始报之前的提醒,之后报错。。。
ccrun.com 2012-07-20
  • 打赏
  • 举报
回复
1. 确定那个XLS文件存在?
2. 把你现在的代码贴出来看看。
ipowerful 2012-07-20
  • 打赏
  • 举报
回复
我把所有的字符串都改成WideString格式后能运行到
Sheet1 = Workbook1.PG(WideString(L"ActiveSheet"));//但这行还是运行不了
ipowerful 2012-07-20
  • 打赏
  • 举报
回复
还是最开始说的那一行。。。我觉得跟它弹出的提示有关 不过找不出来原因
ccrun.com 2012-07-20
  • 打赏
  • 举报
回复
单步跑一下,看看在哪一行代码处出错?
ipowerful 2012-07-20
  • 打赏
  • 举报
回复
对的,文档里面第一行是字段,下面都是数据,存到float数组中,HS,dt都是。程序不复杂,但一直不通,非常想不通。
ccrun.com 2012-07-20
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
还是没成功,问题一样
[/Quote]

你就是想打开那个文档,然后读取指定单元格的数据到数组吧。HS和dt这些是什么类型的?
ipowerful 2012-07-20
  • 打赏
  • 举报
回复
还是没成功,问题一样
hong_qi 2012-07-20
  • 打赏
  • 举报
回复
问题一:前面缺语句。加上下面的代码:
try
{
ExcelApp = Variant::CreateObject(WideString (L"Excel.Application"));
}
catch(...)
{
MessageBox( NULL, L"无法启动 Excel,请检查 Excel程序 是否安装。 "
, L"错误", MB_OK|MB_ICONSTOP );
return;
}
ExcelApp.OlePropertySet( WideString(L"Visible"),false);//这一句可要可不要。
问题二:字符串尽量用WideString,可确保兼容性。
ExcelApp.PG(WideString(L"Workbooks")).FN(WideString(L"open"), WideString(L"d:\\新建 Microsoft Excel 工作表.xls"));
问题三:不要忘了Close
ExcelApp.PG(WideString(L"Workbooks")).FN(WideString(L"close"));
ccrun.com 2012-07-20
  • 打赏
  • 举报
回复
你的Workbook1没有初始化啊老弟。

try
{
ExcelApp = Variant::CreateObject("Excel.Application");
}
catch(...)
{
MessageBox(0, "启动 Excel 出错.", "", MB_OK | MB_ICONERROR);
return;
}

// 新建一个工作表
ExcelApp.PG("workbooks").FN("open",
WideString("G:\\project\\dungou\\data\\操作参数.xls"));

Workbook1 = ExcelApp.OlePropertyGet("ActiveWorkbook");
Sheet1 = Workbook1.PG("ActiveSheet");

for (int i = 2; i <= 20; i++)
...
ipowerful 2012-07-20
  • 打赏
  • 举报
回复
谢谢 有进展了。。。不过提示还在 不知道为什么?
而且运行后显示:
template <class P1>
Variant Variant::OlePropertyGet(const String& name, P1 p1)
{
TAutoArgs<1> args;
args[1] = p1;
return OlePropertyGet(name, static_cast<TAutoArgsBase*>(&args)); //本行出错
}
刚用了网上一段写入程序,也是这行的问题,是我电脑配制的问题?还是语句问题啊?
ccrun.com 2012-07-20
  • 打赏
  • 举报
回复
你都没有创建Excel对象的。

try
{
ExcelApp = Variant::CreateObject("Excel.Application");
}
catch(...)
{
MessageBox(0, "启动 Excel 出错.", "", MB_OK | MB_ICONERROR);
return;
}

// 新建一个工作表
ExcelApp.PG("workbooks").FN("open",
WideString("G:\\project\\dungou\\data\\操作参数.xls"));
...
ipowerful 2012-07-20
  • 打赏
  • 举报
回复
还是上面说的问题,运行时的提示Isbound()@c:\bcb\emuvcl\utilcl.h/4249还在,这一句还是报错
ccrun.com 2012-07-20
  • 打赏
  • 举报
回复
ExcelApp.PG("workbooks").FN("open",
WideString("G:\\project\\dungou\\data\\操作参数.xls"));

13,825

社区成员

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

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