最近写了一个小工具,使用到了vc6.0对excel的操作,搜集了些文件资料以及自己的的总结,记录下。
这里共总结了两种对excle的操作,一种为通过excle对象,一种为通过ODBC服务;
1, 通过excle对象
1.1, excle对象使用类
2. _Application:表示整个的Excel应用程序,包含一个工作簿集合
3. Workbooks:工作簿集合,包含N个工作簿(Workbook)
4. _Workbook:工作簿,包含一个工作表(sheets)集合
5. Worksheets:工作表集合,包含N个工作表
6. _Worksheet:工作表,也就是我们在Excel中看到的Sheet1、Sheet2、Sheet3,它是我们操作Excel的基本单位
7. Range:这是单元格的集合,我们知道Excel是由一个个的单元格组成的,通过Range来操作单元格
Application 对象。Application对象表示 Excel应用程序本身。Application对象提供了大量有关正在运行的应用程序、应用于该实例的选项以及在该实例中打开的当前用户的对象的信息。
Workbook对象。Workbook类表示Excel 应用程序内的单个工作簿。Application类的许多成员同时也是Workbook类的成员。在这种情况下,属性应用于特定的工作簿(而非应用于活动工作簿)。
Worksheet对象。虽然 Worksheet类提供了大量成员,但大部分属性、方法和事件都与Application和/或Workbook类提供的成员相同或相似。Excel提供Sheets 集合作为 Workbook 对象的属性,但Excel 中没有 Sheet 类。实际上,Sheets集合的每个成员不是 Worksheet对象就是Chart 对象。
Range对象。Range对象是Excel 应用程序中最常用的对象。在能够处理 Excel内的任何范围之前,必须将它表示为Range对象,并处理该对象的方法和属性。Range对象表示一个单元格、一行、一列、包含一个或多个单元格块(可以连续,也可以不连续)的单元格选定范围,甚至多个工作表中的一组单元格。
1.2,Com支持库的初始化
通常在App的InitInstance()里面加入初始化和关闭COM库的操作,在DoModal()调用之前加入初始化的代码,如:
1. if (CoInitialize(NULL) != 0)
2. {
3. AfxMessageBox("初始化COM支持库失败!");
4. exit(1);
5. }
在return之前加入CoUninitialize();关闭CON库
如果执行某些操作出现“正在运行中,此操作无法完成.请选择'切换到'来激活正在运行中的程序,并更正问题”警告,则在是由于自动化服务超时引起,在App::InitInstance()里AfxOleInit()之后加上如下语句:
AfxOleGetMessageFilter()->EnableBusyDialog(FALSE);
AfxOleGetMessageFilter()->SetBusyReply(SERVERCALL_RETRYLATER);
AfxOleGetMessageFilter()->EnableNotRespondingDialog(TRUE);
AfxOleGetMessageFilter()->SetMessagePendingDelay (-1);
如果增加之后编译不通过,增加头文件#include <afxole.h>
1.3,代码实现
首先别忘了包含头文件“excel.h”,若用到_variant_t()时,需要包含头文件“comdef.h”和“comutil.h”,否则会出现错误:
“errorC2065: '_variant_t' :undeclaredidentifier”。
1. .h文件:
2. #include"comdef.h"
3. #include"excel.h"
4. classExcelFile
5. {
6. public:
7. voidShowInExcel(bool bShow);
8. CStringGetCell(int iRow, int iColumn);
9. intGetCellInt(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. //第一步:创建Excel2000服务器(启动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. //第二步:获取工作簿集合; 利用模板文件建立新文档
58. m_Books.AttachDispatch(m_ExcelApp.GetWorkbooks(),true);
59. LPDISPATCH lpDis = NULL;
60. lpDis = m_Books.Add(_variant_t(FileName)); //如何判断文件是否打开?
61. if (lpDis)
62. {
63. //第三步:获取工作簿
64. m_Book.AttachDispatch(lpDis);
65. //第四步:获取工作表集合
66. m_sheets.AttachDispatch(m_Book.GetWorksheets(),true);
67. return true;
68. }
69. return false;
70. }
71.
72. int ExcelFile::GetSheetCount()
73. {
74. return m_sheets.GetCount();
75. }
76.
77. CString ExcelFile::GetSheetName(int iIndex)
78. {
79. _Worksheet sheet;
80. //第五步:获取工作表
81. sheet.AttachDispatch(m_sheets.GetItem(_variant_t((long)iIndex)),true);
82. CString name = sheet.GetName();
83. sheet.ReleaseDispatch();
84. return name;
85. }
86. bool ExcelFile::LoadSheet(int iIndex)
87. {
88. LPDISPATCH lpDis = NULL;
89. m_Rge.ReleaseDispatch();
90. m_sheet.ReleaseDispatch();
91. lpDis = m_sheets.GetItem(_variant_t((long)iIndex));
92. if (lpDis)
93. {
94. m_sheet.AttachDispatch(lpDis,true);
95. m_Rge.AttachDispatch(m_sheet.GetCells(), true);
96. return true;
97. }
98. return false;
99. }
100. intExcelFile::GetColumnCount()
101. {
102. Rangerange;
103. RangeusedRange;
104. usedRange.AttachDispatch(m_sheet.GetUsedRange(),true);
105. range.AttachDispatch(usedRange.GetColumns(),true);
106. intcount = range.GetCount();
107. usedRange.ReleaseDispatch();
108. range.ReleaseDispatch();
109. returncount;
110. }
111. intExcelFile::GetRowCount()
112. {
113. Rangerange;
114. RangeusedRange;
115. usedRange.AttachDispatch(m_sheet.GetUsedRange(),true);
116. range.AttachDispatch(usedRange.GetRows(),true);
117. intcount = range.GetCount();
118. usedRange.ReleaseDispatch();
119. range.ReleaseDispatch();
120. returncount;
121. }
122. CStringExcelFile::GetCell(int iRow, int iColumn)
123. {
124. Rangerange;
125. range.AttachDispatch(m_Rge.GetItem(COleVariant((long)iRow),COleVariant((long)iColumn)).pdispVal,true);
126. COleVariant vResult =range.GetValue2();
127. CStringstr;
128. if(vResult.vt== VT_BSTR) //字符串
129. {
130. str=vResult.bstrVal;
131. }
132. elseif (vResult.vt==VT_INT)
133. {
134. str.Format("%d",vResult.pintVal);
135. }
136. elseif (vResult.vt==VT_R8) //8字节的数字
137. {
138. str.Format("%f",vResult.dblVal);
139. //str.Format("%.0f",vResult.dblVal);
140. //str.Format("%1f",vResult.fltVal);
141. }
142. elseif(vResult.vt==VT_DATE) //时间格式
143. {
144. SYSTEMTIMEst;
145. VariantTimeToSystemTime(vResult.date,&st);
146. }
147. elseif(vResult.vt==VT_EMPTY) //单元格空的
148. {
149. str="(NULL)";
150. }
151. range.ReleaseDispatch();
152. returnstr;
153. }
154. intExcelFile::GetCellInt(int iRow, int iColumn)
155. {
156. Rangerange;
157. range.AttachDispatch(m_Rge.GetItem(COleVariant((long)iRow),COleVariant((long)iColumn)).pdispVal,true);
158. COleVariant vResult =range.GetValue2();
159. intnum;
160. num= (int)vResult.date;
161. range.ReleaseDispatch();
162. returnnum;
163. }
164. voidExcelFile::ShowInExcel(bool bShow)
165. {
166. m_ExcelApp.SetVisible(bShow);
167. }