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

GDI/图象编程

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "QReadExcelToMap.h"
  3. #include "QObjects/include/QLayerObj.h"
  4. #include "QObjects/include/QMapObj.h"
  5. #include "comdef.h"
  6. #include "comutil.h"
  7. #include "afxtempl.h"
  8. using namespace std;
  9. //const double c_ColExcelToMM = 2.387;
  10. //const double c_RowExcelToMM = 0.351;
  11. #define COLEXCELTOMM 2.387
  12. #define ROWEXCELTOMM 0.351
  13. CQReadExcelCell::CQReadExcelCell():m_cMoveOff(0.8)
  14. {
  15. m_ptBegin = CQPoint(0.0f,0.0f);    // 单元格的起点坐标
  16. m_ptEnd = CQPoint(0.0f,0.0f);
  17. m_ptText = CQPoint(0.0f,0.0f);
  18. m_pObjLabel = NULL;                // 单元格中的值对象 
  19. //CQLineObj * m_pGridLine;         // 网格线对象指针
  20. m_fCellWidth = 0.0f;               // 指定列的宽
  21. m_fCellHeight = 0.0f;              // 本行单元格的高
  22. m_nHAllignFormat = 0;              // 水平对齐方式0-左对齐1-居中2-右对齐
  23. m_nVAllignFormat = 1;              // 垂直对齐方式0-靠上 1-居中 2-靠下 
  24. m_nMergeCellRows = 0;              // 合并的单元格的行数
  25. m_nMergeCellCols = 0;              // 合并的单元格的列数
  26. m_bCellMerge = FALSE;              // 是否为合并单元
  27. m_szCellText = "";
  28. }
  29. CQReadExcelCell::CQReadExcelCell(CQCoordSys * pCoordObj):m_cMoveOff(0.8)
  30. {
  31. m_ptBegin = CQPoint(0.0f,0.0f);    // 单元格的起点坐标
  32. m_ptEnd = CQPoint(0.0f,0.0f);
  33. m_ptText = CQPoint(0.0f,0.0f);
  34.     m_pObjLabel = NULL;                // 单元格中的值对象 
  35. //CQLineObj * m_pGridLine;         // 网格线对象指针
  36. m_fCellWidth = 0.0f;               // 指定列的宽
  37. m_fCellHeight = 0.0f;              // 本行单元格的高
  38. m_nHAllignFormat = 0;              // 水平对齐方式0-左对齐1-居中2-右对齐
  39.     m_nVAllignFormat = 1;              // 垂直对齐方式0-靠上 1-居中 2-靠下 
  40. m_nMergeCellRows = 0;              // 合并的单元格的行数
  41. m_nMergeCellCols = 0;              // 合并的单元格的列数
  42. m_bCellMerge = FALSE;              // 是否为合并单元格
  43. m_szCellText = "";
  44. if(!pCoordObj) return;
  45. m_pCoordObj = pCoordObj;           // 获取当前工程坐标系统对象的指针
  46. }
  47. CQReadExcelCell::~CQReadExcelCell()
  48. {
  49. }
  50. LOGFONT CQReadExcelCell::GetCellTextfont()
  51. {
  52. return m_CellFont;
  53. }
  54. COLORREF CQReadExcelCell::GetCellTextColor()
  55. {
  56. return m_crCellColor;
  57. }
  58. float CQReadExcelCell::GetCellTextFontSize()
  59. {
  60. return m_fCellFontSize;
  61. }
  62. void CQReadExcelCell::MakeCellNextRowPt(CQPoint & ptNext,float fRowHeight,long nMergeRows,CQCoordSys * pCoordObj /* = NULL */)
  63. {
  64. if(!pCoordObj && !m_pCoordObj)
  65. return;
  66. if(pCoordObj != NULL)
  67. {
  68. CQPoint ptNewBegin = m_ptBegin;
  69. if(nMergeRows == 0)
  70. nMergeRows = 1;
  71. double dy = ptNewBegin.GetY();
  72. dy -= pCoordObj->MMtoWL(fRowHeight*nMergeRows);
  73. ptNewBegin.SetY(dy);
  74. ptNext = ptNewBegin;
  75. }
  76. else if(m_pCoordObj)
  77. {
  78. CQPoint ptNewBegin = m_ptBegin;
  79. if(nMergeRows == 0)
  80. nMergeRows = 1;
  81. double dy = ptNewBegin.GetY();
  82. dy -= m_pCoordObj->MMtoWL(fRowHeight*nMergeRows);
  83. ptNewBegin.SetY(dy);
  84. ptNext = ptNewBegin;
  85. }
  86. }
  87. void CQReadExcelCell::MakeCellNextColPt(CQPoint & ptNext,float fColWidth,long nMergeCols,CQCoordSys * pCoordObj /* = NULL */)
  88. {
  89. if(!pCoordObj && !m_pCoordObj)
  90. return;
  91. if(pCoordObj != NULL)
  92. {
  93. CQPoint ptNextCol = m_ptBegin;
  94. if(nMergeCols == 0)
  95. nMergeCols = 1;
  96. double dx = ptNextCol.GetX();
  97. dx += pCoordObj->MMtoWL(nMergeCols*fColWidth);
  98. ptNextCol.SetX(dx);
  99. ptNext = ptNextCol;
  100. }
  101. else if(m_pCoordObj)
  102. {
  103. CQPoint ptNextCol = m_ptBegin;
  104. if(nMergeCols == 0)
  105. nMergeCols = 1;
  106. double dx = ptNextCol.GetX();
  107. dx += pCoordObj->MMtoWL(nMergeCols*fColWidth);
  108. ptNextCol.SetX(dx); ptNext = ptNextCol;
  109. }
  110. }
  111. CQReadExcelCell & CQReadExcelCell::operator=(CQReadExcelCell & ReadExcel)
  112. {
  113. if(&ReadExcel == this)
  114. return *this;
  115. m_CellFont = ReadExcel.GetCellTextfont();
  116. m_crCellColor = ReadExcel.GetCellTextColor();
  117. m_fCellFontSize = ReadExcel.GetCellTextFontSize();
  118. m_fCellHeight = ReadExcel.GetCellHeight();
  119. m_fCellWidth = ReadExcel.GetCellWidth();
  120. m_nHAllignFormat = ReadExcel.GetCellHAllignFormat("");
  121. m_nVAllignFormat = ReadExcel.GetCellVAllignFormat("");
  122. m_nMergeCellCols = ReadExcel.GetMergeCols();
  123. m_nMergeCellRows = ReadExcel.GetMergeRows();
  124. m_pCoordObj = ReadExcel.m_pCoordObj;
  125. ReadExcel.GetCellBeginPt(m_ptBegin);
  126. m_szCellText = ReadExcel.GetCellText();
  127. m_bCellMerge = ReadExcel.IsCellMerge();
  128. InitCell(m_ptBegin,m_szCellText,m_fCellHeight,m_fCellWidth,m_bCellMerge
  129. ,m_nMergeCellRows,m_nMergeCellCols,m_nHAllignFormat,m_nVAllignFormat
  130. ,m_CellFont,m_crCellColor,m_fCellFontSize,m_pCoordObj);
  131. return *this;
  132. }
  133. BOOL CQReadExcelCell::SetCoordSys(CQCoordSys * pCoordObj)
  134. {
  135. if(!pCoordObj)return FALSE;
  136. m_pCoordObj = pCoordObj;
  137. return TRUE;
  138. }
  139. void CQReadExcelCell::InitCell(CQPoint ptBegin,CString szText,float fRowHeight,float fColWidth,
  140.  BOOL bCellMegre,long nMergeRows,long nMergeCols,BYTE nHAllignFormat,
  141.  BYTE nVAlligFormat,LOGFONT font,
  142.  COLORREF crFont,float fFontSize,CQCoordSys * pCoodObj)
  143. {
  144. if(pCoodObj != NULL)
  145. m_pCoordObj = pCoodObj;
  146. m_ptBegin = ptBegin;
  147. m_szCellText = szText;
  148. //由Excel的磅值单位转换为毫米单位好进行计算 
  149. //在系统外面改过了
  150. /*m_fCellWidth = static_cast<float>(CGeoGlobalFunction::ConvertFontPttoMM(fColWidth));
  151. m_fCellHeight = static_cast<float>(CGeoGlobalFunction::ConvertFontPttoMM(fRowHeight)); */
  152. m_fCellHeight = fRowHeight;
  153. m_fCellWidth = fColWidth;
  154. m_bCellMerge = bCellMegre; // 合并单元格的属性
  155. m_nMergeCellCols = nMergeCols;
  156. m_nMergeCellRows = nMergeRows; // 合并单元格的行数和列数
  157. m_nHAllignFormat = nHAllignFormat;
  158. m_nVAllignFormat = nVAlligFormat;
  159. m_CellFont = font;       // 文本字体
  160. m_crCellColor = crFont;  // 字体颜色
  161. m_fCellFontSize = fFontSize; //字号
  162. m_pObjLabel = new CQTextObj;
  163. if(!m_pObjLabel)return;
  164. LOGFONT lFont = m_pObjLabel->GetFont();
  165. strcpy((char *)lFont.lfFaceName,"黑体"); //设置字体
  166. m_pObjLabel->SetText(szText);
  167. m_szCellText = szText;
  168. if(nMergeCols == 0)
  169. nMergeCols = 1;
  170. double fTextWidth = static_cast<double>(fColWidth*nMergeCols);
  171. m_pObjLabel->SetFont(lFont);
  172. if(m_fCellFontSize == 0) m_fCellFontSize = 12; //Excel中默认为12
  173. m_pObjLabel->SetFontSize(m_fCellFontSize); 
  174. fTextWidth = m_pCoordObj->MMtoWL(fTextWidth-2);
  175. m_pObjLabel->SetRowWidth(fTextWidth,m_pCoordObj);
  176. m_pObjLabel->SetObjPenColor(m_crCellColor); // 设置画笔颜色
  177. }
  178. void CQReadExcelCell::GetCellBeginPt(double & dx,double & dy)
  179. {
  180. dx = m_ptBegin.GetX();
  181. dy = m_ptBegin.GetY();
  182. }
  183. //获取起始点的坐标
  184. void CQReadExcelCell::GetCellBeginPt(CQPoint & pt)
  185. {
  186. pt.SetX(m_ptBegin.GetX());
  187. pt.SetY(m_ptBegin.GetY());
  188. }
  189. // 获取水平对齐方式
  190. BYTE CQReadExcelCell::GetCellHAllignFormat(CString szHAllign)
  191. {
  192. // 默认为左对齐
  193. if(m_nHAllignFormat<0 || m_nHAllignFormat>2) m_nHAllignFormat = 0; 
  194. if(szHAllign == "")
  195. return m_nHAllignFormat;
  196. switch(m_nHAllignFormat)
  197. {
  198. case 0:
  199. {
  200. szHAllign = _T("左对齐");
  201. break;
  202. }
  203. case 1:
  204. {
  205. szHAllign = _T("居中");
  206. break;
  207. }
  208. case 2:
  209. {
  210. szHAllign = _T("右对齐");
  211. break;
  212. }
  213. default:
  214. {
  215. szHAllign = _T("左对齐");
  216. break;
  217. }
  218. }
  219. return m_nHAllignFormat;
  220. }
  221. // 获取垂直对齐方式
  222. BYTE CQReadExcelCell::GetCellVAllignFormat(CString szVAllign)
  223. {
  224. // 默认为居中
  225. if(m_nVAllignFormat<0 || m_nVAllignFormat>2) m_nVAllignFormat = 1; 
  226. if(szVAllign == "")
  227. return m_nVAllignFormat;
  228. switch(m_nHAllignFormat)
  229. {
  230. case 0:
  231. {
  232. szVAllign = _T("左对齐");
  233. break;
  234. }
  235. case 1:
  236. {
  237. szVAllign = _T("居中");
  238. break;
  239. }
  240. case 2:
  241. {
  242. szVAllign = _T("右对齐");
  243. break;
  244. }
  245. default:
  246. {
  247. szVAllign = _T("左对齐");
  248. break;
  249. }
  250. }
  251. return m_nVAllignFormat;
  252. }
  253. // 获取单元格的高
  254. float CQReadExcelCell::GetCellHeight()
  255. {
  256. return m_fCellHeight;
  257. }
  258. // 获取单元格的宽
  259. float CQReadExcelCell::GetCellWidth()
  260. {
  261. return m_fCellWidth;
  262. }
  263. // 获取合并单元格的列数
  264. long CQReadExcelCell::GetMergeCols()
  265. {
  266. return m_nMergeCellCols;
  267. }
  268. //获取合并单元格的行数
  269. long CQReadExcelCell::GetMergeRows()
  270. {
  271. return m_nMergeCellRows;
  272. }
  273. // 获取单元格是否合并
  274. BOOL CQReadExcelCell::IsCellMerge()
  275. {
  276. return m_bCellMerge?TRUE:FALSE;
  277. }
  278. //设置文本的字体信息
  279. void CQReadExcelCell::SetLabelFont(LOGFONT lFont)
  280. {
  281. m_CellFont = lFont;
  282. if(m_pObjLabel && m_pCoordObj)
  283. m_pObjLabel->SetFont(lFont);
  284. }
  285. //设置文本的大小
  286. void CQReadExcelCell::SetLabelPtSize(float fSize)
  287. {
  288. m_fCellFontSize = fSize;
  289. if(m_fCellFontSize == 0)
  290. m_fCellFontSize = 12.0f;
  291. if(m_pCoordObj && m_pObjLabel)
  292. m_pObjLabel->SetFontSize(m_fCellFontSize);
  293. }
  294. //设置字体颜色
  295. void CQReadExcelCell::SetLabelColor(COLORREF lbCr)
  296. {
  297. m_crCellColor = lbCr;
  298. if(m_pCoordObj && m_pObjLabel)
  299. m_pObjLabel->SetObjPenColor(m_crCellColor);
  300. }
  301. //设置文本内容
  302. void CQReadExcelCell::SetLabelText(CString szText)
  303. {
  304. m_szCellText = szText;
  305. if(m_pObjLabel)
  306. m_pObjLabel->SetText(m_szCellText);
  307. }
  308. //获取文本对象 
  309. CQTextObj * CQReadExcelCell::GetCellLabelObj()
  310. {
  311. if(m_pObjLabel)
  312. return m_pObjLabel;
  313. else
  314. return NULL;
  315. }
  316. //获取文本对象的内容
  317. CString CQReadExcelCell::GetCellText()
  318. {
  319. if(m_pObjLabel)
  320. return m_pObjLabel->GetText();
  321. else
  322. return m_szCellText;
  323. }
  324. //计算单元格结束点的坐标
  325. void CQReadExcelCell::CalCellEndPt(float fRowHeight,float fColWidth,long lMergeRows,long lMergeCols,CQCoordSys * pCoordObj /* = NULL */)
  326. {
  327. if(!pCoordObj && !m_pCoordObj)
  328. return;
  329. if(lMergeCols == 0)
  330. lMergeCols = 1;
  331. if(lMergeRows == 0)
  332. lMergeRows = 1;
  333. CQPoint ptEnd;
  334. if(pCoordObj != NULL)
  335. {
  336.  double dx = m_ptBegin.GetX() + pCoordObj->MMtoWL(fColWidth*lMergeCols);
  337.  double dy = m_ptBegin.GetY() - pCoordObj->MMtoWL(fRowHeight*lMergeRows);
  338.  ptEnd.SetPoint(dx,dy);
  339.  m_ptEnd = ptEnd;
  340. }
  341. else if(m_pCoordObj)
  342. {
  343. double dx = m_ptBegin.GetX() + pCoordObj->MMtoWL(fColWidth*lMergeCols);
  344. double dy = m_ptBegin.GetY() - pCoordObj->MMtoWL(fRowHeight*lMergeRows);
  345. ptEnd.SetPoint(dx,dy);
  346. m_ptEnd = ptEnd;
  347. }
  348. }
  349. // 根据水平对齐方式设置文本的X坐标
  350. void CQReadExcelCell::MakeCellXPt(CQPoint & ptBeign,BYTE nHAllignFormat,float fColWidth,long nMergeCols,CQCoordSys * pCoordObj)
  351. {
  352. //if(!m_pObjLabel) return; // 假如标住对象不存在就退出
  353. if(nHAllignFormat<0 || nHAllignFormat>2) nHAllignFormat = 0; //默认为左对齐
  354. if(!m_pCoordObj) return;
  355. if(fColWidth == 0)
  356. fColWidth = m_fCellWidth;
  357. if(nMergeCols == 0)
  358. nMergeCols = 1;
  359. double ddx = 0.0f;
  360. switch(nHAllignFormat)
  361. {
  362. case 0: //左对齐
  363. {
  364. ddx += pCoordObj->MMtoWL(m_cMoveOff); // 偏移0.8MM
  365. double dx = ptBeign.GetX();
  366. dx += ddx;
  367. ptBeign.SetX(dx);
  368. break;
  369. }
  370. case 1: //居中
  371. {
  372. CBoundaryRect bRect;
  373. m_pObjLabel->CalculateBoundary(&bRect);
  374. double dRectWidth = bRect.Width();
  375. double dNewX = ptBeign.GetX() + (pCoordObj->MMtoWL(fColWidth*nMergeCols)-dRectWidth)/2.0;
  376. ptBeign.SetX(dNewX);
  377. break;
  378. }
  379. case 2://右对齐
  380. {
  381. ddx += pCoordObj->MMtoWL(fColWidth*nMergeCols); //MMToWL
  382. ddx -= pCoordObj->MMtoWL(m_cMoveOff);
  383. double dx = ptBeign.GetX();
  384. dx += ddx;
  385. ptBeign.SetX(dx);
  386. break;
  387. }
  388. }
  389. }
  390. // 根据垂直对齐方式设置文本的Y坐标
  391. void CQReadExcelCell::MakeCellYPt(CQPoint &ptBeign,BYTE nVAllignFormat,float fRowHeight,long nMergeRows,CQCoordSys * pCoordObj)
  392. {
  393. //if(!m_pObjLabel) return; // 假如标住对象不存在就退出
  394. //默认为靠下
  395. if(nVAllignFormat<0 || nVAllignFormat>2) nVAllignFormat = 0; 
  396. if(!m_pCoordObj) return;
  397. if(fRowHeight == 0)
  398. fRowHeight = m_fCellHeight;
  399. if(nMergeRows == 0)
  400.         nMergeRows = 1;
  401. switch(nVAllignFormat)
  402. {
  403. case 0: //靠上
  404. {
  405. double dy = ptBeign.GetY();
  406. dy -= pCoordObj->MMtoWL(m_cMoveOff); // 偏移0.8MM
  407. ptBeign.SetY(dy);
  408. break;
  409. }
  410. case 1: //居中
  411. {
  412. CBoundaryRect bRect;
  413. m_pObjLabel->CalculateBoundary(&bRect);
  414. double dRectHeight = bRect.Height();
  415. double dNewY = ptBeign.GetY() - pCoordObj->MMtoWL(fRowHeight*nMergeRows) + (pCoordObj->MMtoWL(fRowHeight*nMergeRows)-dRectHeight)/2.0;
  416. ptBeign.SetY(dNewY);
  417. break;
  418. }
  419. case 2://靠下
  420. {
  421. double dx = ptBeign.GetX();
  422. double dy = ptBeign.GetY();
  423. dx -= pCoordObj->MMtoWL(fRowHeight*nMergeRows); //MMToWL
  424. dy += pCoordObj->MMtoWL(m_cMoveOff);
  425. ptBeign.SetPoint(dx,dy);
  426. break;
  427. }
  428. }
  429. }
  430. // 计算文本的正确起点位置 
  431. // 这也是一个关键的函数
  432. //靠上、靠下、左对齐、右对齐均设计为0.8毫米 不理想的话可以在调整
  433. void CQReadExcelCell::CalTextPtCoord()
  434. {
  435. if(!m_pObjLabel) return;
  436. m_ptText = m_ptBegin;
  437. MakeCellXPt(m_ptText,m_nHAllignFormat,m_fCellWidth,m_nMergeCellCols,m_pCoordObj);
  438. MakeCellYPt(m_ptText,m_nVAllignFormat,m_fCellHeight,m_nMergeCellRows,m_pCoordObj);
  439. m_pObjLabel->SetPos(m_ptText);
  440. }
  441. //***********************************************************
  442. //****** QQ添加代码 实现读入Excel        ******
  443. //******     2007-10-22    ******
  444. //***********************************************************
  445. CQReadExcelToView::CQReadExcelToView(CQMapObj * pMap,CQCoordSys * pCoordObj,CQPoint ptBegin)
  446. {
  447. if(!pMap) return;
  448. if(!pCoordObj)return;
  449. m_pMap = pMap;            // 获取工程的当前图幅
  450. m_pCoordObj = pCoordObj;  // 获取当前工程的坐标系统对象
  451. m_fColWidth = 0.0f;               // 指定列的宽
  452. m_fRowHeight = 0.0f;              // 指定行的高
  453. m_nRowCount = 0;                 // 记录行数
  454. m_nColCount = 0;                 // 记录列数
  455. m_nStartCol = m_nStartRow = 0;
  456. m_ptBegin = ptBegin;
  457. m_pCurNewLayer = NULL;
  458. }
  459. CQReadExcelToView::~CQReadExcelToView()
  460. {
  461. if(!m_pExcelApp) return;
  462. m_ExcelBook.Close(); 
  463. m_ColRange.ReleaseDispatch();
  464. m_RowRange.ReleaseDispatch();
  465. m_myallrange.ReleaseDispatch();
  466. m_UsedRange.ReleaseDispatch();
  467. m_workSheet.ReleaseDispatch();
  468. m_ExcelSheet.ReleaseDispatch();
  469. m_workBook.ReleaseDispatch();
  470. m_ExcelBook.ReleaseDispatch();
  471. m_pExcelApp->ReleaseDispatch();
  472. m_pExcelApp->Quit();
  473. delete m_pExcelApp;
  474. m_pExcelApp = NULL;
  475. }
  476. BOOL CQReadExcelToView::InitExcel()
  477. {
  478. //初始化COM的动态连接库   
  479. m_pExcelApp = new _Application;
  480. BOOL bIsSuccess = m_pExcelApp->CreateDispatch("excel.application");
  481. if (!bIsSuccess)
  482. {
  483. AfxMessageBox("系统中未安装office软件, 无法写入EXCEL文件!",MB_OK);
  484. return FALSE;
  485. }
  486. //m_pExcelApp->SetVisible(TRUE);
  487. //m_pExcelApp->SetUserControl(TRUE);
  488. return TRUE;
  489. }
  490. //计算下一行的起点
  491. void CQReadExcelToView::MakeNextRowStartPt(CQPoint & ptNext,CQPoint & ptPre,float fRowHeight,long nMergeRows,CQCoordSys * pCoordObj)
  492. {
  493. if(!pCoordObj && !m_pCoordObj)
  494. return;
  495. if(nMergeRows == 0)
  496. nMergeRows = 1;
  497. if(pCoordObj)
  498. {
  499. double dx = 0,dy = 0;
  500. dy = ptPre.GetY() - pCoordObj->MMtoWL(fRowHeight*nMergeRows);
  501. dx = ptPre.GetX();
  502. ptNext.SetPoint(dx,dy);
  503. }
  504. else
  505. {
  506. double dx = 0,dy = 0;
  507. dy = ptPre.GetY() - m_pCoordObj->MMtoWL(fRowHeight*nMergeRows);
  508. dx = ptPre.GetX();
  509. ptNext.SetPoint(dx,dy);
  510. }
  511. }
  512. //获取指定单元格的值
  513. CString CQReadExcelToView::GetExcelCellValue(Range & geoRange,long nRowIndex,long nColIndex)
  514. {
  515. CString szResult = "";
  516. try
  517. {
  518. Range cellRange,IndexCell;
  519. cellRange.AttachDispatch(geoRange.GetCells());
  520. IndexCell.AttachDispatch(cellRange.GetItem(COleVariant(nRowIndex),COleVariant(nColIndex)).pdispVal);
  521. COleVariant  vResult = IndexCell.GetValue();  
  522. CString    str;   
  523. if(vResult.vt == VT_BSTR)                //字符串   
  524. {   
  525. str=vResult.bstrVal;   
  526. }   
  527. else if(vResult.vt == VT_R8)            //8字节的数字     
  528. {   
  529. str.Format("%.2f",vResult.dblVal);   
  530. }   
  531. else if(vResult.vt == VT_DATE)          //时间格式   
  532. {   
  533. str.Format("%.2f",vResult.date);
  534. }   
  535. else if(vResult.vt == VT_EMPTY)        //单元格空的   
  536. {   
  537. }       
  538. szResult = str;
  539. cellRange.ReleaseDispatch();
  540. IndexCell.ReleaseDispatch();
  541. }
  542. catch (_com_error err)
  543. {
  544. CString szErr;
  545. szErr.Format("读取第%l行,第%l列单元格值出现错误!");
  546. szErr += CString(err.ErrorMessage());
  547. AfxMessageBox(szErr);
  548. return CString("");
  549. }
  550. return szResult;
  551. }
  552. //获取单元格水平对齐格式
  553. BYTE CQReadExcelToView::GetHAllignFormat(Range & geoRange,long nRowIndex,long nColIndex)
  554. {
  555. BYTE nHAllignformat = 0;
  556. try
  557. {
  558. Range cellRange,IndexCell;
  559. cellRange.AttachDispatch(geoRange.GetCells());
  560. IndexCell.AttachDispatch(cellRange.GetItem(COleVariant(nRowIndex),COleVariant(nColIndex)).pdispVal);
  561. COleVariant  vResult;
  562. vResult.lVal = 0;
  563. vResult = IndexCell.GetHorizontalAlignment(); //获取水平对齐方式
  564. if(vResult.lVal!=0)   
  565. {   
  566. switch(vResult.lVal)   
  567. {   
  568. case  1:              //默认  
  569. {
  570. nHAllignformat = 1;  //默认为居中
  571. break;
  572. }
  573. case  -4108:          //居中 
  574. {
  575. nHAllignformat = 1;
  576. break;
  577. }
  578. case  -4131:          //靠左   
  579. {
  580. nHAllignformat = 0;
  581. break;
  582. }
  583. case  -4152:          //靠右   
  584. {
  585. nHAllignformat = 2;
  586. break;
  587. }
  588. }   
  589. }   
  590. cellRange.ReleaseDispatch();
  591. IndexCell.ReleaseDispatch();
  592. }
  593. catch (_com_error err)
  594. {
  595. CString szErr;
  596. szErr.Format("读取第%l行,第%l列单元格值出现错误!");
  597. szErr += CString(err.ErrorMessage());
  598. AfxMessageBox(szErr);
  599. return 0;
  600. }
  601. return nHAllignformat;
  602. }
  603. //获取单元格垂直对齐格式
  604. BYTE CQReadExcelToView::GetVAllignFormat(Range & geoRange,long nRowIndex,long nColIndex)
  605. {
  606. BYTE nVAllignFormat = 1;
  607. try
  608. {
  609. Range cellRange,IndexCell;
  610. cellRange.AttachDispatch(geoRange.GetCells());
  611. IndexCell.AttachDispatch(cellRange.GetItem(COleVariant(nRowIndex),COleVariant(nColIndex)).pdispVal);
  612. COleVariant  vResult;
  613. vResult.lVal = 0;
  614. vResult = IndexCell.GetVerticalAlignment(); //获取垂直对齐方式
  615. if(vResult.lVal!=0)   
  616. {   
  617. switch(vResult.lVal)   
  618. {   
  619. case  -4160:          //靠上 
  620. {
  621. nVAllignFormat = 0;
  622. break;
  623. }
  624. case  -4108:          //居中   
  625. {
  626. nVAllignFormat = 1;
  627. break;
  628. }
  629. case  -4107:          //靠下   
  630. {
  631. nVAllignFormat = 2;
  632. break;
  633. }
  634. default:
  635. {
  636. nVAllignFormat = 1;
  637. break;
  638. }
  639. }   
  640. }   
  641. cellRange.ReleaseDispatch();
  642. IndexCell.ReleaseDispatch();
  643. }
  644. catch (_com_error err)
  645. {
  646. CString szErr;
  647. szErr.Format("读取第%l行,第%l列单元格值出现错误!");
  648. szErr += CString(err.ErrorMessage());
  649. AfxMessageBox(szErr);
  650. return 0;
  651. }
  652. return nVAllignFormat;
  653. }
  654. //获取合并单元格的情况 
  655. //long & nMergeRows,long & nMergeCols是出口参数 获取合并单元格的行列数
  656. //long & nMergeStartRow,long & nMergeStartCol 返回合并单元格的起始行、列号
  657. //合并单元格的函数要重写
  658. BOOL CQReadExcelToView::GetMergeCellFormat(Range & geoRange,long nRowIndex,long nColIndex,long & nMergerows,long & nMergeCols,long & nMergeStartRow,long &nMergeStartCol)
  659. {
  660. BOOL bMerge = FALSE;
  661. try
  662. {
  663. Range cellRange,IndexCell,UnionRange;
  664. cellRange.AttachDispatch(geoRange.GetCells());
  665. IndexCell.AttachDispatch(cellRange.GetItem(COleVariant(nRowIndex)
  666. ,COleVariant(nColIndex)).pdispVal);
  667. UnionRange.AttachDispatch(IndexCell.GetMergeArea());
  668. int nColTimes = 0;
  669. Range rangeRow,rangeCol;
  670. COleVariant vResult = UnionRange.GetMergeCells(); //获取合并单元格属性
  671. if(vResult.boolVal == 0)
  672. {
  673. bMerge = FALSE;
  674. nMergeCols = nMergerows = 0;
  675. nMergeStartRow = nMergeStartCol = -1;
  676. return FALSE;
  677. }
  678. else
  679. {
  680. long nColMerges = 0,nRowMerges = 0;
  681. rangeRow.AttachDispatch(UnionRange.GetRows());
  682. rangeCol.AttachDispatch(UnionRange.GetColumns());
  683. nMergeStartRow = rangeRow.GetRow();    //获取合并单元格的起始行
  684. nMergeStartCol = rangeCol.GetColumn(); //获取合并单元格的起始列
  685. nRowMerges = rangeRow.GetCount();      //获取合并单元格的行数
  686. nColMerges = rangeCol.GetCount();      //获取合并单元格的列数
  687. int nMergeVtSize = m_stMergeVector.size();
  688. //判断该信息单元格是否处于其他合并单元格中
  689. //因为列合并已经跳过去了
  690. //所以在这里对行情况进行处理
  691. BOOL BInMergeCell = FALSE;
  692. for(int mm=0;mm<nMergeVtSize;mm++)
  693. {
  694. if((nRowIndex>= m_stMergeVector[mm].st_StartRow && 
  695. nRowIndex<(m_stMergeVector[mm].st_StartRow +
  696. m_stMergeVector[mm].st_MergeRows)) && 
  697. (nColIndex>= m_stMergeVector[mm].st_StartCol &&
  698. nColIndex<(m_stMergeVector[mm].st_StartCol+
  699. m_stMergeVector[mm].st_MergeCols)))
  700. {
  701. BInMergeCell = TRUE;
  702. nColMerges = m_stMergeVector[mm].st_MergeCols;
  703. nRowMerges = 1;
  704. m_stPt.st_bMerge = TRUE;
  705. if(nColIndex == 1)
  706. {
  707. m_stEachFirRow.st_lMergeCols = nColMerges;
  708. m_stEachFirRow.st_lMergeRows = 1;
  709. }
  710. break;
  711. }
  712. }
  713. if(!BInMergeCell)
  714. {
  715. m_stMergeInfo.st_StartRow = nMergeStartRow;  //记录合并单元格的开始的行号
  716. m_stMergeInfo.st_StartCol = nMergeStartCol;  
  717. m_stMergeInfo.st_MergeRows = nRowMerges;
  718. m_stMergeInfo.st_MergeCols = nColMerges;
  719. m_stMergeVector.push_back(m_stMergeInfo);
  720. }
  721. if(nColIndex == 1)  //假如是第一列
  722. {
  723. m_stEachFirRow.st_lMergeCols = nColMerges;
  724. m_stEachFirRow.st_lMergeRows = nRowMerges;
  725. }
  726. nMergerows = nRowMerges;
  727. nMergeCols = nColMerges;
  728. bMerge = TRUE;
  729. rangeRow.ReleaseDispatch();
  730. rangeCol.ReleaseDispatch();
  731. }
  732. rangeRow.ReleaseDispatch();
  733. rangeCol.ReleaseDispatch();
  734. UnionRange.ReleaseDispatch();
  735. cellRange.ReleaseDispatch();
  736. IndexCell.ReleaseDispatch();
  737. }
  738. catch (_com_error err)
  739. {
  740. CString szErr;
  741. szErr.Format("读取第%l行,第%l列单元格值出现错误!");
  742. szErr += CString(err.ErrorMessage());
  743. AfxMessageBox(szErr);
  744. return FALSE;
  745. }
  746. return bMerge;
  747. }
  748. //行高: 1Uint = 0.351MM
  749. double CQReadExcelToView::ExcelRowUintToMM(float fRowHeight)//将Excel的行高单位转换为毫米
  750. {
  751. return fRowHeight*ROWEXCELTOMM;
  752. }
  753. //1个单位=0.3612毫米  
  754. //列宽: Excel 1Uint = 2.387MM
  755. double CQReadExcelToView::ExcelColUintToMM(float fColWidth)  //将Excel的列宽单位转换为毫米
  756. {
  757. return fColWidth*COLEXCELTOMM;
  758. }
  759. //获取单元格的字体、行宽、列高
  760. void CQReadExcelToView::GetCellFont(Range & geoRange,long nRowIndex,long nColIndex,float & fColWidth,float & fRowHeight)
  761. {
  762. try
  763. {
  764. Range cellRange,IndexCell;
  765. cellRange.AttachDispatch(geoRange.GetCells());
  766. IndexCell.AttachDispatch(cellRange.GetItem(COleVariant(nRowIndex),COleVariant(nColIndex)).pdispVal);
  767. COleVariant vResult;
  768. vResult.fltVal = 0.0f;
  769. vResult = IndexCell.GetColumnWidth(); //获取列宽
  770. fColWidth = static_cast<float>(vResult.dblVal);
  771. vResult = IndexCell.GetRowHeight();   //获取行高
  772. fRowHeight = static_cast<float>(vResult.dblVal);          //获取的是磅值
  773. cellRange.ReleaseDispatch();
  774. IndexCell.ReleaseDispatch();
  775. }
  776. catch (_com_error err)
  777. {
  778. CString szErr;
  779. szErr.Format("读取第%l行,第%l列单元格值出现错误!");
  780. szErr += CString(err.ErrorMessage());
  781. AfxMessageBox(szErr);
  782. return;
  783. }
  784. }
  785. //从电脑磁盘读取指定的Excel文件,并对对应的数据结构进行
  786. BOOL CQReadExcelToView::ReadExcelFromPC()
  787. {
  788. if(InitExcel()==FALSE) return FALSE;
  789. COleVariant vtOptional((long)DISP_E_PARAMNOTFOUND,
  790. VT_ERROR),vtTrue((short)TRUE),vtFalse((short)FALSE);
  791. LPDISPATCH  lpDisp;   //OLE变量用于读取Excel文件
  792. //在磁盘找出要导入的Excel文件
  793. CFileDialog fd(TRUE,"xls","XLS",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
  794. "EXCEL FILES (*.xls)|*.xls|ALL FILES (*.*)|(*.*)||",NULL);
  795. if (fd.DoModal()!=IDOK) return FALSE;
  796. CString szExcelFileName = fd.GetPathName();
  797. if(szExcelFileName.IsEmpty()) 
  798. {
  799. AfxMessageBox("获取的Excel文件名为空");
  800. return FALSE;
  801. }
  802. //打开Excel文件
  803. try
  804. {
  805. m_ExcelBook = m_pExcelApp->GetWorkbooks();
  806. lpDisp = m_ExcelBook.Open(LPCTSTR(szExcelFileName),vtOptional,vtOptional,vtOptional,vtOptional
  807. ,vtOptional,vtOptional,vtOptional,vtOptional,vtOptional,vtOptional,vtOptional,vtOptional);
  808. }
  809. catch(_com_error comerr)
  810. {
  811. CString szEror = CString(comerr.ErrorMessage());
  812. AfxMessageBox(szEror);
  813. m_pExcelApp->ReleaseDispatch();
  814. m_pExcelApp->Quit();
  815. delete m_pExcelApp;
  816. m_pExcelApp = NULL;
  817. return FALSE;
  818. }
  819. static int nLayerNum = 0;
  820. m_pCurNewLayer = new CQLayerObj;
  821. CString szLayerName = "导入Excel数据表层";
  822. CString szTimes;
  823. szTimes.Format("%d",nLayerNum++);
  824. szLayerName+=szTimes;
  825. m_pCurNewLayer->SetLayerName(szLayerName);       //设置图层名称
  826. //设置图层描述
  827. m_pCurNewLayer->SetLayerDis("导入Excel数据表层");
  828. try
  829. {
  830. m_workBook.AttachDispatch(lpDisp);
  831. //m_workBook.AttachDispatch(m_ExcelBook.GetItem(COleVariant((long)1)));
  832. //m_ExcelSheet.AttachDispatch(m_workBook.GetWorksheets()); // 需要手动释放 
  833. lpDisp = m_workBook.GetSheets();
  834. m_workSheet.AttachDispatch(lpDisp);
  835. //lpDisp = m_ExcelSheet.GetItem(COleVariant((long)1));
  836. lpDisp = m_workBook.GetActiveSheet();  // 获取活跃的单元格
  837. m_workSheet.AttachDispatch(lpDisp);    // 连接上
  838. //读取已经使用区域的信息,包括已经使用的行数、列数、起始行、起始列
  839. //m_UsedRange.AttachDispatch(m_workSheet.GetUsedRange()); //获取已经使用的区域信息
  840. m_UsedRange.AttachDispatch(m_workSheet.GetUsedRange());
  841. m_RowRange.AttachDispatch(m_UsedRange.GetRows());
  842. m_nRowCount = m_RowRange.GetCount();   // 获取已经使用过的单元格的行数
  843. m_ColRange.AttachDispatch(m_UsedRange.GetColumns());
  844. m_nColCount = m_ColRange.GetCount();   // 获取已经使用过的单元格的列数
  845. if((m_nColCount == m_nRowCount) && (m_nColCount == 0))return FALSE;
  846. long lStartRow = m_UsedRange.GetRow();
  847. long lStartCol = m_UsedRange.GetColumn();  //获取起始的行号和列号
  848. CQPoint ptText,ptRow = m_ptBegin,ptNext = m_ptBegin;
  849. long nMergeColNum = 0;                     //合并单元格后
  850. BOOL BInMergeCell = FALSE;
  851. //每行首列元素的初始化
  852. m_stEachFirRow.st_ptBeginFirst = m_ptBegin;
  853. m_stEachFirRow.st_lMergeCols = 0;
  854. m_stEachFirRow.st_lMergeRows = 0;
  855. //现在开始获取整个使用过的表单中的单元格的值
  856. for(long i=lStartRow;i<m_nRowCount+lStartRow;i++)     // 行循环过程
  857. {
  858. long nMergeRows = 0,nMergeCols = 0,nMergeStartRow,nMergetStartCol;
  859. float fRowHeight = 0,fColWidth = 0;
  860. ptRow.SetY(ptNext.GetY());
  861. for(long j=lStartCol;j<m_nColCount+lStartCol;) // 列循环过程
  862. {
  863. CString szText = _T("");
  864. szText = GetExcelCellValue(m_UsedRange,i,j); //分别获取单元格内的值
  865. BYTE hAllign = 0; //默认给它个左对齐
  866. hAllign = GetHAllignFormat(m_UsedRange,i,j); //获取单元格的水平对齐方式
  867. BYTE vAllign = 1; 
  868. vAllign = GetVAllignFormat(m_UsedRange,i,j); //获取单元格的垂直对齐方式
  869. //获取了行宽和列高 用来计算每个单元格的起点(在世界坐标下面)
  870. GetCellFont(m_UsedRange,i,j,fColWidth,fRowHeight);
  871. if(j == 1)
  872. {
  873. m_stEachFirRow.st_lFirRowHeight = fRowHeight; //行高设置
  874. m_stEachFirRow.st_lFirColWidth = fColWidth;   //列宽设置
  875. }
  876. fColWidth = static_cast<float>(ExcelColUintToMM(fColWidth));     //列宽
  877. fRowHeight = static_cast<float>(ExcelRowUintToMM(fRowHeight));   //行高的单位转换
  878. BOOL bMerge = FALSE;
  879. bMerge = GetMergeCellFormat(m_UsedRange,i,j,nMergeRows,nMergeCols,nMergeStartRow,nMergetStartCol);
  880. //在这里获取了合并合并单元格的信息
  881. LOGFONT lfont;
  882. strcpy((char *)lfont.lfFaceName,"黑体");
  883. m_curCell.SetCoordSys(m_pCoordObj);
  884. if(i == 1 && j == 1)
  885. {
  886. m_curCell.InitCell(m_ptBegin,szText,fRowHeight,fColWidth,bMerge,nMergeRows,nMergeCols
  887. ,hAllign,vAllign,lfont,RGB(76,76,76),12,m_pCoordObj);
  888. m_curCell.CalTextPtCoord();
  889. }
  890. else
  891. {
  892. ptText = ptNext;
  893. m_curCell.InitCell(ptText,szText,fRowHeight,fColWidth,bMerge,nMergeRows,nMergeCols
  894. ,hAllign,vAllign,lfont,RGB(76,76,76),12,m_pCoordObj); //字高暂时只能设置为12
  895. m_curCell.CalTextPtCoord(); //计算文本的输出点的坐标
  896. }
  897. //m_ReadExcel.Add(m_curCell); //将每一行的元素都存入行向量里
  898. CQTextObj * pLabel = NULL;
  899. pLabel = m_curCell.GetCellLabelObj();
  900. m_curCell.CalCellEndPt(fRowHeight,fColWidth,nMergeRows,nMergeCols,m_pCoordObj);
  901. if(pLabel != NULL)
  902. {
  903. pLabel->CalculateBoundary();
  904. m_pCurNewLayer->AddObject(pLabel);
  905. //将网格线的坐标加入到结构变量中
  906. m_stPt.st_ptBegin = m_curCell.m_ptBegin;
  907. m_stPt.st_ptEnd = m_curCell.m_ptEnd;
  908. m_stPt.st_RowNum = i; //记录行号
  909. m_stPt.st_ColNum = j; //记录列号
  910. m_stPt.st_ColWidth = fColWidth;
  911. m_stPt.st_RowHeight = fRowHeight;
  912. //这里要重新计算合并了的单元格的终点坐标
  913. m_stVector.push_back(m_stPt);
  914. m_stPt.Clear();
  915. }
  916. CQPoint ptpt;
  917. ReCalMergedCellEnPt(ptpt,i,j,fRowHeight,fColWidth);
  918. m_curCell.MakeCellNextColPt(ptNext,fColWidth,nMergeCols,m_pCoordObj);
  919. //得到合并的单元格的列数
  920. if(nMergeCols>0)
  921. {
  922. j+=nMergeCols;
  923. }
  924. else
  925. {
  926. j++;
  927. }
  928. }
  929. //ptRow = CalEachRowFirstColPt(fRowHeight);
  930. //m_vecReadExcel.push_back(m_vecReadExcelRow);//将行向量存入到Excel的映射向量里面
  931. MakeNextRowStartPt(ptNext,ptRow,fRowHeight,1,m_pCoordObj);
  932. //ptNext = ptRow;
  933. }
  934. if(m_pCurNewLayer->GetObjCount()>0)
  935. {
  936. m_pMap->AddLayer(m_pCurNewLayer);
  937. m_pMap->SetCurLayer(m_pCurNewLayer);
  938. }
  939. else
  940. {
  941. return FALSE;
  942. }
  943. DrawExcelGridLine(m_pMap,m_pCoordObj,m_nRowCount,m_nColCount);
  944. return TRUE;
  945. }
  946. catch (_com_error err)
  947. {
  948. CString szEror = "获取Excel数据错误: " + CString(err.ErrorMessage());
  949. AfxMessageBox(szEror);
  950. m_pExcelApp->ReleaseDispatch();
  951. m_pExcelApp->Quit();
  952. delete m_pExcelApp;
  953. m_pExcelApp = NULL;
  954. return FALSE;
  955. }
  956. return FALSE;
  957. }
  958. //绘制边框线
  959. //包括内部的网格线和外边框线 并且对外边框线进行加粗设置
  960. void CQReadExcelToView::DrawExcelGridLine(CQMapObj * pMap,CQCoordSys * pCoordObj,long nExcelRows,long nExcelCols)
  961. {
  962. if(!pMap || !pCoordObj)return;
  963. //传入的表格的总行数和总列数为0则不进行绘制
  964. if(nExcelCols == 0 && nExcelRows == 0) return;
  965. if(m_stVector.size() == 0)  //点阵中没有数据 则返回
  966. return;
  967. int nFlag = 0;
  968. //绘制边框线的时候有几种特殊的情况
  969. //1、绘制第1行第1列的时候完整的绘制整个单元格
  970. //2、绘制第一列的时候要比其他列多绘制左边的一条竖线
  971. //3、绘制第一行的时候要多绘制一条上方的横线
  972. CQLineObj * pNewLineLeft = NULL;
  973. CQLineObj * pNewLineTop = NULL;
  974. CQLineObj * pNewLineRight = NULL;
  975. CQLineObj * pNewLineBottom = NULL;
  976. int nVtcount = m_stVector.size();
  977. for(int ii=0;ii<nVtcount;ii++)
  978. {
  979. if(m_stVector[ii].st_bMerge == TRUE)
  980. continue; //假如是被合并的单元格 就不画了
  981. //第一行,第一列的处理
  982. //只画右边框和下边框线
  983. if(m_stVector[ii].st_RowNum == 1 && m_stVector[ii].st_ColNum == 1)
  984. {
  985. CQPoint pt1 = m_stVector[ii].st_ptBegin;
  986. CQPoint pt2;
  987. pt2.SetX((m_stVector[ii].st_ptEnd).GetX());
  988. pt2.SetY(pt1.GetY());
  989. CQPoint pt3 = m_stVector[ii].st_ptEnd;
  990. CQPoint pt4;
  991. pt4.SetX(pt1.GetX());
  992. pt4.SetY(pt3.GetY());
  993. CQPoint ptEndLast = m_stVector[nVtcount-1].st_ptEnd;
  994. double fLastY = ptEndLast.GetY();
  995. // 如果第一行合并单元格后右下角点为最后的边框点
  996. if(pt3.GetY() == fLastY)
  997. {
  998. pNewLineRight = new CQLineObj;
  999. pNewLineRight->m_PtList.AddPoint(pt2.GetX(),pt2.GetY());
  1000. pNewLineRight->m_PtList.AddPoint(pt3.GetX(),pt3.GetY());
  1001. pNewLineRight->CalculateBoundary();
  1002. pMap->AddObject(pNewLineRight);
  1003. }
  1004. else
  1005. {
  1006. pNewLineRight = new CQLineObj;
  1007. pNewLineBottom = new CQLineObj;
  1008. pNewLineRight->m_PtList.AddPoint(pt2.GetX(),pt2.GetY());
  1009. pNewLineRight->m_PtList.AddPoint(pt3.GetX(),pt3.GetY());
  1010. pNewLineRight->CalculateBoundary();
  1011. pMap->AddObject(pNewLineRight);
  1012. pNewLineBottom->m_PtList.AddPoint(pt3.GetX(),pt3.GetY());
  1013. pNewLineBottom->m_PtList.AddPoint(pt4.GetX(),pt4.GetY());
  1014. pNewLineBottom->CalculateBoundary();
  1015. pMap->AddObject(pNewLineBottom);
  1016. }
  1017. }
  1018. //非最后一行的其余行的第一列
  1019. ////只画右边框和下边框线
  1020. else if(m_stVector[ii].st_RowNum>1 && m_stVector[ii].st_ColNum==1 && m_stVector[ii].st_RowNum < nExcelRows)
  1021. {
  1022. CQPoint pt1 = m_stVector[ii].st_ptBegin;
  1023. CQPoint pt2;
  1024. pt2.SetY(pt1.GetY());
  1025. pt2.SetX((m_stVector[ii].st_ptEnd).GetY());
  1026. CQPoint pt3 = m_stVector[ii].st_ptEnd;
  1027. CQPoint pt4;
  1028. pt4.SetX(pt1.GetX());
  1029. pt4.SetY(pt3.GetY());
  1030. pNewLineRight = new CQLineObj;
  1031. pNewLineBottom = new CQLineObj;
  1032. pNewLineRight->m_PtList.AddPoint(pt2.GetX(),pt2.GetY());
  1033. pNewLineRight->m_PtList.AddPoint(pt3.GetX(),pt3.GetY());
  1034. pNewLineRight->CalculateBoundary();
  1035. pMap->AddObject(pNewLineRight);
  1036. pNewLineBottom->m_PtList.AddPoint(pt3.GetX(),pt3.GetY());
  1037. pNewLineBottom->m_PtList.AddPoint(pt4.GetX(),pt4.GetY());
  1038. pNewLineBottom->CalculateBoundary();
  1039. pMap->AddObject(pNewLineBottom);
  1040. }
  1041. //对第一行非最后一列的其他列的处理
  1042. ////只画右边框和下边框线
  1043. else if(m_stVector[ii].st_RowNum == 1 && m_stVector[ii].st_ColNum>1 && m_stVector[ii].st_ColNum < nExcelCols)
  1044. {
  1045. CQPoint pt1 = m_stVector[ii].st_ptBegin;
  1046. CQPoint pt2;
  1047. pt2.SetY(pt1.GetY());
  1048. pt2.SetX((m_stVector[ii].st_ptEnd).GetX());
  1049. CQPoint pt3 = m_stVector[ii].st_ptEnd;
  1050. CQPoint pt4;
  1051. pt4.SetX(pt1.GetX());
  1052. pt4.SetY(pt3.GetY());
  1053. pNewLineRight = new CQLineObj;
  1054. pNewLineBottom = new CQLineObj;
  1055. pNewLineRight->m_PtList.AddPoint(pt2.GetX(),pt2.GetY());
  1056. pNewLineRight->m_PtList.AddPoint(pt3.GetX(),pt3.GetY());
  1057. pNewLineRight->CalculateBoundary();
  1058. pMap->AddObject(pNewLineRight);
  1059. pNewLineBottom->m_PtList.AddPoint(pt3.GetX(),pt3.GetY());
  1060. pNewLineBottom->m_PtList.AddPoint(pt4.GetX(),pt4.GetY());
  1061. pNewLineBottom->CalculateBoundary();
  1062. pMap->AddObject(pNewLineBottom);
  1063. }
  1064. //最后一行非最后一列的处理
  1065. //只绘制右边框线2
  1066. else if(m_stVector[ii].st_RowNum == nExcelRows && m_stVector[ii].st_ColNum < nExcelCols)
  1067. {
  1068. CQPoint pt1 = m_stVector[ii].st_ptBegin;
  1069. CQPoint pt2;
  1070. pt2.SetY(pt1.GetY());
  1071. pt2.SetX((m_stVector[ii].st_ptEnd).GetX());
  1072. CQPoint pt3 = m_stVector[ii].st_ptEnd;
  1073. pNewLineRight = new CQLineObj;
  1074. pNewLineRight->m_PtList.AddPoint(pt2.GetX(),pt2.GetY());
  1075. pNewLineRight->m_PtList.AddPoint(pt3.GetX(),pt3.GetY());
  1076. pNewLineRight->CalculateBoundary();
  1077. pMap->AddObject(pNewLineRight);
  1078. }
  1079. //最后一列非最后一行的处理
  1080. //只画下面的边框线
  1081. else if(m_stVector[ii].st_RowNum < nExcelRows && m_stVector[ii].st_ColNum == nExcelCols)
  1082. {
  1083. CQPoint pt1 = m_stVector[ii].st_ptBegin;
  1084. CQPoint pt2;
  1085. pt2.SetY(pt1.GetY());
  1086. pt2.SetX((m_stVector[ii].st_ptEnd).GetX());
  1087. CQPoint pt3 = m_stVector[ii].st_ptEnd;
  1088. CQPoint pt4;
  1089. pt4.SetX(pt1.GetX());
  1090. pt4.SetY(pt3.GetY());
  1091. pNewLineBottom = new CQLineObj;
  1092. pNewLineBottom->m_PtList.AddPoint(pt3.GetX(),pt3.GetY());
  1093. pNewLineBottom->m_PtList.AddPoint(pt4.GetX(),pt4.GetY());
  1094. pNewLineBottom->CalculateBoundary();
  1095. pMap->AddObject(pNewLineBottom);
  1096. }
  1097. //其余情况的处理
  1098. ////只画右边框和下边框线
  1099. else if(m_stVector[ii].st_ColNum < nExcelCols && m_stVector[ii].st_RowNum < nExcelRows && 
  1100. m_stVector[ii].st_ColNum != 1 && m_stVector[ii].st_RowNum != 1)
  1101. {
  1102. CQPoint pt2;
  1103. pt2.SetY((m_stVector[ii].st_ptBegin).GetY());
  1104. pt2.SetX((m_stVector[ii].st_ptEnd).GetX());
  1105. CQPoint pt3 = m_stVector[ii].st_ptEnd;
  1106. CQPoint pt4;
  1107. pt4.SetX((m_stVector[ii].st_ptBegin).GetX());
  1108. pt4.SetY(pt3.GetY());
  1109. CQPoint ptEndLast = m_stVector[nVtcount-1].st_ptEnd;
  1110. double fLastY = ptEndLast.GetY();
  1111. // 如果第一行合并单元格后右下角点为最后的边框点
  1112. if(pt3.GetY() == fLastY)
  1113. {
  1114. pNewLineRight = new CQLineObj;
  1115. pNewLineRight->m_PtList.AddPoint(pt2.GetX(),pt2.GetY());
  1116. pNewLineRight->m_PtList.AddPoint(pt3.GetX(),pt3.GetY());
  1117. pNewLineRight->CalculateBoundary();
  1118. pMap->AddObject(pNewLineRight);
  1119. }
  1120. else
  1121. {
  1122. pNewLineRight = new CQLineObj;
  1123. pNewLineBottom = new CQLineObj;
  1124. pNewLineRight->m_PtList.AddPoint(pt2.GetX(),pt2.GetY());
  1125. pNewLineRight->m_PtList.AddPoint(pt3.GetX(),pt3.GetY());
  1126. pNewLineRight->CalculateBoundary();
  1127. pMap->AddObject(pNewLineRight);
  1128. pNewLineBottom->m_PtList.AddPoint(pt3.GetX(),pt3.GetY());
  1129. pNewLineBottom->m_PtList.AddPoint(pt4.GetX(),pt4.GetY());
  1130. pNewLineBottom->CalculateBoundary();
  1131. pMap->AddObject(pNewLineBottom);
  1132. }
  1133. }
  1134. }
  1135. //最后绘制外边框线
  1136. CQPoint ptLeftTop = m_stVector[0].st_ptBegin;      //获取左上角的坐标
  1137. CQPoint ptRightBottom = m_stVector[nVtcount-1].st_ptEnd;//获取右下角的坐标
  1138. CQPoint ptRightTop;
  1139. ptRightTop.SetX(ptRightBottom.GetX());
  1140. ptRightTop.SetY(ptLeftTop.GetY());
  1141. CQPoint ptLeftBottom;
  1142. ptLeftBottom.SetX(ptLeftTop.GetX());
  1143. ptLeftBottom.SetY(ptRightBottom.GetY());
  1144. pNewLineTop = new CQLineObj;
  1145. pNewLineTop->m_PtList.AddPoint(ptLeftTop.GetX(),ptLeftTop.GetY());
  1146. pNewLineTop->m_PtList.AddPoint(ptRightTop.GetX(),ptRightTop.GetY());
  1147. pNewLineTop->CalculateBoundary();
  1148. pMap->AddObject(pNewLineTop);
  1149. pNewLineRight = new CQLineObj;
  1150. pNewLineRight->m_PtList.AddPoint(ptRightTop.GetX(),ptRightTop.GetY());
  1151. pNewLineRight->m_PtList.AddPoint(ptRightBottom.GetX(),ptRightBottom.GetY());
  1152. pNewLineRight->CalculateBoundary();
  1153. pMap->AddObject(pNewLineRight);
  1154. pNewLineBottom = new CQLineObj;
  1155. pNewLineBottom->m_PtList.AddPoint(ptRightBottom.GetX(),ptRightBottom.GetY());
  1156. pNewLineBottom->m_PtList.AddPoint(ptLeftBottom.GetX(),ptLeftBottom.GetY());
  1157. pNewLineBottom->CalculateBoundary();
  1158. pMap->AddObject(pNewLineBottom);
  1159. pNewLineLeft = new CQLineObj;
  1160. pNewLineLeft->m_PtList.AddPoint(ptLeftBottom.GetX(),ptLeftBottom.GetY());
  1161. pNewLineLeft->m_PtList.AddPoint(ptLeftTop.GetX(),ptLeftTop.GetY());
  1162. pNewLineLeft->CalculateBoundary();
  1163. pMap->AddObject(pNewLineLeft);
  1164. }
  1165. //计算首列元素的起点
  1166. CQPoint CQReadExcelToView::CalEachRowFirstColPt(float fRowHeight)
  1167. {
  1168. CQPoint ptFirst;
  1169. if(m_stEachFirRow.st_lMergeRows == 0)
  1170. m_stEachFirRow.st_lMergeRows = 1;
  1171. ptFirst.SetX((m_stEachFirRow.st_ptBeginFirst).GetX());
  1172. ptFirst.SetY((m_stEachFirRow.st_ptBeginFirst).GetY() - m_pCoordObj->MMtoWL(fRowHeight*m_stEachFirRow.st_lMergeRows));
  1173. m_stEachFirRow.st_ptBeginFirst = ptFirst;
  1174. return ptFirst;
  1175. }
  1176. //重新计算合并单元格的右下角点坐标值
  1177. void CQReadExcelToView::ReCalMergedCellEnPt(CQPoint & ptEnd,long nRowIndex,long nColIndex,float fRowHeight,float fColWidth)
  1178. {
  1179. int nVtSize = m_stVector.size();
  1180. if(nVtSize == 0)return;
  1181. int ii = 0;
  1182. int jj = 0;
  1183. //找到被合并的单元格
  1184. for(ii=0;ii<nVtSize;ii++)
  1185. {
  1186. if(m_stVector[ii].st_RowNum == nRowIndex && 
  1187. m_stVector[ii].st_ColNum == nColIndex && m_stVector[ii].st_bMerge != 0)
  1188. {
  1189. break;
  1190. }
  1191. }
  1192. if(ii>=nVtSize)return;
  1193. //向上倒推找开始合并处的那个单元格
  1194. if(m_stVector[ii].st_bMerge != 0)  // 假如这个单元格刚好是被合并的单元格
  1195. {
  1196. for(jj=ii;jj>=0;jj--)
  1197. {
  1198. if(m_stVector[jj].st_bMerge == 0 && m_stVector[jj].st_ColNum == nColIndex)
  1199. break;
  1200. }
  1201. if(jj<0)return;
  1202. //float     st_ColWidth;   //记录列宽
  1203. //float     st_RowHeight;  //记录行高
  1204. //st_ptEnd
  1205. //假如初始计算时的行高比现在得到的行高要小就加
  1206. CQPoint ptt;
  1207. if(m_stVector[jj].st_RowHeight<fRowHeight) 
  1208. {
  1209. ptt = m_stVector[jj].st_ptEnd;
  1210. float ff = m_stVector[jj].st_RowHeight;
  1211. double dy = ptt.GetY();
  1212. dy -= m_pCoordObj->MMtoWL(fRowHeight - ff);
  1213. ptt.SetY(dy);
  1214. m_stVector[jj].st_ptEnd = ptt;
  1215. }
  1216. else if(m_stVector[jj].st_RowHeight>fRowHeight)
  1217. {
  1218. ptt = m_stVector[jj].st_ptEnd;
  1219. double dy = ptt.GetY();
  1220. dy += m_pCoordObj->MMtoWL(m_stVector[jj].st_RowHeight-fRowHeight);
  1221. ptt.SetY(dy);
  1222. m_stVector[jj].st_ptEnd = ptt;
  1223. }
  1224. if(m_stVector[jj].st_ColWidth<fColWidth)
  1225. {
  1226. ptt = m_stVector[jj].st_ptEnd;
  1227. double dx = ptt.GetX();
  1228. dx += m_pCoordObj->MMtoWL(fColWidth - m_stVector[jj].st_ColWidth);
  1229. ptt.SetX(dx);
  1230. m_stVector[jj].st_ptEnd = ptt;
  1231. }
  1232. else if(m_stVector[jj].st_ColWidth>fColWidth)
  1233. {
  1234. ptt = m_stVector[jj].st_ptEnd;
  1235. double dx = ptt.GetX();
  1236. dx -= m_pCoordObj->MMtoWL(m_stVector[jj].st_ColWidth-fColWidth);
  1237. ptt.SetX(dx);
  1238. m_stVector[jj].st_ptEnd = ptt;
  1239. }
  1240. }
  1241. }
  1242. //设置表格的起点坐标 
  1243. void CQReadExcelToView::SetExcelStartPt(CQPoint Pt)
  1244. {
  1245. m_ptBegin.SetX(Pt.GetX());
  1246. m_ptBegin.SetY(Pt.GetY());
  1247. }
  1248. //设置表格的起点坐标 
  1249. void CQReadExcelToView::SetExcelStartPt(double dx,double dy)
  1250. {
  1251. m_ptBegin.SetX(dx);
  1252. m_ptBegin.SetY(dy);
  1253. }