1、VC 操作 Excel 文件保存用 VC 对 Excel 文件进行写操作后,在程序结束前需要对一些对象进行收尾工作,如调用_Workbook:Save()方法( 该方法是 Microsoft 提供的供 VC 调用的对 Excel 文件操作的标准方法,在文件 excel9.cpp 或 excel.cpp 中定义 )保存文件。问题就出现在这里,若选取要保存的 Excel 文件以前不存在则程序创建一个同名的空 Excel 文件,对 Excel 表的操作实际是对其同名副本的操作,Save() 方法会触发一个“另存为“ 的对话框,需要覆盖原来同名的空 Excel 文件,否则写入 Excel 的数据会丢失
2、。若选取的 Excel 文件已经存在,则调用 Save()方法不会触发“另存为“对话框,系统会自动保存写到 Excel 中的数据。需要说明的是,在调用 Save()前,已经调用过 SetAlertBeforeOverwriting(FALSE)和 SetDisplayAlerts(FALSE)关掉一些警告窗口了。若调用 SaveAs()方法,虽不会触发“ 另存为“对话框,但会出抛出“找不到成员”的错误,这时保存写好的 Excel 文件后并重新打开发现数据还是丢失。想尽所有办法,可总无法去掉那个讨厌的“另存为“对话框,请各位大虾帮忙。多谢了! SaveAs()是 excelapp 的方法吗。xl
3、App.ActiveWorkbook.SaveAs “C:excel.xls“ xlApp.Quit我的没有问题。 如今 Excel 是越来越重要了,在我们自己开发的程序中不免要和 Excel 打交道了。利用 Automation 技术,我们可以在不去了解数据库的情况下玩转 Excel,而且你会发现一切竟如此轻松!好了,咱们开始吧,我不喜欢用长篇累牍的代码来故弄玄虚,所以下面的代码都是切中要害的片段,总体上是个连贯的过程,包括启动 Excel,读取数据,写入数据,以及最后的关闭 Excel,其中还包括了很多人感兴趣的合并单元格的处理。特别说明以下代码需要 MFC 的支持,而且工程中还要包含 E
4、XCEL2000 的定义文件:EXCEL9.H,EXCEL9.CPP*/*/变量定义_Application app; Workbooks books;_Workbook book;Worksheets sheets;_Worksheet sheet;Range range;Range iCell;LPDISPATCH lpDisp; COleVariant vResult;COleVariantcovTrue(short)TRUE),covFalse(short)FALSE),covOptional(long)DISP_E_PARAMNOTFOUND, VT_ERROR); /*/初始化 C
5、OM 的动态连接库if(!AfxOleInit() AfxMessageBox(“无法初始化 COM 的动态连接库!“);return ; /*/创建 Excel 2000 服务器(启动 Excel)if(!app.CreateDispatch(“Excel.Application“) AfxMessageBox(“无法启动 Excel 服务器!“);return;app.SetVisible(TRUE); /使 Excel 可见app.SetUserControl(TRUE); /允许其它用户控制 Excel/* /打开 c:1.xlsbooks.AttachDispatch(app.Get
6、Workbooks();lpDisp = books.Open(“C:1.xls“, covOptional, covOptional, covOptional, covOptional, covOptional,covOptional, covOptional, covOptional, covOptional, covOptional,covOptional, covOptional ); /*/得到 Workbookbook.AttachDispatch(lpDisp);/*/得到 Worksheets sheets.AttachDispatch(book.GetWorksheets()
7、; /*/得到当前活跃 sheet/如果有单元格正处于编辑状态中,此操作不能返回,会一直等待lpDisp=book.GetActiveSheet();sheet.AttachDispatch(lpDisp); /*/读取已经使用区域的信息,包括已经使用的行数、列数、起始行、起始列Range usedRange;usedRange.AttachDispatch(sheet.GetUsedRange();range.AttachDispatch(usedRange.GetRows();long iRowNum=range.GetCount(); /已经使用的行数range.AttachDispat
8、ch(usedRange.GetColumns();long iColNum=range.GetCount(); /已经使用的列数long iStartRow=usedRange.GetRow(); /已使用区域的起始行,从 1 开始long iStartCol=usedRange.GetColumn(); /已使用区域的起始列,从 1 开始/*/读取第一个单元格的值range.AttachDispatch(sheet.GetCells(); range.AttachDispatch(range.GetItem (COleVariant(long)1),COleVariant(long)1).
9、pdispVal );COleVariant vResult =range.GetValue();CString str;if(vResult.vt = VT_BSTR) /字符串str=vResult.bstrVal;else if (vResult.vt=VT_R8) /8 字节的数字 str.Format(“%f“,vResult.dblVal);else if(vResult.vt=VT_DATE) /时间格式SYSTEMTIME st;VariantTimeToSystemTime(else if(vResult.vt=VT_EMPTY) /单元格空的str=“; /*/读取第一个单
10、元格的对齐方式,数据类型:VT_I4/读取水平对齐方式range.AttachDispatch(sheet.GetCells();iCell.AttachDispatch(range.GetItem (COleVariant(long(1), COleVariant(long(1).pdispVal);vResult.lVal=0;vResult=iCell.GetHorizontalAlignment();if(vResult.lVal!=0)switch (vResult.lVal)case 1: /默认break;case -4108: /居中break;case -4131 : /靠左
11、break;case -4152 : /靠右break;/垂直对齐方式iCell.AttachDispatch(range.GetItem (COleVariant(long(1), COleVariant(long(1).pdispVal);vResult.lVal=0;vResult=iCell.GetVerticalAlignment();if(vResult.lVal!=0)switch (vResult.lVal)case -4160 : /靠上break;case -4108 : /居中break;case -4107 : /靠下break;/*/设置第一个单元格的值“HI,EXC
12、EL!“range.SetItem(COleVariant(1),COleVariant(1),COleVariant(“HI,EXCEL!“); /*/设置第一个单元格字体颜色: 红色Font font;range.AttachDispatch(sheet.GetCells();range.AttachDispatch(range.GetItem (COleVariant(long(1), COleVariant(long(1).pdispVal);font.SetColor(COleVariant(long)0xFF0000); /*/合并单元格的处理/包括判断第一个单元格是否为合并单元格
13、,以及将第一个单元格进行合并Range unionRange;range.AttachDispatch(sheet.GetCells(); unionRange.AttachDispatch(range.GetItem (COleVariant(long)1),COleVariant(long)1).pdispVal );vResult=unionRange.GetMergeCells(); if(vResult.boolVal=-1) /是合并的单元格 /合并单元格的行数 range.AttachDispatch (unionRange.GetRows ();long iUnionRowNu
14、m=range.GetCount (); /合并单元格的列数range.AttachDispatch (unionRange.GetColumns ();long iUnionColumnNum=range.GetCount (); /合并区域的起始行,列long iUnionStartRow=unionRange.GetRow(); /起始行,从 1 开始long iUnionStartCol=unionRange.GetColumn(); /起始列,从 1 开始else if(vResult.boolVal=0) /不是合并的单元格/将第一个单元格合并成 2 行,3 列range.Atta
15、chDispatch(sheet.GetCells(); unionRange.AttachDispatch(range.GetItem (COleVariant(long)1),COleVariant(long)1).pdispVal );unionRange.AttachDispatch(unionRange.GetResize(COleVariant(long)2),COleVariant(long)3);unionRange.Merge(COleVariant(long)0); /合并单元格/*/将文件保存为 2.xls book.SaveAs(COleVariant(“C:2.xls“),covOptional,covOptional, covOptional,covOptional,covOptional,0,covOptional,covOptional,covOptional,covOptional); /*/关闭所有的 book,退出 Excel book.Close (covOptional,COleVariant(OutFilename),covOptional);books.Close(); app.Quit(); / Excel 保存Sheet.OleProcedure(“SaveAs“, FName.c_str();