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則是兩都的合並。