posts - 25,  comments - 25,  trackbacks - 0
          VC操作Excel文件保存問題
          用VC對Excel文件進行寫操作后,在程序結束前需要對一些對象進行收尾工作,如調用_Workbook::Save()方法(該方法是Microsoft提供的供VC調用的對Excel文件操作的標準方法,在文件excel9.cpp或excel.cpp中定義)保存文件。
          問題就出現在這里,若選取要保存的Excel文件以前不存在則程序創建一個同名的空Excel文件,對Excel表的操作實際是對其同名副本的操作,Save()方法會觸發一個"另存為"的對話框,需要覆蓋原來同名的空Excel文件,否則寫入Excel的數據會丟失。若選取的Excel文件已經存在,則調用Save()方法不會觸發"另存為"對話框,系統會自動保存寫到Excel中的數據。
          需要說明的是,在調用Save()前,已經調用過SetAlertBeforeOverwriting(FALSE)和SetDisplayAlerts(FALSE)關掉一些警告窗口了。若調用SaveAs()方法,雖不會觸發"另存為"對話框,但會出拋出“找不到成員”的錯誤,這時保存寫好的Excel文件后并重新打開發現數據還是丟失。
          想盡所有辦法,可總無法去掉那個討厭的"另存為"對話框,請各位大蝦幫忙。多謝了!
          SaveAs()是excelapp的方法嗎。
          xlApp.ActiveWorkbook.SaveAs "C:\excel.xls" 
          xlApp.Quit
          我的沒有問題。
          如今Excel是越來越重要了,在我們自己開發的程序中不免要和Excel打交道了。利用Automation技術,我們可以在不去了解
          數據庫的情況下玩轉Excel,而且你會發現一切竟如此輕松!
              好了,咱們開始吧,我不喜歡用長篇累牘的代碼來故弄玄虛,所以下面的代碼都是切中要害的片段,總體上是個連貫的過程,
          包括啟動Excel,讀取數據,寫入數據,以及最后的關閉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的動態連接庫
           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.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
           //如果有單元格正處于編輯狀態中,此操作不能返回,會一直等待
           lpDisp=book.GetActiveSheet();
           sheet.AttachDispatch(lpDisp); 
            
           //*****
           //讀取已經使用區域的信息,包括已經使用的行數、列數、起始行、起始列
           Range usedRange;
           usedRange.AttachDispatch(sheet.GetUsedRange());
           range.AttachDispatch(usedRange.GetRows());
           long iRowNum=range.GetCount();                   //已經使用的行數
           
           range.AttachDispatch(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)).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(&vResult.date, &st);
           }
           else if(vResult.vt==VT_EMPTY)   //單元格空的
           {
            str="";
           }  
           
           
           //*****
           //讀取第一個單元格的對齊方式,數據類型: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;
            }
           
           }
           
            
           //*****
           //設置第一個單元格的值"HI,EXCEL!"
           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));  
           
           
           //*****
           //合并單元格的處理
           //包括判斷第一個單元格是否為合并單元格,以及將第一個單元格進行合并
           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 iUnionRowNum=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.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);  
            
            
           //*****
           //關閉所有的book,退出Excel 
           book.Close (covOptional,COleVariant(OutFilename),covOptional);
           books.Close();      
           app.Quit();
          // Excel保存
                  Sheet.OleProcedure("SaveAs", FName.c_str());
          www.ccrun.com里面有說道。
          學習
          posted on 2005-05-25 10:05 子玉 閱讀(2213) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2005年5月>
          24252627282930
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          常用鏈接

          留言簿(7)

          隨筆檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 西昌市| 苍溪县| 潼关县| 平潭县| 丹阳市| 鄂托克旗| 无极县| 青河县| 贵阳市| 平原县| 光山县| 偏关县| 南昌县| 大竹县| 庆阳市| 保靖县| 久治县| 蛟河市| 通州市| 乌兰察布市| 盐源县| 诸城市| 东港市| 将乐县| 宝鸡市| 桓台县| 贵德县| 莲花县| 剑川县| 鹤峰县| 郓城县| 吴堡县| 沧州市| 资兴市| 太谷县| 万载县| 洪江市| 鲁甸县| 砚山县| 南部县| 平原县|