QReadExcelToMap.h
资源名称:QGIS.rar [点击查看]
上传用户:oybseng
上传日期:2015-04-27
资源大小:7831k
文件大小:10k
源码类别:
GDI/图象编程
开发平台:
Visual C++
- #ifndef _GEO_READ_EXCEL_TO_MAP_
- #define _GEO_READ_EXCEL_TO_MAP_
- #include "QObjects/include/QBaseObj.h"
- #include "QObjects/include/QLineObj.h"
- #include "QObjects/include/QCoordSys.h"
- #include "QObjects/include/QTextObj.h"
- #include "excel9.h"
- #include "comutil.h"
- #include <vector>
- using namespace std;
- class CQLayerObj;
- class CQMapObj;
- /////////////////////////////////////////////////////////////////////
- //// GeoView_Class_Mark_Begin
- // 类名: CQReadExcelCell
- // 基类:无
- // 作者:祁强
- // 描述: Excel表中的一个单元格
- // 创建日期: 2007-10-22
- // 修改:添加注释文档
- // 参考文献:
- class CQReadExcelCell
- //// GeoView_Class_Mark_End
- {
- public:
- CQReadExcelCell();
- CQReadExcelCell(CQCoordSys * pCoordObj);
- ~CQReadExcelCell();
- BOOL SetCoordSys(CQCoordSys * pCoordObj);
- void InitCell(CQPoint ptBegin,CString szText,float fRowHeight,
- float fColWidth,BOOL bCellMegre,long nMergeRows,long nMergeCols,
- BYTE nHAllignFormat,BYTE nVAlligFormat,LOGFONT font,
- COLORREF crFont,float fFontSize,CQCoordSys * pCoordObj = NULL);
- CQTextObj * GetCellLabelObj(); // 获取格网中的文本对象
- inline CString GetCellText(); // 获取格网中文本的内容
- inline float GetCellWidth(); //获取单元格的宽
- inline float GetCellHeight(); //获取单元格的高
- inline BYTE GetCellHAllignFormat(CString szHAllign); // 获取单元格水平对齐方式
- inline BYTE GetCellVAllignFormat(CString szVAllign); // 获取单元格垂直对齐方式
- inline long GetMergeRows(); // 获取合并单元格的行数
- inline long GetMergeCols(); // 获取合并单元格的列数
- inline LOGFONT GetCellTextfont();
- inline COLORREF GetCellTextColor();
- inline float GetCellTextFontSize();
- void SetLabelFont(LOGFONT lFont); //设置字体
- void SetLabelPtSize(float fSize); //磅值
- void SetLabelColor(COLORREF lbCr);//字体颜色
- void SetLabelText(CString szText);//设置文本内容
- CQReadExcelCell & operator = (CQReadExcelCell & ReadExcel);
- BOOL IsCellMerge(); // 获取是否合并单元格
- void GetCellBeginPt(CQPoint & pt);
- void GetCellBeginPt(double & dx,double & dy); // 获取单元格的起点坐标
- void CalTextPtCoord(); // 根据字体等相关属性设置文本的正确位置
- //计算单元格结束点的坐标
- void CalCellEndPt(float fRowHeight,float fColWidth,long lMergeRows,long lMergeCols,CQCoordSys * pCoordObj = NULL);
- // 根据水平对齐方式设置文本的X坐标
- void MakeCellXPt(CQPoint & ptBeign,BYTE nHAllignFormat,float fColWidth,long nMergeCols,CQCoordSys * pCoordObj);
- // 根据垂直对齐方式设置文本的Y坐标
- void MakeCellYPt(CQPoint & ptBeign,BYTE nVAllignFormat,float fRowHeight,long nMergeRows,CQCoordSys * pCoordObj);
- //根据列宽以及合并单元格的列数计算下一个单元格的起点
- void MakeCellNextColPt(CQPoint & ptNext,float fColWidth,long nMergeCols,CQCoordSys * pCoodObj = NULL);
- //根据行高以及合并单元格的行数计算下一行单元格的起点
- void MakeCellNextRowPt(CQPoint & ptNext,float fRowWidth,long nMergeRows,CQCoordSys * pCoordObj = NULL);
- public:
- CQCoordSys * m_pCoordObj;//当前工程的坐标系统对象是必须的
- //转换为Geo对象后的对应对象
- CQPoint m_ptBegin; // 单元格的起点坐标对于网格线而言
- CQPoint m_ptText; // 文本的起始点坐标 根据文本的相关属性计算
- CQPoint m_ptEnd; // 每个单元格右下角的点坐标
- private:
- CQTextObj * m_pObjLabel; // 单元格中的值对象
- //CQLineObj * m_pGridLine; // 网格线对象指针
- float m_fCellWidth; // 指定列的宽 从Excel读入的是磅值
- float m_fCellHeight; // 本行单元格的高
- BYTE m_nHAllignFormat; // 水平对齐方式0-左对齐1-居中2-右对齐
- BYTE m_nVAllignFormat; // 垂直对齐方式0-靠上 1-居中 2-靠下
- long m_nMergeCellRows; // 合并的单元格的行数
- long m_nMergeCellCols; // 合并的单元格的列数
- BOOL m_bCellMerge; // 是否为合并单元格
- LOGFONT m_CellFont; // 从Excel中读出的单元格中文本的字体
- COLORREF m_crCellColor; // 从Excel中读出的单元格文本的颜色
- float m_fCellFontSize; // 从单元格读出的文本的字号1、2、3。。。。48
- const double m_cMoveOff; // 默认的偏移量
- CString m_szCellText; // 单元格的文本值
- };
- /////////////////////////////////////////////////////////////////////
- //// GeoView_Class_Mark_Begin
- // 类名: CQReadExcelToView
- // 基类:无
- // 作者:祁强
- // 描述: 读入Excel并将其以完全相同的方式写入图幅对象
- // 创建日期: 2007-10-22
- // 修改:添加注释文档
- // 参考文献:
- class CQReadExcelToView
- //// GeoView_Class_Mark_End
- {
- public:
- CQReadExcelToView(CQMapObj * pMap,CQCoordSys * pCoordObj,CQPoint ptBegin); // 构造函数
- ~CQReadExcelToView(); // 析构函数
- public:
- void SetGridBeginPt(CQPoint ptBegin); // 设置单元格的起点坐标
- void GetGridBeginPt(CQPoint & ptBegin);// 获取单元格的起点坐标
- float GetRowHeight(UINT nRowNum); // 获取指定行的行高
- float GetColWidth(UINT nColNum,UINT nRowNum); // 获取指定列的列宽()参数为行、列号
- int GetRowCount(); // 获取行的总数
- int GetColCount(); // 获取列的总数
- BOOL InitExcel(); // 初始化Excel的相关参数
- BOOL ReadExcelFromPC(); // 从磁盘中读出Excel文件的内容 //
- // 这也是这个类的主要功能函数
- void SetExcelStartPt(CQPoint Pt);
- void SetExcelStartPt(double dx,double dy);
- CString GetExcelCellValue(Range & geoRange,long nRowIndex,long nColIndex);
- BYTE GetHAllignFormat(Range & geoRange,long nRowIndex,long nColIndex);
- BYTE GetVAllignFormat(Range & geoRange,long nRowIndex,long nColIndex);
- //获取合并单元格的格式
- BOOL GetMergeCellFormat(Range & geoRange,long nRowIndex,long nColIndex,long & nMergerows,long & nMergeCols,long & nMergeStartRow,long & nMergeStartCol);
- void GetCellFont(Range & geoRange,long nRowIndex,long nColIndex,float & fColWidth,float & fRowHeight);
- void DrawExcelGridLine(CQMapObj * pMap,CQCoordSys * pCoordObj,long nExcelRows,long nExcelCols); // 绘制表格中的网格线
- //excel里的单位和cm(厘米)可以这样转换:
- //行高: 1Uint = 0.351MM
- double ExcelRowUintToMM(float fRowHeight); //将Excel的行高单位转换为毫米
- //1个单位=0.3612毫米
- //列宽: Excel 1Uint = 2.387MM
- double ExcelColUintToMM(float fColWidth); //将Excel的列宽单位转换为毫米
- void MakeNextRowStartPt(CQPoint & ptNext,CQPoint & ptPre,float fRowHeight,long nMergeRows,CQCoordSys * pCoordObj);
- CQPoint CalEachRowFirstColPt(float fRowHeight); //根据类里定义的每行首列元素结构计算下一行元素的起点坐标
- void ReCalMergedCellEnPt(CQPoint & ptEnd,long nRowIndex,long nColIndex,float fRowHeight,float fColWidth);
- private:
- //转换为Geo对象后的对应对象
- CQPoint m_ptBegin; // 读入的Excel表格的起点坐标
- CQLineObj * m_pGridLine; // 网格线对象指针
- float m_fColWidth; // 指定列的宽
- float m_fRowHeight; // 指定行的高
- long m_nRowCount; // 记录行数
- long m_nColCount; // 记录列数
- long m_nStartRow; // Excel中的起始行
- long m_nStartCol; // Excel中的起始列
- public:
- CQReadExcelCell m_curCell; // 当前单元格对象
- //geoView对象
- CQMapObj * m_pMap; // 当前图幅的指针
- CQLayerObj * m_pCurNewLayer;
- CQCoordSys * m_pCoordObj;
- //存放点阵的结构体
- class stPt
- {
- public:
- stPt()
- {
- st_bMerge = FALSE;
- }
- stPt(const stPt & pt)
- {
- st_ptBegin.SetPoint(pt.st_ptBegin.GetX(),pt.st_ptBegin.GetY());
- st_ptEnd.SetPoint(pt.st_ptEnd.GetX(),pt.st_ptEnd.GetY());
- st_RowNum = pt.st_RowNum;
- st_ColNum = pt.st_ColNum;
- st_ColWidth = pt.st_ColWidth;
- st_RowHeight = pt.st_RowHeight;
- st_bMerge = pt.st_bMerge;
- }
- stPt & operator=(const stPt & pt)
- {
- if(&pt == this)
- return *this;
- st_ptBegin.SetPoint(pt.st_ptBegin.GetX(),pt.st_ptBegin.GetY());
- st_ptEnd.SetPoint(pt.st_ptEnd.GetX(),pt.st_ptEnd.GetY());
- st_RowNum = pt.st_RowNum;
- st_ColNum = pt.st_ColNum;
- st_ColWidth = pt.st_ColWidth;
- st_RowHeight = pt.st_RowHeight;
- st_bMerge = pt.st_bMerge;
- return *this;
- }
- CQPoint st_ptBegin; //格网的起点坐标
- CQPoint st_ptEnd; //格网的终点坐标
- int st_RowNum; //记录该单元所在的行号
- int st_ColNum; //记录该单元所在的列号
- BOOL st_bMerge; //写一个记录是否被合并的标记
- float st_ColWidth; //记录列宽
- float st_RowHeight; //记录行高
- //若被合并则不进行操作
- void Clear()
- {
- st_ptBegin = st_ptEnd = CQPoint(0.0,0.0);
- st_bMerge = FALSE;
- st_ColWidth = st_RowHeight = 0.0f;
- }
- }m_stPt;
- vector<stPt> m_stVector;
- class stMergeCellInfo //合并单元格的信息结构
- {
- public:
- stMergeCellInfo()
- {
- st_StartRow = 0;
- st_StartCol = 0;
- st_MergeRows = 0;
- st_MergeCols = 0;
- }
- stMergeCellInfo(const stMergeCellInfo & MC)
- {
- st_StartRow = MC.st_StartRow;
- st_StartCol = MC.st_StartCol;
- st_MergeRows = MC.st_MergeRows;
- st_MergeCols = MC.st_MergeCols;
- }
- long st_StartRow; //合并单元格的起始行号
- long st_StartCol; //合并单元格的起始列号
- long st_MergeRows; //合并的行数
- long st_MergeCols; //合并的列数
- }m_stMergeInfo;
- vector<stMergeCellInfo> m_stMergeVector; //合并单元格的信息的向量
- class stRowFirstCell
- {
- public:
- stRowFirstCell()
- {
- st_ptBeginFirst = CQPoint(0,0);
- st_lMergeRows = 0;
- st_lMergeCols = 0;
- st_lFirRowHeight = 0;
- st_lFirColWidth = 0;
- }
- stRowFirstCell(const stRowFirstCell & MC)
- {
- st_ptBeginFirst = CQPoint(MC.st_ptBeginFirst);
- st_lMergeRows = MC.st_lMergeRows;
- st_lMergeCols = MC.st_lMergeCols;
- st_lFirRowHeight = MC.st_lFirRowHeight;
- st_lFirColWidth = MC.st_lFirColWidth;
- }
- CQPoint st_ptBeginFirst; //每一行第一列的坐标
- long st_lMergeRows; //合并的行数
- long st_lMergeCols; //合并的列数
- float st_lFirRowHeight; //第一行的行高
- float st_lFirColWidth; //第一列的列宽
- }m_stEachFirRow;
- public:
- //Excel对象
- _Application * m_pExcelApp;
- Workbooks m_ExcelBook; // 所有的工作区
- _Workbook m_workBook; // 当前工作区
- Worksheets m_ExcelSheet; // 所有表单
- _Worksheet m_workSheet; // 当前表单
- Range m_UsedRange; // 控制当前的单元格
- Range m_myallrange; // 用来操作合并单元格
- Range m_RowRange; // 单元格范围
- Range m_ColRange; // 单元格范围
- };
- #endif