Excel.cpp 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944
  1. #include "pch.h"
  2. #include "Excel.h"
  3. //using namespace O12;
  4. /*
  5. 1.
  6. 程序中所有有关序号和索引的一律为数字1开始
  7. 2.
  8. 在使用本类的时候,需要初始化COM库
  9. if(CoInitialize(NULL) != NULL)
  10. {
  11. AfxMessageBox("初始化COM失败!");
  12. }
  13. 3.
  14. //在程序退出的时候需要清除COM库
  15. CoUninitialize();
  16. */
  17. CExport2Excel::CExport2Excel(void)
  18. {
  19. bSheet = false;
  20. }
  21. CExport2Excel::~CExport2Excel(void)
  22. {
  23. Close();
  24. }
  25. /*
  26. 创建Excel文件
  27. sExcelFile: Excel文件名
  28. */
  29. bool CExport2Excel::CreateExcel(CString sExcelFile)
  30. {
  31. bCreate = true;
  32. //使用Excel类型库接口的方式实现
  33. this->sExcelFile = sExcelFile;
  34. covOptional = COleVariant((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
  35. if(!m_appExcel.CreateDispatch(_T("Excel.Application"),NULL))
  36. {
  37. //创建Excel服务失败
  38. return false;
  39. }
  40. m_wbExcels.AttachDispatch(m_appExcel.get_Workbooks(),true);
  41. m_wbExcelSingle.AttachDispatch(m_wbExcels.Add(covOptional));
  42. //得到Worksheets
  43. m_wsExcels.AttachDispatch(m_wbExcelSingle.get_Worksheets(),true);
  44. //删除表 只剩下一个表
  45. long sheetNum = m_wsExcels.get_Count();
  46. for (short i = 2; i<= sheetNum; i++)
  47. {
  48. m_wsExcelSingle.AttachDispatch(m_wsExcels.get_Item(COleVariant((short)i)));
  49. m_wsExcelSingle.Delete();
  50. }
  51. iSheetIndex = 1;
  52. bSheet = true;
  53. return true;
  54. }
  55. // 打开Excel文件
  56. bool CExport2Excel::OpenExcel(CString sExcelFile)
  57. {
  58. if (bCreate)
  59. {
  60. Close();
  61. }
  62. bCreate = false;
  63. //使用Excel类型库接口的方式实现
  64. this->sExcelFile = sExcelFile;
  65. covOptional = COleVariant((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
  66. if(!m_appExcel.CreateDispatch(_T("Excel.Application"),NULL))
  67. {
  68. //创建Excel服务失败
  69. return false;
  70. }
  71. m_wbExcels.AttachDispatch(m_appExcel.get_Workbooks(),true);
  72. m_wbExcelSingle.AttachDispatch(m_wbExcels.Open(sExcelFile, vtMissing, vtMissing, vtMissing, vtMissing, vtMissing, vtMissing, vtMissing, vtMissing, vtMissing, vtMissing, vtMissing, vtMissing, vtMissing, vtMissing));
  73. //得到Worksheets
  74. m_wsExcels.AttachDispatch(m_wbExcelSingle.get_Worksheets(),true);
  75. //得到Worksheet的数目
  76. //m_iSheetCount = m_wsExcels.get_Count();
  77. /*
  78. long iSheet = m_wsExcels.get_Count();
  79. long i;
  80. for (i = 1; i <= iSheet; i++)
  81. {
  82. m_wsExcelSingle.AttachDispatch(m_wsExcels.get_Item(COleVariant((long)(i))));
  83. if (m_wsExcelSingle.get_Name().CompareNoCase("文件") == 0)
  84. {
  85. iSheetIndex = i;
  86. m_wsExcelSingle.ReleaseDispatch();
  87. break;
  88. }
  89. m_wsExcelSingle.ReleaseDispatch();
  90. }
  91. SetSheet(i);
  92. */
  93. bCreate = true;
  94. SetSheet(1);
  95. return true;
  96. }
  97. /*
  98. 创建表
  99. sSheetName: 表名
  100. */
  101. void CExport2Excel::CreateSheet(CString sSheetName)
  102. {
  103. if (bSheet)
  104. {
  105. //第一个表
  106. m_wsExcelSingle.AttachDispatch(m_wsExcels.get_Item(COleVariant((short)(1))));
  107. }else{
  108. //不是第一个表
  109. m_wsExcelSingle.AttachDispatch(m_wsExcels.Add(vtMissing, vtMissing, COleVariant((short)(1)), vtMissing));
  110. }
  111. bSheet = false;
  112. iSheetIndex = 1;
  113. //设置表名
  114. m_wsExcelSingle.put_Name(sSheetName);
  115. m_rangeExcel.AttachDispatch(m_wsExcelSingle.get_UsedRange(), TRUE);
  116. }
  117. void CExport2Excel::SetShowAlert(BOOL bShow)
  118. {
  119. m_appExcel.put_DisplayAlerts(bShow);
  120. }
  121. /*
  122. 设置当前工作表
  123. iSheetIndex: 为创建表的顺序(倒序,即最后创建的表序号为1)
  124. */
  125. void CExport2Excel::SetSheet(long iSheetIndex)
  126. {
  127. m_wsExcelSingle.ReleaseDispatch();
  128. m_wsExcelSingle.AttachDispatch(m_wsExcels.get_Item(COleVariant((short)iSheetIndex)));
  129. m_wsExcelSingle.Activate();
  130. m_rangeExcel.ReleaseDispatch();
  131. m_rangeExcel.AttachDispatch(m_wsExcelSingle.get_UsedRange(), TRUE);
  132. this->iSheetIndex = iSheetIndex;
  133. }
  134. int CExport2Excel::GetSheetIndex()
  135. {
  136. return iSheetIndex;
  137. }
  138. long CExport2Excel::GetSheetsNumber()
  139. {
  140. m_wbExcels.AttachDispatch(m_appExcel.get_Workbooks(),true);
  141. //得到Worksheets
  142. //m_wsExcels.AttachDispatch(m_wbExcelSingle.get_Worksheets(),true);
  143. //得到Worksheet的数目
  144. return m_wsExcels.get_Count();
  145. }
  146. void CExport2Excel::WriteTitle(LPCTSTR pszText)
  147. {
  148. WriteData(0, 1, pszText);
  149. }
  150. /*
  151. 写表头
  152. iColumn:指定列
  153. pszText:文本
  154. */
  155. void CExport2Excel::WriteHeader(long iColumn, LPCTSTR pszText)
  156. {
  157. //这里自己改成了0,本来是1
  158. //因为WriteData函数中行数已经加了1
  159. //modifed by sun shujin, 2014年11月21日17:21:31
  160. WriteData(0, iColumn, pszText);
  161. }
  162. /*
  163. iRow: 行号
  164. iColumn: 列号
  165. pszText: 要写入的文本
  166. */
  167. void CExport2Excel::WriteData(long iRow, long iColumn, LPCTSTR pszText)
  168. {
  169. // 向Excel中写数据
  170. //m_rangeExcel.put_Item(_variant_t(iRow + 1), _variant_t(iColumn), COleVariant(pszText)); // _variant_t是VARIANT的封装类
  171. m_rangeExcel.put_Item(_variant_t(iRow), _variant_t(iColumn), COleVariant((LPCTSTR)pszText));
  172. //SetAudoColumn();
  173. }
  174. //读取文本
  175. CString CExport2Excel::GetText(long iRow, long iColumn)
  176. {
  177. CRange tRange;
  178. tRange.AttachDispatch(m_rangeExcel.get_Item(_variant_t((long)iRow), _variant_t((long)(iColumn))).pdispVal, true);
  179. VARIANT pszText = tRange.get_Text();
  180. tRange.ReleaseDispatch();
  181. char* buf = _com_util::ConvertBSTRToString(pszText.bstrVal); //BSTR转换成char*
  182. //CString strT=str(buf);
  183. USES_CONVERSION;
  184. CString strT = buf;
  185. //strT.Format(_T("%s"), buf);
  186. delete buf;
  187. return strT;
  188. }
  189. //读取公式
  190. CString CExport2Excel::GetCalcText(long iRow, long iColumn)
  191. {
  192. CRange tRange;
  193. tRange.AttachDispatch(m_rangeExcel.get_Item(_variant_t((long)iRow), _variant_t((long)(iColumn))).pdispVal, true);
  194. VARIANT pszText = tRange.get_Formula();
  195. tRange.ReleaseDispatch();
  196. CString strT;
  197. char* buf = _com_util::ConvertBSTRToString(pszText.bstrVal);
  198. strT.Format(_T("%s"), buf);
  199. delete buf;
  200. return strT;
  201. }
  202. //读取合并单元格信息
  203. void CExport2Excel::GetMergeAreaInfo(long iRow, long iColumn, long& MergeRowCount, long& MergeColumnCount, long& MergeStartRow, long& MergeStartColumn)
  204. {
  205. CRange tRange;
  206. tRange.AttachDispatch(m_rangeExcel.get_Item(_variant_t((long)iRow), _variant_t((long)(iColumn))).pdispVal, true);
  207. CRange unionRange;
  208. unionRange.AttachDispatch(tRange.get_MergeArea());
  209. //合并单元格的行数
  210. CRange mergeAreaRange_HangCount;
  211. mergeAreaRange_HangCount.AttachDispatch(unionRange.get_Rows());
  212. MergeRowCount = mergeAreaRange_HangCount.get_Count();
  213. mergeAreaRange_HangCount.ReleaseDispatch();
  214. //合并单元格的列数
  215. CRange mergeAreaRange_LieCount;
  216. mergeAreaRange_LieCount.AttachDispatch(unionRange.get_Columns());
  217. MergeColumnCount = mergeAreaRange_LieCount.get_Count();
  218. mergeAreaRange_LieCount.ReleaseDispatch();
  219. //起始行,从1开始
  220. MergeStartRow = unionRange.get_Row();
  221. //起始列,从1开始
  222. MergeStartColumn = unionRange.get_Column();
  223. unionRange.ReleaseDispatch();
  224. tRange.ReleaseDispatch();
  225. }
  226. // 写公式
  227. void CExport2Excel::WriteCalcText(long iRow, long iColumn, LPCTSTR pszText)
  228. {
  229. // 向Excel中写数据
  230. CRange tRange;
  231. tRange.AttachDispatch(m_rangeExcel.get_Item(_variant_t((long)iRow), _variant_t((long)(iColumn))).pdispVal, true);
  232. tRange.put_Formula(COleVariant((LPCTSTR)pszText));
  233. tRange.ReleaseDispatch();
  234. }
  235. // 设置单元格格式 @ = 文本格式
  236. void CExport2Excel::SetNumberFormatLocal(long iRow, long iColumn, LPCTSTR pszText)
  237. {
  238. // 向Excel中写数据
  239. CRange tRange;
  240. tRange.AttachDispatch(m_rangeExcel.get_Item(_variant_t((long)iRow), _variant_t((long)(iColumn))).pdispVal, true);
  241. tRange.put_NumberFormatLocal(COleVariant((LPCTSTR)pszText));
  242. tRange.ReleaseDispatch();
  243. }
  244. // 设置单元格水平右对齐
  245. void CExport2Excel::SetHorizontalAlignment(long iRow, long iColumn, long HAType)
  246. {
  247. // 向Excel中写数据
  248. CRange tRange;
  249. tRange.AttachDispatch(m_rangeExcel.get_Item(_variant_t((long)iRow), _variant_t((long)(iColumn))).pdispVal, true);
  250. tRange.put_HorizontalAlignment(_variant_t(HAType));
  251. tRange.ReleaseDispatch();
  252. }
  253. /*
  254. 设置列宽
  255. iColumn: 指定列
  256. iWidth: 宽度
  257. */
  258. void CExport2Excel::SetColWidth(long iColumn, float iWidth)
  259. {
  260. CRange tRange;
  261. //得到第一行
  262. tRange.AttachDispatch(m_rangeExcel.get_Item(_variant_t((long)1), _variant_t(iColumn)).pdispVal, true);
  263. //设置列宽
  264. tRange.put_ColumnWidth(_variant_t(iWidth));
  265. tRange.ReleaseDispatch();
  266. }
  267. /*
  268. 设置列宽
  269. iRow: 指定行
  270. iHeight: 高度
  271. */
  272. void CExport2Excel::SetRowHeight(long iRow, float iHeight)
  273. {
  274. CRange tRange;
  275. //得到第一列
  276. tRange.AttachDispatch(m_rangeExcel.get_Item(_variant_t((long)iRow), _variant_t((long)1)).pdispVal, true);
  277. //设置列高
  278. tRange.put_RowHeight(_variant_t(iHeight));
  279. tRange.ReleaseDispatch();
  280. }
  281. //error
  282. void CExport2Excel::SetAutoFilter(long iRow)
  283. {
  284. CRange tRange;
  285. //得到第一列
  286. tRange.AttachDispatch(m_rangeExcel.get_Item(_variant_t((long)iRow), _variant_t((long)1)).pdispVal, true);
  287. COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
  288. //设置列高
  289. tRange.AutoFilter(COleVariant((long)1), COleVariant((long)2), 1, COleVariant((long)4), vtMissing);
  290. tRange.ReleaseDispatch();
  291. }
  292. //设置自动换行
  293. void CExport2Excel::SetWrapText(long iRow, long iColumn)
  294. {
  295. CRange tRange;
  296. //得到第一列
  297. tRange.AttachDispatch(m_rangeExcel.get_Item(_variant_t((long)iRow), _variant_t((long)iColumn)).pdispVal, true);
  298. COleVariant varTrue((short)TRUE,VT_BOOL);
  299. tRange.put_WrapText(varTrue);
  300. tRange.ReleaseDispatch();
  301. }
  302. //自动调整列宽
  303. void CExport2Excel::SetAudoColumn()
  304. {
  305. //选择所有列
  306. CRange range;
  307. range.AttachDispatch(m_wsExcelSingle.get_Cells());
  308. range.Select();
  309. //列设置为自动调整列宽
  310. CRange range1;
  311. range1.AttachDispatch(range.get_Columns());
  312. range1.AutoFit();
  313. range1.ReleaseDispatch();
  314. range.ReleaseDispatch();
  315. //取消选中所有列(即选中任意一个单元格即可)
  316. CRange tRange;
  317. tRange.AttachDispatch(m_rangeExcel.get_Item(_variant_t((long)1), _variant_t((long)(1))).pdispVal, true);
  318. tRange.Select();
  319. tRange.ReleaseDispatch();
  320. }
  321. //合并单元格 均从1开始
  322. void CExport2Excel::MergeTitleCells(long iRow, long iStartColumn, long iEndColumn)
  323. {
  324. iStartColumn += 'A' - 1;
  325. iEndColumn += 'A' - 1;
  326. CString strT;
  327. strT.Format(_T("%C%d:%C%d"), iStartColumn, iRow, iEndColumn, iRow);
  328. CRange tRange;
  329. //tRange.AttachDispatch(m_rangeExcel.get_Range(COleVariant("A2"), COleVariant("A2")));
  330. tRange.AttachDispatch(m_rangeExcel.get_Range(_variant_t(strT.GetBuffer()), vtMissing), true);
  331. tRange.Select();
  332. COleVariant varTrue((short)TRUE,VT_BOOL);
  333. tRange.put_MergeCells(varTrue);
  334. tRange.ReleaseDispatch();
  335. //取消选中所有列(即选中任意一个单元格即可)
  336. tRange.AttachDispatch(m_rangeExcel.get_Item(_variant_t((long)1), _variant_t((long)(1))).pdispVal, true);
  337. tRange.Select();
  338. tRange.ReleaseDispatch();
  339. }
  340. //合并单元格 均从1开始
  341. void CExport2Excel::MergeCells(long iRow, long iStartColumn, long iEndColumn)
  342. {
  343. iStartColumn += 'A' - 1;
  344. iEndColumn += 'A' - 1;
  345. CString strT;
  346. strT.Format(_T("%C%d:%C%d"), iStartColumn, iRow, iEndColumn, iRow);
  347. CRange tRange;
  348. //tRange.AttachDispatch(m_rangeExcel.get_Range(COleVariant("A2"), COleVariant("A2")));
  349. tRange.AttachDispatch(m_rangeExcel.get_Range(_variant_t(strT.GetBuffer()), vtMissing), true);
  350. tRange.Select();
  351. COleVariant varTrue((short)TRUE,VT_BOOL);
  352. tRange.put_MergeCells(varTrue);
  353. tRange.ReleaseDispatch();
  354. //取消选中所有列(即选中任意一个单元格即可)
  355. tRange.AttachDispatch(m_rangeExcel.get_Item(_variant_t((long)1), _variant_t((long)(1))).pdispVal, true);
  356. tRange.Select();
  357. tRange.ReleaseDispatch();
  358. }
  359. //合并单元格 均从1开始
  360. void CExport2Excel::MergeCells(long iStartRow, long iStartColumn, long iEndRow, long iEndColumn)
  361. {
  362. iStartColumn += 'A' - 1;
  363. iEndColumn += 'A' - 1;
  364. CString strT;
  365. strT.Format(_T("%C%d:%C%d"), iStartColumn, iStartRow , iEndColumn, iEndRow);
  366. CRange tRange;
  367. //tRange.AttachDispatch(m_rangeExcel.get_Range(COleVariant("A2"), COleVariant("A2")));
  368. tRange.AttachDispatch(m_rangeExcel.get_Range(_variant_t(strT.GetBuffer()), vtMissing), true);
  369. tRange.Select();
  370. COleVariant varTrue((short)TRUE,VT_BOOL);
  371. tRange.put_MergeCells(varTrue);
  372. tRange.ReleaseDispatch();
  373. //取消选中所有列(即选中任意一个单元格即可)
  374. tRange.AttachDispatch(m_rangeExcel.get_Item(_variant_t((long)1), _variant_t((long)(1))).pdispVal, true);
  375. tRange.Select();
  376. tRange.ReleaseDispatch();
  377. }
  378. //设置边框
  379. //SetBorders(4, 1, iRow, 8, true, true, true, true, true, true, xlMedium, xlMedium, xlMedium, xlMedium, xlThin, xlThin)
  380. void CExport2Excel::SetBorders(long iStartRow, long iStartColumn, long iEndRow, long iEndColumn, // 指定的单元格
  381. bool bLeft, bool bTop, bool bRight, bool bBottom, // 指定的四个边
  382. bool bInsideVertical, bool bInsideHorizontal, // 内部边框
  383. long Left_LineType, long Top_LineType, long Right_LineType, long Bottom_LineType, // 四个边的线类型
  384. long InsideVertical_LineType, long InsideHorizontal_LineType) // 内部边框的线类型
  385. {
  386. iStartColumn += 'A' - 1;
  387. iEndColumn += 'A' - 1;
  388. CString strT;
  389. strT.Format(_T("%C%d:%C%d"), iStartColumn, iStartRow, iEndColumn, iEndRow);
  390. CRange tRange;
  391. tRange.AttachDispatch(m_rangeExcel.get_Range(_variant_t(strT.GetBuffer()), vtMissing), true);
  392. tRange.Select();
  393. //为四周和内部加上边框
  394. m_bordersExcel.AttachDispatch(tRange.get_Borders());
  395. // 置空
  396. m_borderExcel.AttachDispatch(m_bordersExcel.get_Item(xlDiagonalDown));
  397. m_borderExcel.put_LineStyle(_variant_t(xlNone));
  398. m_borderExcel.ReleaseDispatch();
  399. m_borderExcel.AttachDispatch(m_bordersExcel.get_Item(xlDiagonalUp));
  400. m_borderExcel.put_LineStyle(_variant_t(xlNone));
  401. m_borderExcel.ReleaseDispatch();
  402. // Left
  403. if (bLeft)
  404. {
  405. m_borderExcel.AttachDispatch(m_bordersExcel.get_Item(xlEdgeLeft));
  406. m_borderExcel.put_LineStyle(_variant_t(xlContinuous));
  407. m_borderExcel.put_Weight(_variant_t(Left_LineType));
  408. m_borderExcel.put_ColorIndex(_variant_t(xlAutomatic));
  409. m_borderExcel.ReleaseDispatch();
  410. }
  411. // Top
  412. if (bTop)
  413. {
  414. m_borderExcel.AttachDispatch(m_bordersExcel.get_Item(xlEdgeTop));
  415. m_borderExcel.put_LineStyle(_variant_t(xlContinuous));
  416. m_borderExcel.put_Weight(_variant_t(Top_LineType));
  417. m_borderExcel.put_ColorIndex(_variant_t(xlAutomatic));
  418. m_borderExcel.ReleaseDispatch();
  419. }
  420. // Right
  421. if (bRight)
  422. {
  423. m_borderExcel.AttachDispatch(m_bordersExcel.get_Item(xlEdgeRight));
  424. m_borderExcel.put_LineStyle(_variant_t(xlContinuous));
  425. m_borderExcel.put_Weight(_variant_t(Right_LineType));
  426. m_borderExcel.put_ColorIndex(_variant_t(xlAutomatic));
  427. m_borderExcel.ReleaseDispatch();
  428. }
  429. // Bottom
  430. if (bBottom)
  431. {
  432. m_borderExcel.AttachDispatch(m_bordersExcel.get_Item(xlEdgeBottom));
  433. m_borderExcel.put_LineStyle(_variant_t(xlContinuous));
  434. m_borderExcel.put_Weight(_variant_t(Bottom_LineType));
  435. m_borderExcel.put_ColorIndex(_variant_t(xlAutomatic));
  436. m_borderExcel.ReleaseDispatch();
  437. }
  438. // InsideVertical
  439. if ((iEndColumn - iStartColumn) > 1 && bInsideVertical)
  440. {
  441. m_borderExcel.AttachDispatch(m_bordersExcel.get_Item(xlInsideVertical));
  442. m_borderExcel.put_LineStyle(_variant_t(xlContinuous));
  443. m_borderExcel.put_Weight(_variant_t(InsideVertical_LineType));
  444. m_borderExcel.put_ColorIndex(_variant_t(xlAutomatic));
  445. m_borderExcel.ReleaseDispatch();
  446. }
  447. // InsideHorizontal
  448. if ((iEndRow - iStartRow) > 1 && bInsideHorizontal)
  449. {
  450. m_borderExcel.AttachDispatch(m_bordersExcel.get_Item(xlInsideHorizontal));
  451. m_borderExcel.put_LineStyle(_variant_t(xlContinuous));
  452. m_borderExcel.put_Weight(_variant_t(InsideHorizontal_LineType));
  453. m_borderExcel.put_ColorIndex(_variant_t(xlAutomatic));
  454. m_borderExcel.ReleaseDispatch();
  455. }
  456. m_bordersExcel.ReleaseDispatch();
  457. tRange.ReleaseDispatch();
  458. //取消选中所有列(即选中任意一个单元格即可)
  459. tRange.AttachDispatch(m_rangeExcel.get_Item(_variant_t((long)1), _variant_t((long)(1))).pdispVal, true);
  460. tRange.Select();
  461. tRange.ReleaseDispatch();
  462. //http://www.cppblog.com/greatws/archive/2008/09/21/62423.html
  463. }
  464. //首行冻结
  465. void CExport2Excel::SetFirstLineFreezePanes()
  466. {
  467. CRange tRange;
  468. tRange.AttachDispatch(m_rangeExcel.get_Range(COleVariant(_T("A2")), COleVariant(_T("A2"))));
  469. tRange.Select();
  470. tRange.ReleaseDispatch();
  471. CWindow0 tWindow;
  472. tWindow.AttachDispatch(m_appExcel.get_ActiveWindow());
  473. tWindow.put_FreezePanes(true);
  474. tWindow.ReleaseDispatch();
  475. }
  476. //首行颜色
  477. void CExport2Excel::SetFirstLineColor(COLORREF color)
  478. {
  479. CRange tRange;
  480. tRange.AttachDispatch(m_rangeExcel.get_Range(_variant_t("2:2"), vtMissing), true);
  481. tRange.Select();
  482. //设置居中
  483. tRange.put_HorizontalAlignment(_variant_t((short)-4108));
  484. //设置粗体
  485. CFont0 tFont;
  486. tFont.AttachDispatch(tRange.get_Font());
  487. tFont.put_Bold(_variant_t(true));
  488. tFont.put_Name(_variant_t("宋体"));
  489. tFont.put_Size(_variant_t(10));
  490. tFont.ReleaseDispatch();
  491. //设置颜色
  492. Cnterior tNterior;
  493. tNterior.AttachDispatch(tRange.get_Interior());
  494. tNterior.put_Color(_variant_t(color));
  495. tNterior.ReleaseDispatch();
  496. tRange.ReleaseDispatch();
  497. }
  498. void CExport2Excel::SetLineColor(COLORREF color, long iRow, LPCTSTR pszFontName, int iFontSize, bool bBold)
  499. {
  500. CString strT;
  501. strT.Format(_T("%d:%d"), iRow, iRow);
  502. CRange tRange;
  503. tRange.AttachDispatch(m_rangeExcel.get_Range(_variant_t(strT.GetBuffer()), vtMissing), true);
  504. tRange.Select();
  505. //设置居中
  506. tRange.put_HorizontalAlignment(_variant_t((short)-4108));
  507. //设置粗体
  508. CFont0 tFont;
  509. tFont.AttachDispatch(tRange.get_Font());
  510. if (bBold)
  511. tFont.put_Bold(_variant_t(true));
  512. if (pszFontName != NULL)
  513. tFont.put_Name(_variant_t(pszFontName));
  514. tFont.put_Size(_variant_t(iFontSize));
  515. tFont.ReleaseDispatch();
  516. //设置颜色
  517. Cnterior tNterior;
  518. tNterior.AttachDispatch(tRange.get_Interior());
  519. tNterior.put_Color(_variant_t(color));
  520. tNterior.ReleaseDispatch();
  521. tRange.ReleaseDispatch();
  522. }
  523. void CExport2Excel::SetFont(long iRow, LPCTSTR pszFontName, int iFontSize, bool bBold)
  524. {
  525. CString strT;
  526. strT.Format(_T("%d:%d"), iRow, iRow);
  527. CRange tRange;
  528. tRange.AttachDispatch(m_rangeExcel.get_Range(_variant_t(strT.GetBuffer()), vtMissing), true);
  529. tRange.Select();
  530. CFont0 tFont;
  531. tFont.AttachDispatch(tRange.get_Font());
  532. if (bBold)
  533. tFont.put_Bold(_variant_t(true));
  534. else
  535. tFont.put_Bold(_variant_t(false));
  536. if (pszFontName != NULL)
  537. tFont.put_Name(_variant_t(pszFontName));
  538. tFont.put_Size(_variant_t(iFontSize));
  539. tFont.ReleaseDispatch();
  540. tRange.ReleaseDispatch();
  541. }
  542. void CExport2Excel::SetFont(long iRow, long iColumn, LPCTSTR pszFontName, int iFontSize, bool bBold)
  543. {
  544. CString strT;
  545. strT.Format(_T("%c%d"), iColumn + 'A' - 1, iRow);
  546. CRange tRange;
  547. tRange.AttachDispatch(m_rangeExcel.get_Range(_variant_t(strT.GetBuffer()), vtMissing), true);
  548. tRange.Select();
  549. CFont0 tFont;
  550. tFont.AttachDispatch(tRange.get_Font());
  551. if (bBold)
  552. tFont.put_Bold(_variant_t(true));
  553. else
  554. tFont.put_Bold(_variant_t(false));
  555. if (pszFontName != NULL)
  556. tFont.put_Name(_variant_t(pszFontName));
  557. tFont.put_Size(_variant_t(iFontSize));
  558. tFont.ReleaseDispatch();
  559. tRange.ReleaseDispatch();
  560. }
  561. void CExport2Excel::SetColor(COLORREF color, long iRow, long iColumn)
  562. {
  563. CString strT;
  564. strT.Format(_T("%c%d"), iColumn + 'A' - 1, iRow);
  565. CRange tRange;
  566. tRange.AttachDispatch(m_rangeExcel.get_Range(_variant_t(strT.GetBuffer()), vtMissing), true);
  567. tRange.Select();
  568. /*
  569. //设置居中
  570. tRange.put_HorizontalAlignment(_variant_t((short)-4108));
  571. //设置粗体
  572. CFont0 tFont;
  573. tFont.AttachDispatch(tRange.get_Font());
  574. if (bBold)
  575. tFont.put_Bold(_variant_t(true));
  576. if (pszFontName != NULL)
  577. tFont.put_Name(_variant_t(pszFontName));
  578. tFont.put_Size(_variant_t(iFontSize));
  579. tFont.ReleaseDispatch();
  580. */
  581. //设置颜色
  582. Cnterior tNterior;
  583. tNterior.AttachDispatch(tRange.get_Interior());
  584. tNterior.put_Color(_variant_t(color));
  585. tNterior.ReleaseDispatch();
  586. tRange.ReleaseDispatch();
  587. }
  588. /*
  589. 增加行,当前行向下移动
  590. */
  591. void CExport2Excel::InsertRow(long iRow)
  592. {
  593. CRange tRange;
  594. CString strT;
  595. strT.Format(_T("%d:%d"), iRow, iRow);
  596. tRange.AttachDispatch(m_rangeExcel.get_Range(_variant_t(strT.GetBuffer()), vtMissing), true);
  597. tRange.Select();
  598. //Insert(COleVariant((long)-4121)); to shift down
  599. //Insert(COleVariant((long)-4161)); to shift right.
  600. tRange.Insert(COleVariant((long)-4121), _variant_t(true));
  601. tRange.ReleaseDispatch();
  602. }
  603. long CExport2Excel::GetRowCount()
  604. {
  605. //return m_rangeExcel.get_Count();
  606. long lRowCount;
  607. int iSheetIndex = GetSheetIndex();
  608. m_wsExcelSingle.AttachDispatch(m_wsExcels.get_Item(COleVariant((long)(iSheetIndex))));
  609. CRange usedRange;
  610. usedRange.AttachDispatch(m_wsExcelSingle.get_UsedRange());
  611. CRange usedRow;
  612. usedRow.AttachDispatch(usedRange.get_Rows());
  613. lRowCount = usedRow.get_Count();
  614. usedRow.ReleaseDispatch();
  615. m_wsExcelSingle.ReleaseDispatch();
  616. return lRowCount;
  617. }
  618. long CExport2Excel::GetColCount()
  619. {
  620. //return m_rangeExcel.get_Count();
  621. long lRowCount;
  622. int iSheetIndex = GetSheetIndex();
  623. m_wsExcelSingle.AttachDispatch(m_wsExcels.get_Item(COleVariant((long)(iSheetIndex))));
  624. CRange usedRange;
  625. usedRange.AttachDispatch(m_wsExcelSingle.get_UsedRange());
  626. CRange usedRow;
  627. usedRow.AttachDispatch(usedRange.get_Columns());
  628. lRowCount = usedRow.get_Count();
  629. usedRow.ReleaseDispatch();
  630. m_wsExcelSingle.ReleaseDispatch();
  631. return lRowCount;
  632. }
  633. void CExport2Excel::Save()
  634. {
  635. if (bCreate)
  636. {
  637. m_wbExcelSingle.SaveAs(COleVariant(sExcelFile),
  638. _variant_t(vtMissing),
  639. _variant_t(vtMissing),
  640. _variant_t(vtMissing),
  641. _variant_t(vtMissing),
  642. _variant_t(vtMissing),
  643. 0,
  644. _variant_t(vtMissing),
  645. _variant_t(vtMissing),
  646. _variant_t(vtMissing),
  647. _variant_t(vtMissing),
  648. _variant_t(vtMissing));
  649. }else{
  650. //app.SetDisplayAlerts(false); // 不弹出对话框询问是否保存
  651. m_wbExcelSingle.Save();
  652. }
  653. m_wbExcelSingle.Close(covOptional, COleVariant(sExcelFile), covOptional);
  654. m_wbExcels.Close();
  655. m_rangeExcel.ReleaseDispatch();
  656. m_wsExcelSingle.ReleaseDispatch();
  657. m_wsExcels.ReleaseDispatch();
  658. m_wbExcelSingle.ReleaseDispatch();
  659. m_wbExcels.ReleaseDispatch();
  660. }
  661. void CExport2Excel::SaveAs(CString strExcelFile)
  662. {
  663. m_wbExcelSingle.SaveAs(COleVariant(strExcelFile),
  664. _variant_t(vtMissing),
  665. _variant_t(vtMissing),
  666. _variant_t(vtMissing),
  667. _variant_t(vtMissing),
  668. _variant_t(vtMissing),
  669. 0,
  670. _variant_t(vtMissing),
  671. _variant_t(vtMissing),
  672. _variant_t(vtMissing),
  673. _variant_t(vtMissing),
  674. _variant_t(vtMissing));
  675. m_wbExcelSingle.Close(covOptional, COleVariant(sExcelFile), covOptional);
  676. m_wbExcels.Close();
  677. m_rangeExcel.ReleaseDispatch();
  678. m_wsExcelSingle.ReleaseDispatch();
  679. m_wsExcels.ReleaseDispatch();
  680. m_wbExcelSingle.ReleaseDispatch();
  681. m_wbExcels.ReleaseDispatch();
  682. }
  683. void CExport2Excel::Close()
  684. {
  685. m_appExcel.put_UserControl(true);
  686. m_appExcel.Quit();
  687. m_appExcel.ReleaseDispatch();
  688. }
  689. // http://support.microsoft.com/kb/178783
  690. // CreatePicutre(0, 0, 400, 400, "A:A,C:C,E:E,F:F", "标题", "X轴", "Y轴");
  691. void CExport2Excel::CreatePicutre(double dLeft, double dTop, double dWidth, double dHeight, // 图标的位置和大小
  692. const char* strDataSourceRange,
  693. const char* strTitle,
  694. const char* strX,
  695. const char* strY)
  696. {
  697. CChartObjects chartobjects;
  698. chartobjects.AttachDispatch(m_wsExcelSingle.ChartObjects(covOptional));
  699. // 创建图表位置和大小
  700. CChartObject chartobject = chartobjects.Add(dLeft, dTop, dWidth, dHeight);
  701. CChart chart;
  702. chart.AttachDispatch(chartobject.get_Chart());
  703. // 图表的数据来源、范围
  704. CRange range;
  705. // 数据源 - 选中多个不连续的列 "A:A,C:C,E:E,F:F"
  706. range.AttachDispatch(m_rangeExcel.get_Range(_variant_t(strDataSourceRange), vtMissing));
  707. // 设置数据源
  708. chart.SetSourceData(range, COleVariant((long)xlColumns));
  709. // 设置图表类型 - 柱形
  710. chart.put_ChartType(xlColumnClustered);
  711. // 显示图例(右侧的信息)
  712. chart.put_HasLegend(TRUE);
  713. CLegend legend;
  714. legend.AttachDispatch(chart.get_Legend());
  715. legend.put_Position(xlCorner);
  716. legend.DetachDispatch();
  717. // 设置图表标题
  718. chart.put_HasTitle(TRUE);
  719. CChartTitle chartTitle;
  720. chartTitle.AttachDispatch(chart.get_ChartTitle());
  721. // 设置字体
  722. CFont0 font0;
  723. font0.AttachDispatch(chartTitle.get_Font());
  724. font0.put_Bold(_variant_t(TRUE));
  725. font0.put_Size(_variant_t(15));
  726. font0.DetachDispatch();
  727. chartTitle.put_Caption((LPCTSTR)strTitle);
  728. chartTitle.DetachDispatch();
  729. // 设置x轴
  730. CAxis axis;
  731. CAxisTitle axisTitle;
  732. axis.AttachDispatch(chart.Axes(COleVariant((long)xlCategory), xlPrimary));
  733. axis.put_HasTitle(TRUE);
  734. // 设置字体 - x轴坐标文字
  735. CTickLabels tickLabels;
  736. tickLabels.AttachDispatch(axis.get_TickLabels());
  737. font0.AttachDispatch(tickLabels.get_Font());
  738. font0.put_Size(_variant_t(4));
  739. font0.put_ColorIndex(_variant_t(3));
  740. font0.DetachDispatch();
  741. tickLabels.DetachDispatch();
  742. // x轴文本
  743. axisTitle.AttachDispatch(axis.get_AxisTitle());
  744. font0.AttachDispatch(axisTitle.get_Font());
  745. font0.put_Size(_variant_t(8));
  746. font0.DetachDispatch();
  747. axisTitle.put_Text((LPCTSTR)strX);
  748. axisTitle.DetachDispatch();
  749. axis.DetachDispatch();
  750. // 设置y轴
  751. axis.AttachDispatch(chart.Axes(_variant_t(xlValue), xlPrimary));
  752. axis.put_HasTitle(TRUE);
  753. // 设置字体 - y轴坐标文字
  754. tickLabels.AttachDispatch(axis.get_TickLabels());
  755. tickLabels.put_AutoScaleFont(_variant_t(TRUE));
  756. font0.AttachDispatch(tickLabels.get_Font());
  757. font0.put_Size(_variant_t(6));
  758. font0.put_ColorIndex(_variant_t(4));
  759. font0.DetachDispatch();
  760. tickLabels.DetachDispatch();
  761. // 设置y轴名称
  762. axisTitle.AttachDispatch(axis.get_AxisTitle());
  763. font0.AttachDispatch(axisTitle.get_Font());
  764. font0.put_Size(_variant_t(8));
  765. font0.DetachDispatch();
  766. axisTitle.put_Text((LPCTSTR)strY);
  767. axisTitle.DetachDispatch();
  768. axis.DetachDispatch();
  769. range.DetachDispatch();
  770. // 设置1号柱形图的颜色 索引由1开始
  771. CSeries series;
  772. series.AttachDispatch(chart.SeriesCollection(_variant_t(1)));
  773. Cnterior interior;
  774. interior.AttachDispatch(series.get_Interior());
  775. interior.put_ColorIndex(_variant_t(3));
  776. interior.DetachDispatch();
  777. series.DetachDispatch();
  778. chart.DetachDispatch();
  779. chartobject.DetachDispatch();
  780. chartobjects.DetachDispatch();
  781. }
  782. /*
  783. 字号 磅值 毫米
  784. 八号 5 1.76
  785. 七号 5.5 1.94
  786. 小六 6.5 2.29
  787. 六号 7.5 2.65
  788. 小五 9 3.18
  789. 五号 10.5 3.70
  790. 小四 12 4.23
  791. 四号 14 4.94
  792. 小三 15 5.29
  793. 三号 16 5.64
  794. 小二 18 6.35
  795. 二号 22 7.76
  796. 小一 24 8.47
  797. 一号 26 9.17
  798. 小初 36 12.70
  799. 初号 42 14.82
  800. */