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.
}