最新消息

[公告2014/05/30] 如有需要將部落格中,任何一篇文章的程式碼使用在商業用途,請與我聯繫。

[公告2015/04/26] Line版的 iInfo程式與投資應用 群組已上線想加入的朋友們,請先查看 "入群須知" 再與我聯繫 Line : aminwhite5168,加入請告知身分與回答 "入群須知" 的問題。

[公告2018/04/22] 台北 Python + Excel VBA 金融資訊爬蟲課程,課程如網頁內容 金融資訊爬蟲班:台北班 Python 金融資訊爬蟲、EXCEL VBA 金融資訊爬蟲

[公告2019/01/08] 請注意:我再次重申,部落格文章的程式碼,是要提供各位參考與學習,一旦網頁改版請自行修改,別要求東要求西要我主動修改,你們用我寫東西賺錢了、交差了,請問有分我一杯羹嗎?既然賺錢沒分我,請問有什麼理由要求我修改,如果沒能力改,就花錢來找我上課。

[公告2019/12/01] 若各位有 Excel VBA 案子開發需求,歡迎與我聯繫,可接案處理。

[公告2020/05/22] 頁面載入速度慢,起因為部分JS來源(alexgorbatchev.com)失效導致頁面載入變慢,目前已做調整,請多見諒。

2018年6月11日 星期一

VC 操作 Excel (1) --- 設定儲存格格式

透過 VS C++ 操作 Excel 並非一件容易的事,但有些時候還是有需要用到,近期手邊要處理Excel 檔案匯出與儲存格格式設定,順道整理記錄一下操作。
1. 開啟VC專案,引用Excel程式碼。
「View」→「ClassWizard」。

「Add Class」→「From a type library」。

切換到 Excel.exe路徑「C:\Program Files\Microsoft Office\Office14」。

選擇要使用到的 Class:_Application、Workbooks、_Workbook、_Worksheet、Worksheets、Range

點選確認,就會在專案中看到 Excel.cpp、Excel.h。

Excel工作表階層。

2. 輸入以下程式。
void runExcel(CString sourceFile, CString saveasFile)
{
 /*if (!AfxOleInit())
 {
  AfxMessageBox("初始化Ole出錯!");
  return ;
 }*/
 
 if (::CoInitialize( NULL ) == E_INVALIDARG) 
 { 
  AfxMessageBox(_T("無法初始化COM的DLL"));
  return ;
 }

 _Application excel;
 COleException *e = new COleException;

 //建立Excel檔案
 try
 {
  if (!excel.CreateDispatch("Excel.Application", e)) //建立Excel 2000檔案
   throw e;
 }
 catch(COleDispatchException *e)
 {
  CString csTmp;
  if(!e->m_strSource.IsEmpty())
   csTmp = e->m_strSource + "-";
  if(!e->m_strDescription.IsEmpty())
   csTmp += e->m_strDescription;
  else
   csTmp += "unknown error";
  AfxMessageBox(csTmp, MB_OK, e->m_strHelpFile.IsEmpty() ? 0: e->m_dwHelpContext);
  e->Delete();
 }

 excel.SetVisible(TRUE);

 COleVariant FilenameSave(saveasFile),
          Fileformat((short)51),
    covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

 TRY
 {
  Workbooks workBooks;
  _Workbook _Workbook;  
  _Worksheet  _workSheet;
  Worksheets  workSheets;
  Range  range;
  //LPDISPATCH lpDisp;

  //取得工作簿集合
  workBooks= excel.GetWorkbooks();
  //lpDisp = excel.GetWorkbooks();  
  //workBooks.AttachDispatch(lpDisp);
  
  //取得工作簿,並開啟檔案
  _Workbook = workBooks.Open(sourceFile,
   covOptional, covOptional, covOptional, covOptional,
   covOptional, covOptional, covOptional, covOptional,
   covOptional, covOptional, covOptional, covOptional,
   covOptional, covOptional);
  
  //取得工作表集合
  workSheets = _Workbook.GetSheets();
  //_Workbook.AttachDispatch(lpDisp);
  //workSheets.AttachDispatch(_Workbook.GetSheets());  
  
  //取得第一個工作表
  _workSheet = workSheets.GetItem(COleVariant((short)1));
  //_workSheet.AttachDispatch(workSheets.GetItem(COleVariant((short)1)));
  
  //選擇工作表中A列
  range = _workSheet.GetRange(COleVariant("A1"), COleVariant("A65536"));
  //range.AttachDispatch(_workSheet.GetRange(COleVariant("A1"), COleVariant("A65536")));

  //設定儲存格格式
  range.SetNumberFormat(COleVariant("000000"));  
  
  _Workbook.SetSaved(TRUE);
  
  DeleteFile(saveasFile);

  //另存新檔
  _Workbook.SaveAs(FilenameSave,
       Fileformat,
       covOptional,
       covOptional,
       covOptional,
       covOptional,
       0,
       covOptional,
       covOptional,
       covOptional,
       covOptional,
       covOptional);

  //釋放資源
  range.ReleaseDispatch();
  workSheets.ReleaseDispatch();
   _workSheet.ReleaseDispatch();
  workBooks.ReleaseDispatch();
  _Workbook.ReleaseDispatch();

  workBooks.Close();
 }
 CATCH(COleDispatchException, e)
 {
  TRACE(e->m_strDescription);
 }
 END_CATCH;

 excel.Quit();
 excel.ReleaseDispatch();
 ::CoUninitialize();
}
程式碼說明:
21行:依據字串不同,建立不同版本Excel。
Excel 字串Excel版本
Excel.ApplicationExcel 2000
Excel.Application.10Excel xp
Excel.Application.11Excel 2003
Excel.Application.12Excel 2007
Excel.Application.14Excel 2010
Excel.Application.15Excel 2013
Excel.Application.16Excel 2016、365
40行:可參考 XlFileFormat 列舉 (Excel)
53行:等同54、55行。
65行:等同66、67行。
70行:等同71行。
74行:等同75行。
58~62行、85~96行:依據使用者所選定的Excel版本而有不同數量的參數。

開啟一個Excel檔案,在 A1、A2、A2 儲存格分別輸入 1、2、3,執行程式讓 A1、A2、A2 的內容變成為 000001、000002、000003。

參考資料: