OLE操作EXCEL出现的问题
本帖最后由 sxqinge 于 2012-11-02 14:47:17 编辑 提示错误:EOleSysError with message'因为应用程序正在发送一个输入同步呼叫,所以无法执行传出的呼叫'.
请问这个错误一般预示着什么问题呢?我的程序是把妖哥的稍微改动了下,如下:
1.创建EXCEL文件:
void CreateExcelFiles(AnsiString filename)
{
Variant vExcelApp, vSheet;
try
{
CoInitialize(NULL);
vExcelApp = Variant::CreateObject("Excel.Application");
}
catch(...)
{
MessageBox(0, "启动 Excel 出错, 可能是没有安装Excel.",
"WARNING", MB_OK | MB_ICONERROR);
vExcelApp = Unassigned;
return;
}
// 隐藏Excel界面
vExcelApp.OlePropertySet("Visible", false);
// 新建一个工作表
vExcelApp.OlePropertyGet("Workbooks").OleFunction("Add", 1); // 工作表
// 操作这个工作表
vSheet = vExcelApp.OlePropertyGet("ActiveWorkbook")
.OlePropertyGet("Sheets", 1);
// 表格的列数
int nColCount(8);
// 设置单元格的宽度
for(int i=0; i<nColCount; i++)
{
int nColWidth = 28;
vExcelApp.OlePropertyGet("Columns", i + 1)
.OlePropertySet("ColumnWidth", nColWidth / 2.6);
}
......//其他代码
vExcelApp.OlePropertyGet("ActiveWorkbook")
.OleFunction("SaveAs", filename.c_str());
vExcelApp.OleFunction("Quit");
vSheet = Unassigned;
vExcelApp = Unassigned;
CoUninitialize();
}
2.创建成功表格后,就每采集到一个数据,就存入该文件中:
void AddData(AnsiString filename)
{
Variant vExcelApp, vSheet;
try
{
//CoInitialize(NULL);
vExcelApp = Variant::CreateObject("Excel.Application"); //这里出现问题
}
catch(...)
{
MessageBox(0, "启动 Excel 出错, 可能是没有安装Excel.",
"WARNING", MB_OK | MB_ICONERROR);
vExcelApp = Unassigned;
return;
}
// 隐藏Excel界面
vExcelApp.OlePropertySet("Visible", false);
vExcelApp.OlePropertyGet("workbooks").OleFunction("open",filename.c_str());
// 操作这个工作表
vSheet = vExcelApp.OlePropertyGet("ActiveWorkbook")
.OlePropertyGet("Sheets", 1);
int nRow = vSheet.OlePropertyGet("UsedRange").OlePropertyGet("Rows")
.OlePropertyGet("Count") + 1;
......//这里是插入数据代码
vExcelApp.OlePropertyGet("ActiveWorkbook").OleFunction("Save");
vExcelApp.OlePropertySet("DisplayAlerts",false);
vExcelApp.OleFunction("Quit");
vSheet = Unassigned;
vExcelApp = Unassigned;
//CoUninitialize();
}
问题就是在AddData函数中,代码的红色标识处,在该处设置断点,走下去的时候就提示如上的错误了,网上没找到相关资料,我现在只是顺序操作,没有其他进程调用这个AddData函数,怎么会出现这样的问题呢?不得其解,求解释。
[解决办法]
1. 创建Excel文件以前,先判断文件是否存在,如存在,直接打开。
2. 如果这个Excel对象在写完以后还要继续写,那就不要关闭它。
3. 如果新创建的文件保存时文件已存在,需要屏蔽掉Excel的警告提示:
vExcelApp.OlePropertySet("DisplayAlerts", false);
[解决办法]
会不会是你要输出的那个Excel正在进行的操作有冲突?
字面上理解是在等输入,但是你那句是要获取他的信息来输出.
我之前做的时候也是,要修改单元格里面的值,如果我让单元格处于编辑状态,然后再使用修改的话就会报出“被呼叫方拒绝接收呼叫”
不是太懂.给点参考而已