vc6.0实现操作excle文件之上篇

最近写了一个小工具,使用到了vc6.0excel的操作,搜集了些文件资料以及自己的的总结,记录下。

这里共总结了两种对excle的操作,一种为通过excle对象,一种为通过ODBC服务;

1,        通过excle对象

1.1,   excle对象使用类

2.       _Application:表示整个的Excel应用程序,包含一个工作簿集合

3.       Workbooks:工作簿集合,包含N个工作簿(Workbook)

4.       _Workbook:工作簿,包含一个工作表(sheets)集合

5.       Worksheets:工作表集合,包含N个工作表

6.       _Worksheet:工作表,也就是我们在Excel中看到的Sheet1Sheet2Sheet3,它是我们操作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.2Com支持库的初始化

通常在AppInitInstance()里面加入初始化和关闭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.   }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值