excel是很常用的表格工具。不过,对程序员来说,这可不是件好事件。因为excel的数据既不像txt那样,随意一种语言、脚本,写个函数就能把数据读出来分析。也不像JSON这种开源的数据格式,有N多的开源库来读取。就算没有,知道数据格式,自己写个库也自己用不至于太难。
要想读取excel的数据,大多使用ODBC数据库驱动或者COM的方式。对于ODBC,不同的语言有不同的实现,如java的JDBC。而对于COM方式,几乎是在后台运行一个excel程序,像new Excel.Application(),相当于用自己的程序,去控制别人的程序。逻辑不是自己实现的,不能完全控制,总不大好。
一开始我想用Qt通过ODBC驱动来读取。代码如下:
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC","excelexport");
if( !db.isValid())
return; //! type error
QString dsn = "DRIVER={Microsoft Excel Driver (*.xls)};"
"DSN='';FIRSTROWHASNAMES=0;READONLY=FALSE;CREATE_DB=\"item.xls\";DBQ=item.xls";
db.setDatabaseName(dsn);
// open connection
if( !db.open())
{
qDebug()<<"error";
return; //! db error
}
qDebug()<<db.tables(QSql::AllTables);
qDebug()<<db.tables(QSql::Tables);
qDebug()<<db.tables(QSql::SystemTables);
qDebug()<<db.tables(QSql::Views);
测试文件item.xls里有item、award两个sheet,但是输出却如下:
("award$", "item$", "item$_")
()
()
()
我一直没搞明白item$_这个表是怎么出现的。是我的参数不对,还是逻辑错误,还是本身Qt对Excel的数据库驱动有问题???知道的还请多多指教。
Qt没做成功,后来找到了python。因为python有个开源(BSD License)的库xlrd(也许其他语言也有,只是我孤陋寡闻),专门读取excel数据。试了一下,感觉还很不错。
下载python:https://www.python.org/
下载xlrd:https://pypi.python.org/pypi/xlrd
xlrd帮助文档:http://www.python-excel.org/
基本代码一例(在帮助文档里该有的都有了,别告诉我说看不懂):
from xlrd import open_workbook,cellname
book = open_workbook('odd.xls')
sheet = book.sheet_by_index(0)
print sheet.name
print sheet.nrows
print sheet.ncols
for row_index in range(sheet.nrows):
for col_index in range(sheet.ncols):
print cellname(row_index,col_index),'-',
print sheet.cell(row_index,col_index).value
其实在http://www.python-excel.org/上可以看到,xlrd、xlwt都属于xlutils,xlrd是读excel文件,xlwt是写excel文件。xlutils则是两都的合并。