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

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


{
CApplication m_appExcel; // Excel應(yīng)用程序
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失敗!");
}

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

{
MessageBox(_T("創(chuàng)建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改名

//所有單元格顏色設(shè)為白色
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();
//插入數(shù)據(jù)
range.put_Item(VT(1), VT(1), VT("函數(shù)"));
range.put_Item(VT(1), VT(2), VT("大項(xiàng)目"));
range.put_Item(VT(1), VT(3), VT("小項(xiàng)目"));
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~"));
}
// 為四周和內(nèi)部加上邊框
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();

//調(diào)整列寬
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"))); //設(shè)置range對(duì)象的范圍
interior.AttachDispatch(range.get_Interior()); //選擇表格內(nèi)部
interior.put_ColorIndex(VT(13)); //顏色
interior.put_Pattern(VT(xlPatternSolid)); //加粗
interior.ReleaseDispatch();

font.AttachDispatch(range.get_Font()); //選擇字
font.put_ColorIndex(VT(3)); //設(shè)置字顏色
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();

}
接下來(lái)開(kāi)始編譯,哇,一大堆錯(cuò)誤...
e:\myprograms3\exceltest2\exceltest2\debug\excel.tlh(1461) : error C2371: “FontPtr”: 重定義;不同的基類(lèi)型 等等
把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”: 未定義基類(lèi)
應(yīng)該是接口沒(méi)定義,mso.dll這個(gè)接口,在CApplication.h最上面加入#import "C:\Program Files\Common Files\Microsoft Shared\OFFICE12\mso.dll"
rebuild all 錯(cuò)誤少多了
還有VBE之類(lèi)的錯(cuò)誤,改法:
加入
#import "C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB" raw_interfaces_only, rename("Reference", "ignorethis"), rename("VBE", "GREATWSVBE")
注意自己機(jī)器的路徑!
剩下還有一些rename 的警告,可以在相關(guān)import后面幾上rename("XXX","XXXXX")
本人也是初學(xué)OLE操作excel,希望能和大家一起討論。
posted on 2008-09-21 23:01
greatws 閱讀(10223)
評(píng)論(4) 編輯 收藏 引用