QReadExcelToMap.h
上传用户:oybseng
上传日期:2015-04-27
资源大小:7831k
文件大小:10k
源码类别:

GDI/图象编程

开发平台:

Visual C++

  1. #ifndef _GEO_READ_EXCEL_TO_MAP_
  2. #define _GEO_READ_EXCEL_TO_MAP_
  3. #include "QObjects/include/QBaseObj.h"
  4. #include "QObjects/include/QLineObj.h"
  5. #include "QObjects/include/QCoordSys.h"
  6. #include "QObjects/include/QTextObj.h"
  7. #include "excel9.h"
  8. #include "comutil.h"
  9. #include <vector>
  10. using namespace std;
  11. class CQLayerObj;
  12. class CQMapObj;
  13. /////////////////////////////////////////////////////////////////////
  14. //// GeoView_Class_Mark_Begin
  15. //        类名: CQReadExcelCell
  16. // 基类:无
  17. //    作者:祁强
  18. //    描述: Excel表中的一个单元格
  19. //    创建日期: 2007-10-22
  20. //    修改:添加注释文档
  21. //    参考文献: 
  22. class CQReadExcelCell
  23. //// GeoView_Class_Mark_End 
  24. {
  25. public:
  26. CQReadExcelCell();
  27. CQReadExcelCell(CQCoordSys * pCoordObj);
  28. ~CQReadExcelCell();
  29. BOOL SetCoordSys(CQCoordSys * pCoordObj);
  30. void InitCell(CQPoint ptBegin,CString szText,float fRowHeight,
  31. float fColWidth,BOOL bCellMegre,long nMergeRows,long nMergeCols,
  32. BYTE nHAllignFormat,BYTE nVAlligFormat,LOGFONT font,
  33. COLORREF crFont,float fFontSize,CQCoordSys * pCoordObj = NULL);
  34. CQTextObj * GetCellLabelObj(); // 获取格网中的文本对象
  35. inline CString GetCellText(); // 获取格网中文本的内容
  36. inline float GetCellWidth();  //获取单元格的宽
  37. inline float GetCellHeight(); //获取单元格的高
  38. inline BYTE GetCellHAllignFormat(CString szHAllign); // 获取单元格水平对齐方式
  39. inline BYTE GetCellVAllignFormat(CString szVAllign); // 获取单元格垂直对齐方式
  40. inline long GetMergeRows();   // 获取合并单元格的行数
  41. inline long GetMergeCols();   // 获取合并单元格的列数
  42. inline LOGFONT GetCellTextfont(); 
  43. inline COLORREF GetCellTextColor();
  44. inline float GetCellTextFontSize();
  45. void SetLabelFont(LOGFONT lFont); //设置字体
  46. void SetLabelPtSize(float fSize); //磅值
  47. void SetLabelColor(COLORREF lbCr);//字体颜色
  48. void SetLabelText(CString szText);//设置文本内容
  49. CQReadExcelCell & operator = (CQReadExcelCell & ReadExcel);
  50. BOOL IsCellMerge();           // 获取是否合并单元格
  51. void GetCellBeginPt(CQPoint & pt);
  52. void GetCellBeginPt(double & dx,double & dy); // 获取单元格的起点坐标
  53. void CalTextPtCoord();        // 根据字体等相关属性设置文本的正确位置
  54. //计算单元格结束点的坐标
  55. void CalCellEndPt(float fRowHeight,float fColWidth,long lMergeRows,long lMergeCols,CQCoordSys * pCoordObj = NULL);
  56. // 根据水平对齐方式设置文本的X坐标
  57. void MakeCellXPt(CQPoint & ptBeign,BYTE nHAllignFormat,float fColWidth,long nMergeCols,CQCoordSys * pCoordObj); 
  58. // 根据垂直对齐方式设置文本的Y坐标
  59. void MakeCellYPt(CQPoint & ptBeign,BYTE nVAllignFormat,float fRowHeight,long nMergeRows,CQCoordSys * pCoordObj);
  60. //根据列宽以及合并单元格的列数计算下一个单元格的起点
  61. void MakeCellNextColPt(CQPoint & ptNext,float fColWidth,long nMergeCols,CQCoordSys * pCoodObj = NULL);
  62. //根据行高以及合并单元格的行数计算下一行单元格的起点
  63. void MakeCellNextRowPt(CQPoint & ptNext,float fRowWidth,long nMergeRows,CQCoordSys * pCoordObj = NULL);
  64. public:
  65. CQCoordSys * m_pCoordObj;//当前工程的坐标系统对象是必须的
  66. //转换为Geo对象后的对应对象
  67. CQPoint m_ptBegin;             // 单元格的起点坐标对于网格线而言
  68. CQPoint m_ptText;              // 文本的起始点坐标 根据文本的相关属性计算 
  69. CQPoint m_ptEnd;               // 每个单元格右下角的点坐标
  70. private:
  71. CQTextObj * m_pObjLabel;       // 单元格中的值对象
  72. //CQLineObj * m_pGridLine;     // 网格线对象指针
  73. float m_fCellWidth;              // 指定列的宽 从Excel读入的是磅值
  74. float m_fCellHeight;              // 本行单元格的高
  75. BYTE  m_nHAllignFormat;          // 水平对齐方式0-左对齐1-居中2-右对齐
  76. BYTE  m_nVAllignFormat;          // 垂直对齐方式0-靠上 1-居中 2-靠下 
  77. long  m_nMergeCellRows;          // 合并的单元格的行数
  78. long  m_nMergeCellCols;          // 合并的单元格的列数
  79. BOOL  m_bCellMerge;              // 是否为合并单元格
  80. LOGFONT m_CellFont;              // 从Excel中读出的单元格中文本的字体
  81. COLORREF m_crCellColor;          // 从Excel中读出的单元格文本的颜色
  82. float  m_fCellFontSize;          // 从单元格读出的文本的字号1、2、3。。。。48
  83. const double m_cMoveOff;         // 默认的偏移量
  84. CString m_szCellText;            // 单元格的文本值
  85. };
  86. /////////////////////////////////////////////////////////////////////
  87. //// GeoView_Class_Mark_Begin
  88. //        类名: CQReadExcelToView
  89. // 基类:无
  90. //    作者:祁强
  91. //    描述: 读入Excel并将其以完全相同的方式写入图幅对象
  92. //    创建日期: 2007-10-22
  93. //    修改:添加注释文档
  94. //    参考文献: 
  95. class CQReadExcelToView
  96. //// GeoView_Class_Mark_End
  97. {
  98. public:
  99. CQReadExcelToView(CQMapObj * pMap,CQCoordSys * pCoordObj,CQPoint ptBegin);  // 构造函数
  100. ~CQReadExcelToView();                 // 析构函数
  101. public:
  102. void SetGridBeginPt(CQPoint ptBegin);  // 设置单元格的起点坐标
  103. void GetGridBeginPt(CQPoint & ptBegin);// 获取单元格的起点坐标
  104. float GetRowHeight(UINT nRowNum); // 获取指定行的行高
  105. float GetColWidth(UINT nColNum,UINT nRowNum);  // 获取指定列的列宽()参数为行、列号
  106. int GetRowCount();               // 获取行的总数
  107. int GetColCount();               // 获取列的总数
  108. BOOL InitExcel();                // 初始化Excel的相关参数
  109. BOOL ReadExcelFromPC();          // 从磁盘中读出Excel文件的内容 // 
  110.                                  // 这也是这个类的主要功能函数
  111. void SetExcelStartPt(CQPoint Pt);
  112. void SetExcelStartPt(double dx,double dy);
  113. CString GetExcelCellValue(Range & geoRange,long nRowIndex,long nColIndex);
  114. BYTE GetHAllignFormat(Range & geoRange,long nRowIndex,long nColIndex);
  115. BYTE GetVAllignFormat(Range & geoRange,long nRowIndex,long nColIndex);
  116. //获取合并单元格的格式
  117. BOOL GetMergeCellFormat(Range & geoRange,long nRowIndex,long nColIndex,long & nMergerows,long & nMergeCols,long & nMergeStartRow,long & nMergeStartCol); 
  118. void GetCellFont(Range & geoRange,long nRowIndex,long nColIndex,float & fColWidth,float & fRowHeight);
  119. void DrawExcelGridLine(CQMapObj * pMap,CQCoordSys * pCoordObj,long nExcelRows,long nExcelCols);        // 绘制表格中的网格线
  120. //excel里的单位和cm(厘米)可以这样转换:  
  121. //行高: 1Uint = 0.351MM
  122. double ExcelRowUintToMM(float fRowHeight); //将Excel的行高单位转换为毫米
  123. //1个单位=0.3612毫米  
  124. //列宽: Excel 1Uint = 2.387MM
  125. double ExcelColUintToMM(float fColWidth);  //将Excel的列宽单位转换为毫米
  126. void MakeNextRowStartPt(CQPoint & ptNext,CQPoint & ptPre,float fRowHeight,long nMergeRows,CQCoordSys * pCoordObj);
  127. CQPoint CalEachRowFirstColPt(float fRowHeight);          //根据类里定义的每行首列元素结构计算下一行元素的起点坐标
  128. void  ReCalMergedCellEnPt(CQPoint & ptEnd,long nRowIndex,long nColIndex,float fRowHeight,float fColWidth);
  129. private:
  130. //转换为Geo对象后的对应对象
  131. CQPoint m_ptBegin;             // 读入的Excel表格的起点坐标 
  132. CQLineObj * m_pGridLine; // 网格线对象指针
  133. float m_fColWidth;               // 指定列的宽
  134. float m_fRowHeight;              // 指定行的高
  135. long m_nRowCount;                 // 记录行数
  136. long m_nColCount;                 // 记录列数
  137. long m_nStartRow;                 // Excel中的起始行
  138. long m_nStartCol;                 // Excel中的起始列
  139. public:
  140. CQReadExcelCell m_curCell;      // 当前单元格对象  
  141. //geoView对象
  142. CQMapObj * m_pMap;              // 当前图幅的指针
  143. CQLayerObj * m_pCurNewLayer;
  144. CQCoordSys * m_pCoordObj;
  145. //存放点阵的结构体
  146. class stPt 
  147. {
  148. public:
  149. stPt()
  150. {
  151. st_bMerge = FALSE;
  152. }
  153. stPt(const stPt & pt)
  154. {
  155. st_ptBegin.SetPoint(pt.st_ptBegin.GetX(),pt.st_ptBegin.GetY());
  156. st_ptEnd.SetPoint(pt.st_ptEnd.GetX(),pt.st_ptEnd.GetY());
  157. st_RowNum = pt.st_RowNum;
  158. st_ColNum = pt.st_ColNum;
  159. st_ColWidth = pt.st_ColWidth;
  160. st_RowHeight = pt.st_RowHeight;
  161. st_bMerge = pt.st_bMerge;
  162. }
  163. stPt & operator=(const stPt & pt)
  164. {
  165. if(&pt == this)
  166. return *this;
  167. st_ptBegin.SetPoint(pt.st_ptBegin.GetX(),pt.st_ptBegin.GetY());
  168. st_ptEnd.SetPoint(pt.st_ptEnd.GetX(),pt.st_ptEnd.GetY());
  169. st_RowNum = pt.st_RowNum;
  170. st_ColNum = pt.st_ColNum;
  171. st_ColWidth = pt.st_ColWidth;
  172. st_RowHeight = pt.st_RowHeight;
  173. st_bMerge = pt.st_bMerge;
  174. return *this;
  175. }
  176. CQPoint st_ptBegin;         //格网的起点坐标
  177. CQPoint st_ptEnd;           //格网的终点坐标
  178. int       st_RowNum;          //记录该单元所在的行号
  179. int       st_ColNum;          //记录该单元所在的列号
  180. BOOL      st_bMerge;     //写一个记录是否被合并的标记
  181. float     st_ColWidth;   //记录列宽
  182. float     st_RowHeight;  //记录行高
  183. //若被合并则不进行操作
  184. void Clear()
  185. {
  186. st_ptBegin = st_ptEnd = CQPoint(0.0,0.0);
  187. st_bMerge = FALSE;
  188. st_ColWidth = st_RowHeight = 0.0f;
  189. }
  190. }m_stPt;
  191. vector<stPt> m_stVector; 
  192. class stMergeCellInfo  //合并单元格的信息结构 
  193. {
  194. public:
  195. stMergeCellInfo()
  196. {
  197. st_StartRow = 0;
  198. st_StartCol = 0;
  199. st_MergeRows = 0;
  200. st_MergeCols = 0;
  201. }
  202. stMergeCellInfo(const stMergeCellInfo & MC)
  203. {
  204. st_StartRow = MC.st_StartRow;
  205. st_StartCol = MC.st_StartCol;
  206. st_MergeRows = MC.st_MergeRows;
  207. st_MergeCols = MC.st_MergeCols;
  208. }
  209. long st_StartRow;   //合并单元格的起始行号
  210. long st_StartCol;   //合并单元格的起始列号
  211. long st_MergeRows;  //合并的行数
  212. long st_MergeCols;  //合并的列数
  213. }m_stMergeInfo;
  214. vector<stMergeCellInfo> m_stMergeVector; //合并单元格的信息的向量
  215. class stRowFirstCell
  216. {
  217. public:
  218. stRowFirstCell()
  219. {
  220. st_ptBeginFirst = CQPoint(0,0);
  221. st_lMergeRows = 0;
  222. st_lMergeCols = 0;
  223. st_lFirRowHeight = 0;
  224. st_lFirColWidth = 0;
  225. }
  226. stRowFirstCell(const stRowFirstCell & MC)
  227. {
  228. st_ptBeginFirst = CQPoint(MC.st_ptBeginFirst);
  229. st_lMergeRows = MC.st_lMergeRows;
  230. st_lMergeCols = MC.st_lMergeCols;
  231. st_lFirRowHeight = MC.st_lFirRowHeight;
  232. st_lFirColWidth = MC.st_lFirColWidth;
  233. }
  234. CQPoint st_ptBeginFirst;  //每一行第一列的坐标
  235. long st_lMergeRows;         //合并的行数
  236. long st_lMergeCols;         //合并的列数
  237. float st_lFirRowHeight;     //第一行的行高
  238. float st_lFirColWidth;      //第一列的列宽
  239. }m_stEachFirRow;
  240. public:
  241.     //Excel对象
  242. _Application * m_pExcelApp;
  243. Workbooks   m_ExcelBook;         // 所有的工作区
  244. _Workbook   m_workBook;          // 当前工作区
  245. Worksheets      m_ExcelSheet;        // 所有表单
  246. _Worksheet  m_workSheet;         // 当前表单
  247. Range m_UsedRange;               // 控制当前的单元格
  248. Range m_myallrange;              // 用来操作合并单元格
  249. Range m_RowRange;                // 单元格范围
  250. Range m_ColRange;                // 单元格范围
  251. };
  252. #endif