如果你在做一个报表类的程序,可能将内容导出为
Excel
文件是一项必须的功能。之前使用
MFC
的时候我就写过一个类,用于将
grid
中的数据导出为
Excel
文件。在使用了
QtSql
模块后,我很容易的将这个类改写应用在
Qt
程序中。类的名字叫“
ExportExcelObject
”。使用起来很简单:
- // 1. declare an object
- // – fileName Excel 文件路径
- // – sheetName Excel 工作表(sheet)名称
- // – tableView 需要导出的QTableView指针
- ExportExcelObject obj(fileName, sheetName, tableView);
- // 2. define fields (columns) to the Excel sheet file
- // – 第1个参数是QTableView的列
- // – 第2个参数是对应该列的Excel sheet中的列名
- // – 第3个参数是该列的类型,可以使用char(x) (x最大255),int,datetime, 等
- obj.addField(1, tr("name"
),
"char(60)"
);
- obj.addField(2, tr("ID"
),
"int"
);
- obj.addField(3, tr("time"
),
" datetime "
);
- // 3. 该类有特定的SIGNAL用于连接一个progress控件,可以显示导出进度
- connect(&obj, SIGNAL(exportedRowCount(int
)), progressBar, SLOT(setValue(
int
)));
- // 4. do the work
- int
retVal = obj.export2Excel();
- if
(retVal > 0)
- {//done
- }
- else
- {//something wrong
- }
// 2. define fields (columns) to the Excel sheet file
// – 第1个参数是QTableView的列
// – 第2个参数是对应该列的Excel sheet中的列名
// – 第3个参数是该列的类型,可以使用char(x) (x最大255),int,datetime, 等
obj.addField(1, tr("name"), "char(60)");
obj.addField(2, tr("ID"), "int");
obj.addField(3, tr("time"), " datetime ");
// 3. 该类有特定的SIGNAL用于连接一个progress控件,可以显示导出进度
connect(&obj, SIGNAL(exportedRowCount(int)), progressBar, SLOT(setValue(int)));
// 4. do the work
int retVal = obj.export2Excel();
if(retVal > 0)
{//done
}
else
{//something wrong
}
那么这个类是怎样实现的呢?
1.
将
Excel
文件当成是一个数据库
使用
MS
的
ODBC
或
ADO
都可以将
Excel
文件当做一个数据库,那么我们只需要使用下面这个
DSN
连接串去创建并连接至该
Excel
文件:
- QString dsn = QString(
"DRIVER={Microsoft Excel Driver (*.xls)};DSN=''; FIRSTROWHASNAMES=1;;CREATE_DB=/"%1/";DBQ=%2"
).
- arg(excelFilePath).arg(excelFilePath);
2.
将
Excel
的工作表(
sheet
)当成是一个数据库表
可以使用
SQL
语句
“CREATE TABLE”
去创建一个工作表。
3.
向表中插入数据
使用
SQL
的“
INSERT
”语句插入数据。
4.
Unicode
支持
是的,列名和数据都支持
Unicode
。
我写了个例子用于演示这个类(下载
)。这个程序在
WinXP/Vista/7
都可正常运行。这个程序并不需要你的电脑上安装了
Excel
,因为
{Microsoft Excel Driver (*.xls)}
从
Windows 2000
开始就是系统自带支持的。