VC6.0 操作Excel表格

介绍:使用Microsoft Office所带的控件来实现代码操作excel表格,从思路上来看,操作excel表格就是将其打开,然后写入/读出数据,然后关闭。

一、添加COM库支持

首先创建一个程序(一个MFC的单文档程序),在程序的入口处和出口处先作这样两个步骤来支持COM库:

在程序入口处CMyApp:: InitInstance()函数AfxEnableControlContainer();之后加上下面判断:

if (CoInitialize(NULL) != 0)

{  //如果条件成立,就终止程序

       AfxMessageBox(“初始化COM支持库失败!”);

       exit(1);

}

在程序的出口处CMyApp:: ExitInstance()函数return语句之前加入下面这句话:

CoUninitialize(); //来释放COM支持库

对COM支持库的代码已经完成。

二、找到操作的Excel文件的动态库

下面要从Office的安装目录中找到对VC操作excel文件的动态库,在某些版本下这个文件是Excel8.olb或者Excel9.olb,有的版本是 excel.exe这个exe也是动态库,是微软公司主要的文件结果之一。

选择VC的View菜单下的ClassWizad命令,会弹出一个对话框;然后点击Add Class…按钮选择From a type library,会弹出一个打开对话框,从这里打开Office安装目录目录下…/Office11/EXCEL.EXE文件,从里面选择几个要用到的类:_Application, Workbooks, _Wrokbook,Worksheets, _WorkSheet, Range,点击OK按钮。会在程序中生成一个excel.h和excel.cpp文件,这些文件中包含了刚才我们选择的几个类的代码。下面介绍一下这几个类:

在VC操纵excel的exe动态库里面有好多个对象模型,就是刚才在创建过程中看到的那个列表,但是经常用到的有这么几个:_Application, Workbooks, _Wrokbook,Worksheets, _WorkSheet, Range,Charts和_Chart,最后面的两个是用来操作图表的(此处跳过)。

_Application:这里的Application就是Excel本身,众所周知,一个Excel可以包含多个工作簿,每个工作簿又可以包含多个工作表,而每个工作表又可以包含多个区域或者图表,所以这里他们是树型的结构关系,而application最基本的一个功能就是找到它的子项工作簿。果然,我们在引入我们程序的Application类中看到了这样的成员函数:GetWorkbooks()。既然application就是excel,那么打开程序,退出程序,显示/隐藏程序这些基本的操作都可以在这个类的成员函数中找到。

Workbooks:这个对象是一个容器对象,它里面存放着所有打开的工作簿。因此,我们可以猜测它一定有添加,查找,打开/关闭工作簿的功能。(本程序中使用excel的一个xlt模板来生成一个xls文件就是使用了这个容器对象的添加功能。)

_Workbook:这是一个工作簿,也就相当于一个xls文件。Excel可以同时打开多个工作簿,所以工作簿之间必定能够互相切换,每个工作簿可以关联工作表容器并获得工作表的索引。

Worksheets:也是一个容器对象,和Workbooks类似。

_Worksheet:这个就是我们看到的工作表,比如Sheet1,sheet2等等。

Rang:就是我们看到的能选中的方框的大小。而我们所要作的操作基本上是以区域为单位进行的。

 

介绍完这些,就添加一个菜单,来响应操作excel的命令。

然后下面附带这个函数的内容,注释还算可以吧,并且附上网上不知道谁写的但是转载极多的一个封装类。

三、代码:

[c-sharp] view plaincopy  // 应用代码

1.   _Application _app;  

2.   _Workbook _workBook;  

3.   _Worksheet _workSheet;  

4.   Worksheets workSheets;  

5.   Workbooks workBooks;  

6.   Range range;  

7.   Range copyFrom;  

8.   Range copyTo;  

9.     

10.         if(!_app.CreateDispatch("Excel.Application", NULL))  

11.         {  

12.             MessageBox("创建Excel服务失败!""信息提示", MB_OK);  

13.             return;  

14.         }  

15.         //利用模板建立新文档  

16.         workBooks.AttachDispatch(_app.GetWorkbooks());  

17.         _workBook.AttachDispatch(workBooks.Add(_variant_t("/"C://Documents and Settings//模板.xlt/"")));//你可以自己创建一个模板,并自由设定目录  

18.         //得到worksheets  

19.         workSheets.AttachDispatch(_workBook.GetWorksheets());  

20.         //得到workSheet  

21.         _workSheet.AttachDispatch(workSheets.GetItem(_variant_t("sheet1")));  

22.         //得到拷贝的母板  

23.         copyFrom.AttachDispatch(_workSheet.GetRange(_variant_t("A3"), _variant_t("Q6")));  

24.         copyTo.AttachDispatch(_workSheet.GetRange(_variant_t("A61"), _variant_t("A61")));  

25.         //得到全部的cells  

26.         range.AttachDispatch(_workSheet.GetCells());  

27.           

28.         ///  

29.         // 上边是头  

30.           

31.         /* 

32.         中间要做的工作有这两项:设置数据和拷贝格式 

33.         设置数据就是将数据库中查询出来的数据写入表格,拷贝格式就是将表格拷贝到别的地方。 

34.         */  

35.         //写入数据  

36.         range.SetItem(_variant_t((long)3), _variant_t((long)1), _variant_t("写入数据了"));  

37.         range.SetItem(_variant_t((long)5), _variant_t((long)1), _variant_t("重新写入数据了"));  

38.         //拷贝一段区域到另外的一段区域  

39.         copyFrom.Copy(_variant_t(copyTo));  

40.         range.SetItem(_variant_t((long)61), _variant_t((long)1), _variant_t("123"));  

41.           

42.         //显示excel表格  

43.             _app.SetVisible(TRUE);  

44.         //保存为文件  

45.         _app.SetDisplayAlerts(FALSE);   //隐藏弹出的对话框  

46.         _workSheet.SaveAs("d://Test.xls",vtMissing,vtMissing,vtMissing,vtMissing,  

47.             vtMissing,vtMissing,vtMissing,vtMissing,vtMissing);  

48.         _app.Quit();  

49.         //下边是尾  

50.         ///  

51.         copyFrom.ReleaseDispatch();  

52.         copyTo.ReleaseDispatch();  

53.         range.ReleaseDispatch();  

54.         _workSheet.ReleaseDispatch();  

55.         workSheets.ReleaseDispatch();  

56.         _workBook.ReleaseDispatch();  

57.         workSheets.ReleaseDispatch();  

58.         _app.ReleaseDispatch();  

如下是封装EXCEL类:

[c-sharp] view plaincopy

1.  // .h文件:  

2.   #include "comdef.h"   

3.   #include "excel.h"  

4.   class ExcelFile   

5.   {  

6.   public:  

7.   void ShowInExcel(bool bShow);  

8.   CString GetCell(int iRow, int iColumn);  

9.   int     GetCellInt(int iRow, int iColumn);  

10.         int GetRowCount();  

11.         int GetColumnCount();  

12.         bool LoadSheet(int iIndex);  

13.         CString GetSheetName(int iIndex);  

14.         static void InitExcel();  

15.         static void ReleaseExcel();  

16.         int GetSheetCount();  

17.         bool Open(CString FileName);  

18.         ExcelFile();  

19.         virtual ~ExcelFile();  

20.         protected:  

21.         private:  

22.         static _Application m_ExcelApp;  

23.           

24.         Workbooks    m_Books;   

25.         _Workbook    m_Book;   

26.         Worksheets   m_sheets;   

27.         _Worksheet   m_sheet;   

28.         Range        m_Rge;   

29.         };  

30.         .cpp文件:  

31.         ExcelFile::ExcelFile()  

32.         {  

33.         }  

34.         ExcelFile::~ExcelFile()  

35.         {  

36.         m_Rge.ReleaseDispatch();   

37.         m_sheet.ReleaseDispatch();   

38.         m_sheets.ReleaseDispatch();   

39.         m_Book.ReleaseDispatch();   

40.         m_Books.ReleaseDispatch();   

41.         }  

42.         void ExcelFile::InitExcel()  

43.         {  

44.         //创建Excel 2000服务器(启动Excel)   

45.         if (!m_ExcelApp.CreateDispatch("Excel.Application",NULL))   

46.         {   

47.         AfxMessageBox("创建Excel服务失败!");   

48.         exit(1);   

49.         }   

50.         }  

51.         void ExcelFile::ReleaseExcel()  

52.         {  

53.         m_ExcelApp.ReleaseDispatch();  

54.         }  

55.         bool ExcelFile::Open(CString FileName)  

56.         {  

57.         //打开excel文件  

58.         //利用模板文件建立新文档   

59.         m_Books.AttachDispatch(m_ExcelApp.GetWorkbooks(),true);   

60.         LPDISPATCH lpDis = NULL;  

61.         lpDis = m_Books.Add(_variant_t(FileName)); // 如何判断文件是否打开?  

62.         if (lpDis)  

63.         {  

64.         m_Book.AttachDispatch(lpDis);   

65.         //得到Worksheets   

66.         m_sheets.AttachDispatch(m_Book.GetWorksheets(),true);   

67.         return true;  

68.         }  

69.         return false;  

70.         }  

71.         int ExcelFile::GetSheetCount()  

72.         {  

73.         return m_sheets.GetCount();  

74.         }  

75.         CString ExcelFile::GetSheetName(int iIndex)  

76.         {  

77.         _Worksheet sheet;  

78.         sheet.AttachDispatch(m_sheets.GetItem(_variant_t((long)iIndex)),true);  

79.         CString name = sheet.GetName();  

80.         sheet.ReleaseDispatch();  

81.         return name;  

82.         }  

83.         bool ExcelFile::LoadSheet(int iIndex)  

84.         {  

85.         LPDISPATCH lpDis = NULL;  

86.         m_Rge.ReleaseDispatch();  

87.         m_sheet.ReleaseDispatch();  

88.         lpDis = m_sheets.GetItem(_variant_t((long)iIndex));  

89.         if (lpDis)  

90.         {  

91.                 m_sheet.AttachDispatch(lpDis,true);  

92.                 m_Rge.AttachDispatch(m_sheet.GetCells(), true);  

93.                 return true;  

94.         }  

95.         return false;  

96.         }  

97.         int ExcelFile::GetColumnCount()  

98.         {  

99.         Range range;  

100.     Range usedRange;  

101.     usedRange.AttachDispatch(m_sheet.GetUsedRange(), true);  

102.     range.AttachDispatch(usedRange.GetColumns(), true);  

103.     int count = range.GetCount();  

104.     usedRange.ReleaseDispatch();  

105.     range.ReleaseDispatch();  

106.     return count;  

107.     }  

108.     int ExcelFile::GetRowCount()  

109.     {  

110.     Range range;  

111.     Range usedRange;  

112.     usedRange.AttachDispatch(m_sheet.GetUsedRange(), true);  

113.     range.AttachDispatch(usedRange.GetRows(), true);  

114.     int count = range.GetCount();  

115.     usedRange.ReleaseDispatch();  

116.     range.ReleaseDispatch();  

117.     return count;  

118.     }  

119.     CString ExcelFile::GetCell(int iRow, int iColumn)  

120.     {  

121.     Range range;  

122.     range.AttachDispatch(m_Rge.GetItem (COleVariant((long)iRow),COleVariant((long)iColumn)).pdispVal, true);  

123.         COleVariant vResult =range.GetValue2();  

124.     CString str;  

125.     if(vResult.vt == VT_BSTR)       //字符串  

126.     {  

127.     str=vResult.bstrVal;  

128.     }  

129.     else if (vResult.vt==VT_INT)  

130.     {  

131.             str.Format("%d",vResult.pintVal);  

132.     }  

133.     else if (vResult.vt==VT_R8)     //8字节的数字   

134.     {  

135.     str.Format("%f",vResult.dblVal);  

136.     //str.Format("%.0f",vResult.dblVal);  

137.     //str.Format("%1f",vResult.fltVal);  

138.     }  

139.     else if(vResult.vt==VT_DATE)    //时间格式  

140.     {  

141.     SYSTEMTIME st;  

142.     VariantTimeToSystemTime(vResult.date, &st);  

143.     }  

144.     else if(vResult.vt==VT_EMPTY)   //单元格空的  

145.     {  

146.         str="(NULL)";  

147.     }   

148.     range.ReleaseDispatch();  

149.     return str;  

150.     }  

151.     int ExcelFile::GetCellInt(int iRow, int iColumn)  

152.     {  

153.     Range range;  

154.     range.AttachDispatch(m_Rge.GetItem(COleVariant((long)iRow),COleVariant((long)iColumn)).pdispVal, true);  

155.     COleVariant vResult =range.GetValue2();  

156.     int num;  

157.     num = (int)vResult.date;  

158.     range.ReleaseDispatch();  

159.     return num;  

160.     }  

161.     void ExcelFile::ShowInExcel(bool bShow)  

162.     {  

163.     m_ExcelApp.SetVisible(bShow);  

164.     

 

你可能感兴趣的:(c++,vc,vc6.0,MFC,MFC,windows,32位,excel,vc6.0)