Excel文件的读写实现
要实现对Excel文件的读写,非常简单。按照如下步骤操作:
1、将Excel9.h和Excel9.cpp两个文件放入到工程中。
2、使用其中的对象就可以对其进行控制了,示例代码如下:
//申明使用EXCEL的变量
_Application ExcelApp;
Workbooks wbsMyBooks;
_Workbook wbMyBook;
Worksheets wssMysheets;
_Worksheet wsMysheet;
Range rgMyRge;
//创建Excel 2000服务器(启动Excel)
if (!ExcelApp.CreateDispatch("Excel.Application",NULL))
{
AfxMessageBox("创建Excel服务失败!");
return false;
}
CString csTemp;
//然后打开模板文档,开始写入内容
wbsMyBooks.AttachDispatch(ExcelApp.GetWorkbooks(), true);
//取得当前执行文件所在目录
char buf[100];
GetCurrentDirectory(100, buf);
csTemp.Format(buf);
csTemp = csTemp + "\\Blank.xls"; //打开当前目录下的Blank.xls文件
wbMyBook.AttachDispatch(wbsMyBooks.Add(_variant_t(csTemp)));
//得到Worksheets
wssMysheets.AttachDispatch(wbMyBook.GetWorksheets(), true);
//得到sheet1
wsMysheet.AttachDispatch(wssMysheets.GetItem(_variant_t("sheet1")), true);
//得到全部Cells,此时,rgMyRge是cells的集合
rgMyRge.AttachDispatch(wsMysheet.GetCells(), true);
3、至此,已经获得了EXCEL中所有单元格的控制对象,然后就可以开始读写了。
如果是写入,参考以下代码:
rgMyRge.SetItem(_variant_t((long)nRowIndex), _variant_t((long)nColumnIndex), _variant_t("课题号"));
如果是读取,参考以下代码:
COleVariant vResult, vTemp;
CString csTemp;
vResult = rgMyRge.GetItem(_variant_t((long)(nRowIndex)),_variant_t((long)nColumnIndex));
vTemp.ChangeType(VT_BSTR, vResult);
csTemp = vTemp.bstrVal; //成功将单元格中内容读出并存入CString中
4、关于保存
如果是写一个EXCEL文件,就一定需要保存,目前还没有找到一个很好的办法来保存,现在使用的方法是保存整个WorkSpace,如下:
//保存文件
CString csSaveFile = "D:\\AAA.xls";
wbMyBook.Save(); //先把workbook保存起来
ExcelApp.SaveWorkspace(_variant_t(csSaveFile)); //最后保存整个工作区时给文件取名
//2003-05-27添加
以上的方法其实有一个非常非常大的BUG,实质上就是没有理解上述方法的含义。按照上述方法,首先保存workbook,其实是将workbook
(如Blank.xls)保存到了“我的文档”目录下,然后再保存workspace生成excel文件,其实这样做之后生成了两个xls文件,一个就是
Blank.xls(被保存到了“我的文档”目录下),还有一个就是取名的xls,保存在了指定路径下,但这个文件如果用写字板打开,会
发现其实里面是一个链接,指向要打开“我的文档”目录下的那个xls文件,所以如果拷贝这个xls文件到其他机器上,由于缺少Blank.xls
文件,所以会报告找不到需要打开的文件!!!
所以其实一个excel文件就是一个workspace,这个workspace里可以包含多个workbook(其实就是打开的多个excel文档),然后每个
workbook里面还可以包含多个worksheet!
所以,最佳的保存方法应该如下:
//保存文件
CString csSaveFile = "D:\\AAA.xls";
wbMyBook.SaveCopyAs(_variant_t(csSaveFile)); //先把workbook保存起来
5、有关内存释放
内存释放一直是个问题,现象就是程序运行以后,有一个名为EXCEL的进程一直留在进程列表中(随机发生)
现在比较搓的做法是:将后台启动的EXCEL程序显示出来,让用户手动关闭,代码如下:
//将窗口显示出来
CWnd* pWnd = CWnd::FindWindow("XLMAIN", NULL);
if (pWnd!=NULL)
{
pWnd->ShowWindow(SW_SHOWNORMAL);
pWnd->UpdateWindow();
pWnd->BringWindowToTop();
}
另外,要释放使用过的一些变量
//释放对象
rgMyRge.ReleaseDispatch();
wsMysheet.ReleaseDispatch();
wssMysheets.ReleaseDispatch();
wbMyBook.ReleaseDispatch();
wbsMyBooks.ReleaseDispatch();
ExcelApp.ReleaseDispatch();
1、将Excel9.h和Excel9.cpp两个文件放入到工程中。
2、使用其中的对象就可以对其进行控制了,示例代码如下:
//申明使用EXCEL的变量
_Application ExcelApp;
Workbooks wbsMyBooks;
_Workbook wbMyBook;
Worksheets wssMysheets;
_Worksheet wsMysheet;
Range rgMyRge;
//创建Excel 2000服务器(启动Excel)
if (!ExcelApp.CreateDispatch("Excel.Application",NULL))
{
AfxMessageBox("创建Excel服务失败!");
return false;
}
CString csTemp;
//然后打开模板文档,开始写入内容
wbsMyBooks.AttachDispatch(ExcelApp.GetWorkbooks(), true);
//取得当前执行文件所在目录
char buf[100];
GetCurrentDirectory(100, buf);
csTemp.Format(buf);
csTemp = csTemp + "\\Blank.xls"; //打开当前目录下的Blank.xls文件
wbMyBook.AttachDispatch(wbsMyBooks.Add(_variant_t(csTemp)));
//得到Worksheets
wssMysheets.AttachDispatch(wbMyBook.GetWorksheets(), true);
//得到sheet1
wsMysheet.AttachDispatch(wssMysheets.GetItem(_variant_t("sheet1")), true);
//得到全部Cells,此时,rgMyRge是cells的集合
rgMyRge.AttachDispatch(wsMysheet.GetCells(), true);
3、至此,已经获得了EXCEL中所有单元格的控制对象,然后就可以开始读写了。
如果是写入,参考以下代码:
rgMyRge.SetItem(_variant_t((long)nRowIndex), _variant_t((long)nColumnIndex), _variant_t("课题号"));
如果是读取,参考以下代码:
COleVariant vResult, vTemp;
CString csTemp;
vResult = rgMyRge.GetItem(_variant_t((long)(nRowIndex)),_variant_t((long)nColumnIndex));
vTemp.ChangeType(VT_BSTR, vResult);
csTemp = vTemp.bstrVal; //成功将单元格中内容读出并存入CString中
4、关于保存
如果是写一个EXCEL文件,就一定需要保存,目前还没有找到一个很好的办法来保存,现在使用的方法是保存整个WorkSpace,如下:
//保存文件
CString csSaveFile = "D:\\AAA.xls";
wbMyBook.Save(); //先把workbook保存起来
ExcelApp.SaveWorkspace(_variant_t(csSaveFile)); //最后保存整个工作区时给文件取名
//2003-05-27添加
以上的方法其实有一个非常非常大的BUG,实质上就是没有理解上述方法的含义。按照上述方法,首先保存workbook,其实是将workbook
(如Blank.xls)保存到了“我的文档”目录下,然后再保存workspace生成excel文件,其实这样做之后生成了两个xls文件,一个就是
Blank.xls(被保存到了“我的文档”目录下),还有一个就是取名的xls,保存在了指定路径下,但这个文件如果用写字板打开,会
发现其实里面是一个链接,指向要打开“我的文档”目录下的那个xls文件,所以如果拷贝这个xls文件到其他机器上,由于缺少Blank.xls
文件,所以会报告找不到需要打开的文件!!!
所以其实一个excel文件就是一个workspace,这个workspace里可以包含多个workbook(其实就是打开的多个excel文档),然后每个
workbook里面还可以包含多个worksheet!
所以,最佳的保存方法应该如下:
//保存文件
CString csSaveFile = "D:\\AAA.xls";
wbMyBook.SaveCopyAs(_variant_t(csSaveFile)); //先把workbook保存起来
5、有关内存释放
内存释放一直是个问题,现象就是程序运行以后,有一个名为EXCEL的进程一直留在进程列表中(随机发生)
现在比较搓的做法是:将后台启动的EXCEL程序显示出来,让用户手动关闭,代码如下:
//将窗口显示出来
CWnd* pWnd = CWnd::FindWindow("XLMAIN", NULL);
if (pWnd!=NULL)
{
pWnd->ShowWindow(SW_SHOWNORMAL);
pWnd->UpdateWindow();
pWnd->BringWindowToTop();
}
另外,要释放使用过的一些变量
//释放对象
rgMyRge.ReleaseDispatch();
wsMysheet.ReleaseDispatch();
wssMysheets.ReleaseDispatch();
wbMyBook.ReleaseDispatch();
wbsMyBooks.ReleaseDispatch();
ExcelApp.ReleaseDispatch();
回复:(Aiolian)Excel文件的读写实现
在Excel文件读写操作完毕释放方面,上文写的并不正确
正确的做法应参照MSDN中提供的文档和例子
在Excel文件读写操作完毕释放方面,上文写的并不正确
正确的做法应参照MSDN中提供的文档和例子