Excel在公司用的很多,而這個東西我用的不是很好,就想用程序來處理,遇到很多錯誤。這幾天研究了下OLE操作Excel。
環境:VS2008 SP1+Excel 2007
加入OLE Type Library
隨便建立一個MFC程序,選添加類,Typelib中的MFC類,出來一個對話,可用類型庫選“Microsoft Excel 12.0 Object Library”
一般來說,添加下邊這些類就夠了,當然也可以全部添加
CApplication
CWorkbook
CWorkbooks
CWorksheet
CRange
CWorksheets
CPicture
CPictures
CBorder
CBorders
CFont0
Cnterior
包含頭文件的時候,把CApplication.h放到最前面
一個操作的例子

#define VT(x) _variant_t(x)
void CExcelTest2Dlg::OnBnClickedButton1()


{
CApplication m_appExcel; // Excel應用程序
CWorkbooks m_books;
CWorkbook m_book;
CWorksheets sheets;
CWorksheet sheet;
CRange range; //選擇范圍
Cnterior interior;
CFont0 font; // 字體
CBorders borders; // 邊框
CBorder border;
CRange column;
CRange row;
// 初始化Com
if (::CoInitialize( NULL ) == E_INVALIDARG)

{
MessageBox("初始化Com失敗!");
}

// 啟動Excel
if ( !m_appExcel.CreateDispatch(_T("Excel.Application"), NULL))

{
MessageBox(_T("創建Excel失敗!"));
::CoUninitialize();
}
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
m_appExcel.put_Visible(TRUE);
m_books.AttachDispatch(m_appExcel.get_Workbooks());
m_book.AttachDispatch(m_books.Add(covOptional));
sheets.AttachDispatch(m_book.get_Worksheets()); //得到Worksheets
sheet.AttachDispatch(sheets.get_Item(_variant_t("sheet1"))); //得到sheet1
sheet.put_Name("1234"); //sheet1改名

//所有單元格顏色設為白色
range.AttachDispatch(sheet.get_Cells());
interior.AttachDispatch(range.get_Interior());
interior.put_Color(VT(RGB(255, 255, 255)));
interior.ReleaseDispatch();

range.ClearContents();
range.ReleaseDispatch();

range.AttachDispatch(sheet.get_Range(VT("A1"), VT("C1001")));
range.ClearFormats();
//插入數據
range.put_Item(VT(1), VT(1), VT("函數"));
range.put_Item(VT(1), VT(2), VT("大項目"));
range.put_Item(VT(1), VT(3), VT("小項目"));
for (int i = 2; i < 1000; i++)

{
range.put_Item(VT(i), VT(2), VT(i - 1));
range.put_Item(VT(i), VT(3), VT("37122368~37097735~"));
}
// 為四周和內部加上邊框
borders.AttachDispatch(range.get_Borders());
for (long i = xlEdgeLeft; i <= xlInsideHorizontal; i++)

{
border = borders.get_Item(i);
border.put_LineStyle(VT(xlContinuous));
border.ReleaseDispatch();
}
borders.ReleaseDispatch();

//調整列寬
column = range.get_EntireColumn();
column.put_ColumnWidth(VT(18.63));
column.ReleaseDispatch();
range.ReleaseDispatch();

range.AttachDispatch(sheet.get_Range(VT("A10"), VT("A20"))); //選中
range.Merge(VT(0)); //合并單元格
range.ReleaseDispatch();

range.AttachDispatch(sheet.get_Range(VT("A1"), VT("C1")));
interior.AttachDispatch(range.get_Interior());
interior.put_ColorIndex(VT(7));
interior.put_Pattern(VT(xlPatternSolid));
interior.ReleaseDispatch();

font.AttachDispatch(range.get_Font());
font.put_ColorIndex(VT(6));
font.get_Bold();
font.ReleaseDispatch();
range.ReleaseDispatch();

range.AttachDispatch(sheet.get_Range(VT("A2"), VT("C1001"))); //設置range對象的范圍
interior.AttachDispatch(range.get_Interior()); //選擇表格內部
interior.put_ColorIndex(VT(13)); //顏色
interior.put_Pattern(VT(xlPatternSolid)); //加粗
interior.ReleaseDispatch();

font.AttachDispatch(range.get_Font()); //選擇字
font.put_ColorIndex(VT(3)); //設置字顏色
font.ReleaseDispatch();
row.AttachDispatch(range.get_EntireRow()); //選擇range里的全部行
row.put_RowHeight(VT(24)); //行高
row.ReleaseDispatch();
range.ReleaseDispatch();

sheet.ReleaseDispatch();
sheets.ReleaseDispatch();
m_book.ReleaseDispatch();
m_books.ReleaseDispatch();
m_appExcel.ReleaseDispatch();

}
接下來開始編譯,哇,一大堆錯誤...
e:\myprograms3\exceltest2\exceltest2\debug\excel.tlh(1461) : error C2371: “FontPtr”: 重定義;不同的基類型 等等
把CApplication.h里的#import "C:\\Program Files\\Microsoft Office\\Office12\\EXCEL.EXE" no_namespace
改為#import "C:\Program Files\Microsoft Office\OFFICE12\excel.exe" exclude("IFont", "IPicture") rename("RGB", "ignorethis"), rename("DialogBox", "ignorethis"), rename("VBE", "GREATWSVBE")
rebuild all
e:\myprograms3\exceltest2\exceltest2\debug\excel.tlh(2036) : error C2504: “_IMsoDispObj”: 未定義基類
應該是接口沒定義,mso.dll這個接口,在CApplication.h最上面加入#import "C:\Program Files\Common Files\Microsoft Shared\OFFICE12\mso.dll"
rebuild all 錯誤少多了
還有VBE之類的錯誤,改法:
加入
#import "C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB" raw_interfaces_only, rename("Reference", "ignorethis"), rename("VBE", "GREATWSVBE")
注意自己機器的路徑!
剩下還有一些rename 的警告,可以在相關import后面幾上rename("XXX","XXXXX")
本人也是初學OLE操作excel,希望能和大家一起討論。
posted on 2008-09-21 23:01
greatws 閱讀(10223)
評論(4) 編輯 收藏 引用