一、开发环境
编程环境 VS2015
office版本 office 2016
二、参考博文
VS2010 对Excel读写操作
https://blog.youkuaiyun.com/ywx123_/article/details/77074038
- 可以正常执行
C++使用OLE高速读写EXCEL的源码
https://blog.youkuaiyun.com/fullsail/article/details/8449448
- 需要修改,修改后正常
三、实现中发现的问题
-
屏蔽掉导入每个头文件下的//#import “D:\Program Files (x86)\Microsoft Office\Office14\EXCEL.EXE” no_namespace
-
编译出现1>c:\users\desktop\exceltest\crange.h(335): warning C4003: “DialogBoxW”宏的实参不足。将DialogBox修改为_DialogBox。
-
在void IllusionExcelFile::SaveasXSLFile(const CString &xls_file) 中的SaveAs函数缺少了一个变量,然后查看了函数原型,增加了一个covOptional,编译通过。
四、实际应用中出现的问题
- 因为我的EXCEL 中的A1项被合并了,导致获取代码错误,花了我很长时间早资料!修改如下:
void IllusionExcelFile::SetCellString(long irow, long icolumn, CString new_string)
{
COleVariant new_value(new_string);
//CRange start_range = excel_work_sheet_.get_Range(COleVariant(_T("A1")), covOptional);
//CRange write_range = start_range.get_Offset(COleVariant((long)irow - 1), COleVariant((long)icolumn - 1));
//write_range.put_Value2(new_value);
//start_range.ReleaseDispatch();
//write_range.ReleaseDispatch();
CRange write_range;
write_range.AttachDispatch(excel_current_range_.get_Item(COleVariant((long)irow), COleVariant((long)icolumn)).pdispVal, true);
write_range.put_Value2(new_value);
write_range.ReleaseDispatch();
}
后面觉得每次算列的值很烦,稍微封装了一下
void IllusionExcelFile::SetCell(long irow, char icolumn, int new_int)
{
// sp1 先把icolumn转成大写
if ((icolumn >= 'a') && (icolumn <= 'z'))
icolumn += ('A' - 'a');
// 计算列值
long n = icolumn - 'A' + 1;
COleVariant new_value((long)new_int);
CRange write_range;
write_range.AttachDispatch(excel_current_range_.get_Item(COleVariant(irow), COleVariant(n)).pdispVal, true);
write_range.put_Value2(new_value);
write_range.ReleaseDispatch();
}
void IllusionExcelFile::SetCell(long irow, char icolumn, CString new_string)
{
// sp1 先把icolumn转成大写
if ((icolumn >= 'a') && (icolumn <= 'z'))
icolumn += ('A' - 'a');
// 计算列值
long n = icolumn - 'A' + 1;
COleVariant new_value(new_string);
CRange write_range;
write_range.AttachDispatch(excel_current_range_.get_Item(COleVariant(irow), COleVariant(n)).pdispVal, true);
write_range.put_Value2(new_value);
write_range.ReleaseDispatch();
}
//调用就是这样
exf.SetCell(2, 'R', 7); //工号
exf.SetCell(29, 'p', cstr); //写入时间
double linex = exf.GetCellDouble(29, 8); // 读取线性度
至此,基本功能已经可以实现。实例可以在我的附件上下载。
五、可执行文件测试
-
生产可执行文件
-
测试环境
XP office 2003 、WIN7 office 2007 、WIN7 office 2016 -
直接挂掉,没有一台成功。。。。开始错误定位
**最后发现错误:void IllusionExcelFile::SaveasXSLFile(const CString &xls_file) 调用的 SaveAs()有问题!
我的SaveAs()参数比网上代码多了一个,这个函数应该不兼容,然后使用了__SaveAs()函数,在WIN7 office 2016 上运行成功,但是还是有BUG ,在其他平台运行失败,并且保存打开时会出现扩展名错误! **
最后选用:SaveCopyAs(COleVariant(xls_file)),其他机器都正常运行
void IllusionExcelFile::SaveasXSLFile(const CString &xls_file)
{
//excel_work_book_.SaveAs(COleVariant(xls_file),
// covOptional,
// covOptional,
// covOptional,
// covOptional,
// covOptional,
// 0,
// covOptional,
// covOptional,
// covOptional,
// covOptional,
// covOptional,
// covOptional);
//excel_work_book_.__SaveAs(COleVariant(xls_file),
// covOptional,
// covOptional,
// covOptional,
// covOptional,
// covOptional,
// 0,
// covOptional,
// covOptional,
// covOptional,
// covOptional);
excel_work_book_.SaveCopyAs(COleVariant(xls_file));
return;
}
https://download.youkuaiyun.com/download/alittleNel/12719043
欢迎大家互相交流。