导出CListCtrl控件到Excel文件

CListCtrl获得列的属性可以使用BOOL CListCtrl::GetColumn( int nCol, LVCOLUMN* pColumn ),nCol为需要获得获得属性值的列序号,pColumn 为 LVCOLUMN 结构体的指针。LVCOLUMN结构体中的 UINT mask 作为输入,决定返回哪些属性的值,如果 mask 的值包含 LVCF_TEXT ,则需要将字符串缓存的首地址指针置入结构体中的 LPTSTR pszText; 变量,缓存大小置入 int cchTextMax; 变量。

使用这个函数的主要问题是主要问题期望返回 LVCF_TEXT ,设置了 pszText 却没有设置 cchTextMax 变量,并且通常都在分配 LVCOLUMN 结构体空间时将所分配的内存清0,因此总是不能返回列名。反而是没有清0所分配空间,直接设置 mask 为 LVCF_TEXT ,那么可能可以获得列名的值。当然只要正确设置 pszText 和 cchTextMax 就不会有这些问题。

还有一个问题是列的数量。没有直接的函数可以获得列的数量,只能从0开始不断自增 nCol 的值,判断 GetColumn( nCol,pColumn ) 的返回值是否为 False 以计算列的数量。

一封装好的导出CListCtrl数据函数如下:

01. /
02. //  void GetExcelDriver(CListCtrl* pList, CString strTitle)
03. //  参数:
04. //      pList       需要导出的List控件指针
05. //      strTitle    导出的数据表标题
06. //  说明:
07. //      导出CListCtrl控件的全部数据到Excel文件。Excel文件名由用户通过“另存为”
08. //      对话框输入指定。创建名为strTitle的工作表,将List控件内的所有数据(包括
09. //      列名和数据项)以文本的形式保存到Excel工作表中。保持行列关系。
10. // 
11. //  edit by [r]@dotlive.cnblogs.com
12.
13. void ExportListToExcel(CListCtrl* pList, CString strTitle)
14. {
15. CString warningStr;
16. if (pList->GetItemCount ()>0) {  
17. CDatabase database;
18. CString sDriver;
19. CString sExcelFile;
20. CString sSql;
21. CString tableName = strTitle;
22.  
23. // 检索是否安装有Excel驱动 "Microsoft Excel Driver (*.xls)"
24. sDriver = GetExcelDriver();
25. if (sDriver.IsEmpty())
26. {
27. // 没有发现Excel驱动
28. AfxMessageBox("没有安装Excel!\n请先安装Excel软件才能使用导出功能!");
29. return;
30. }
31.  
32. ///默认文件名
33. if (!GetDefaultXlsFileName(sExcelFile))
34. return;
35.  
36. // 创建进行存取的字符串
37. sSql.Format("DRIVER={%s};DSN='''';FIRSTROWHASNAMES=1;
38. READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s",sDriver,
39. sExcelFile, sExcelFile);
40.  
41. // 创建数据库 (既Excel表格文件)
42. if( database.OpenEx(sSql,CDatabase::noOdbcDialog) )
43. {
44. // 创建表结构
45. int i;
46. LVCOLUMN columnData;
47. CString columnName;
48. int columnNum = 0;
49. CString strH;
50. CString strV;
51.  
52. sSql = "";
53. strH = "";
54. columnData.mask = LVCF_TEXT;
55. columnData.cchTextMax =100;
56. columnData.pszText = columnName.GetBuffer (100);
57. for(i=0;pList->GetColumn(i,&columnData);i++)
58. {
59. if (i!=0)
60. {
61. sSql = sSql + ", " ;
62. strH = strH + ", " ;
63. }
64. sSql = sSql + " " + columnData.pszText +" TEXT";
65. strH = strH + " " + columnData.pszText +" ";
66. }
67. columnName.ReleaseBuffer ();
68. columnNum = i;
69.  
70. sSql = "CREATE TABLE " + tableName + " ( " + sSql +  " ) ";
71. database.ExecuteSQL(sSql);
72.  
73. // 插入数据项
74. int nItemIndex;
75. for (nItemIndex=0;nItemIndexGetItemCount ();nItemIndex++){
76. strV = "";
77. for(i=0;iGetItemText(nItemIndex,i) +"'' ";
78. }
79.  
80. sSql = "INSERT INTO "+ tableName
81. +" ("+ strH + ")"
82. +" VALUES("+ strV + ")";
83. database.ExecuteSQL(sSql);
84. }
85.  
86. }     
87.  
88. // 关闭数据库
89. database.Close();
90.  
91. warningStr.Format("导出文件保存于%s!",sExcelFile);
92. AfxMessageBox(warningStr);
93. }
94. }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值