用VC對Excel文件進行寫操作后,在程序結(jié)束前需要對一些對象進行收尾工作,如調(diào)用_Workbook::Save()方法(該方法是Microsoft提供的供VC調(diào)用的對Excel文件操作的標準方法,在文件excel9.cpp或excel.cpp中定義)保存文件。
問題就出現(xiàn)在這里,若選取要保存的Excel文件以前不存在則程序創(chuàng)建一個同名的空Excel文件,對Excel表的操作實際是對其同名副本的操作,Save()方法會觸發(fā)一個"另存為"的對話框,需要覆蓋原來同名的空Excel文件,否則寫入Excel的數(shù)據(jù)會丟失。若選取的Excel文件已經(jīng)存在,則調(diào)用Save()方法不會觸發(fā)"另存為"對話框,系統(tǒng)會自動保存寫到Excel中的數(shù)據(jù)。 需要說明的是,在調(diào)用Save()前,已經(jīng)調(diào)用過SetAlertBeforeOverwriting(FALSE)和SetDisplayAlerts(FALSE)關(guān)掉一些警告窗口了。若調(diào)用SaveAs()方法,雖不會觸發(fā)"另存為"對話框,但會出拋出“找不到成員”的錯誤,這時保存寫好的Excel文件后并重新打開發(fā)現(xiàn)數(shù)據(jù)還是丟失。 想盡所有辦法,可總無法去掉那個討厭的"另存為"對話框,請各位大蝦幫忙。多謝了! SaveAs()是excelapp的方法嗎。 xlApp.ActiveWorkbook.SaveAs "C:\excel.xls" xlApp.Quit 我的沒有問題。 如今Excel是越來越重要了,在我們自己開發(fā)的程序中不免要和Excel打交道了。利用Automation技術(shù),我們可以在不去了解 數(shù)據(jù)庫的情況下玩轉(zhuǎn)Excel,而且你會發(fā)現(xiàn)一切竟如此輕松! 好了,咱們開始吧,我不喜歡用長篇累牘的代碼來故弄玄虛,所以下面的代碼都是切中要害的片段,總體上是個連貫的過程, 包括啟動Excel,讀取數(shù)據(jù),寫入數(shù)據(jù),以及最后的關(guān)閉Excel,其中還包括了很多人感興趣的合并單元格的處理。 特別說明以下代碼需要MFC的支持,而且工程中還要包含EXCEL2000的定義文件:EXCEL9.H,EXCEL9.CPP ***************************************************************************************************************** //***** //變量定義 _Application app; Workbooks books; _Workbook book; Worksheets sheets; _Worksheet sheet; Range range; Range iCell; LPDISPATCH lpDisp; COleVariant vResult; COleVariant covTrue((short)TRUE), covFalse((short)FALSE), covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); //***** //初始化COM的動態(tài)連接庫 if(!AfxOleInit()) { AfxMessageBox("無法初始化COM的動態(tài)連接庫!"); return ; } //***** //創(chuàng)建Excel 2000服務(wù)器(啟動Excel) if(!app.CreateDispatch("Excel.Application")) { AfxMessageBox("無法啟動Excel服務(wù)器!"); return; } app.SetVisible(TRUE); //使Excel可見 app.SetUserControl(TRUE); //允許其它用戶控制Excel //***** //打開c:\\1.xls books.AttachDispatch(app.GetWorkbooks()); lpDisp = books.Open("C:\\\\1.xls", covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional ); //***** //得到Workbook book.AttachDispatch(lpDisp); //***** //得到Worksheets sheets.AttachDispatch(book.GetWorksheets()); //***** //得到當前活躍sheet //如果有單元格正處于編輯狀態(tài)中,此操作不能返回,會一直等待 lpDisp=book.GetActiveSheet(); sheet.AttachDispatch(lpDisp); //***** //讀取已經(jīng)使用區(qū)域的信息,包括已經(jīng)使用的行數(shù)、列數(shù)、起始行、起始列 Range usedRange; usedRange.AttachDispatch(sheet.GetUsedRange()); range.AttachDispatch(usedRange.GetRows()); long iRowNum=range.GetCount(); //已經(jīng)使用的行數(shù) range.AttachDispatch(usedRange.GetColumns()); long iColNum=range.GetCount(); //已經(jīng)使用的列數(shù) long iStartRow=usedRange.GetRow(); //已使用區(qū)域的起始行,從1開始 long iStartCol=usedRange.GetColumn(); //已使用區(qū)域的起始列,從1開始 //***** //讀取第一個單元格的值 range.AttachDispatch(sheet.GetCells()); range.AttachDispatch(range.GetItem (COleVariant((long)1),COleVariant((long)1)).pdispVal ); COleVariant vResult =range.GetValue(); CString str; if(vResult.vt == VT_BSTR) //字符串 { str=vResult.bstrVal; } else if (vResult.vt==VT_R8) //8字節(jié)的數(shù)字 { str.Format("%f",vResult.dblVal); } else if(vResult.vt==VT_DATE) //時間格式 { SYSTEMTIME st; VariantTimeToSystemTime(&vResult.date, &st); } else if(vResult.vt==VT_EMPTY) //單元格空的 { str=""; } //***** //讀取第一個單元格的對齊方式,數(shù)據(jù)類型: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 : //靠左 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; } } //***** //設(shè)置第一個單元格的值"HI,EXCEL!" range.SetItem(COleVariant(1),COleVariant(1),COleVariant("HI,EXCEL!")); //***** //設(shè)置第一個單元格字體顏色:紅色 Font font; range.AttachDispatch(sheet.GetCells()); range.AttachDispatch((range.GetItem (COleVariant(long(1)), COleVariant(long(1)))).pdispVal); font.SetColor(COleVariant((long)0xFF0000)); //***** //合并單元格的處理 //包括判斷第一個單元格是否為合并單元格,以及將第一個單元格進行合并 Range unionRange; range.AttachDispatch(sheet.GetCells()); unionRange.AttachDispatch(range.GetItem (COleVariant((long)1),COleVariant((long)1)).pdispVal ); vResult=unionRange.GetMergeCells(); if(vResult.boolVal==-1) //是合并的單元格 { //合并單元格的行數(shù) range.AttachDispatch (unionRange.GetRows ()); long iUnionRowNum=range.GetCount (); //合并單元格的列數(shù) range.AttachDispatch (unionRange.GetColumns ()); long iUnionColumnNum=range.GetCount (); //合并區(qū)域的起始行,列 long iUnionStartRow=unionRange.GetRow(); //起始行,從1開始 long iUnionStartCol=unionRange.GetColumn(); //起始列,從1開始 } else if(vResult.boolVal==0) {//不是合并的單元格} //將第一個單元格合并成2行,3列 range.AttachDispatch(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); //***** //關(guān)閉所有的book,退出Excel book.Close (covOptional,COleVariant(OutFilename),covOptional); books.Close(); app.Quit(); // Excel保存 Sheet.OleProcedure("SaveAs", FName.c_str()); |
|