http://xlslib.sourceforge.net
修改开源xlslib使得支持输出UTF8中文Excel文件内容不乱码。在Ubuntu 64位环境下测试通过。希望大家支持。
/** 在xlslib/src/sheetrec.h中增加如下代码*/cell_t* label(int code, unsigned16_t row, unsigned16_t col, const std::ustring& strlabel, xf_t* pxformat = NULL);cell_t* label(int code, unsigned16_t row, unsigned16_t col, const char* strlabel, xf_t* pxformat = NULL);/** 在xlslib/src/sheetrec.cpp中增加如下代码*/cell_t* worksheet::label(int code, unsigned16_t row, unsigned16_t col, const ustring& strlabel, xf_t* pxformat){ enum { UTF8, GBK }; u16string str16; label_t* lbl; u16string::const_iterator u16begin, u16end; ustring::const_iterator ubegin, uend; size_t len; if (code == UTF8) { len = strlabel.length(); str16.reserve(len); ubegin = strlabel.begin(); uend = strlabel.end(); while(ubegin != uend) { unichar_t c; c = *ubegin++; str16.push_back(c); } lbl = new label_t(m_GlobalRecords, row, col, str16, pxformat); AddCell((cell_t*)lbl); return (cell_t*)lbl; } else { return NULL; }}cell_t* worksheet::label(int code, unsigned16_t row, unsigned16_t col, const char* strlabel, xf_t* pxformat){ enum { UTF8, GBK }; unsigned16_t u16; u16string str16; label_t* lbl; wstring::const_iterator wbegin, wend; size_t len; if (code == UTF8) { if (strlabel == NULL) { return NULL; } else { len = strlen(strlabel); wchar_t wcs[len+1]; mbstowcs(wcs, strlabel, len+1); len = wcslen(wcs); for (int i = 0; i < len; i++) { u16 = wcs[i]; str16.push_back(u16); } } lbl = new label_t(m_GlobalRecords, row, col, str16, pxformat); AddCell((cell_t*)lbl); return (cell_t*)lbl; } else { return NULL; }} 复制代码 这样来使用: #include <locale.h>#include "ocilib.h"#include "xlslib.h"using namespace xlslib_core;#define RECORDCOUNT 65536int main(int argc, char *argv[]){ setlocale(LC_ALL, "zh_CN.utf-8"); enum { UTF8, GBK }; workbook wb1, wb2; worksheet* wb1sh1 = wb1.sheet("Sheet1"); worksheet* wb2sh1 = wb2.sheet("Sheet1"); int row = 0, coloumn = 0; if (argc != 4) { printf("Example: ./demo SID USER PASSWORD/n"); return 0; } OCI_Connection* cn; OCI_Statement* st; OCI_Resultset* rs; OCI_Initialize(NULL, NULL, OCI_ENV_DEFAULT); cn = OCI_ConnectionCreate(argv[1], argv[2], argv[3], OCI_SESSION_DEFAULT); st = OCI_StatementCreate(cn); OCI_ExecuteStmt(st, "select * from t_test_a"); rs = OCI_GetResultset(st); while (OCI_FetchNext(rs)) { if (row < RECORDCOUNT) { wb1sh1->label(UTF8, row, coloumn, OCI_GetString(rs, 1)); wb1sh1->label(UTF8, row, coloumn+1, OCI_GetString(rs, 5)); wb1sh1->label(UTF8, row, coloumn+2, OCI_GetString(rs, 6)); } else { wb2sh1->label(UTF8, row-RECORDCOUNT, coloumn, OCI_GetString(rs, 1)); wb2sh1->label(UTF8, row-RECORDCOUNT, coloumn+1, OCI_GetString(rs, 5)); wb2sh1->label(UTF8, row-RECORDCOUNT, coloumn+2, OCI_GetString(rs, 6)); } printf("/r%d", row+1); fflush(stdout); row++; } printf("/n"); wb1.Dump("./demo1.xls"); wb2.Dump("./demo2.xls"); OCI_Cleanup(); return EXIT_SUCCESS;} 复制代码 最后附上一个自己写的用ocilib和xlslib的demo附件。ocilibxlslibdemo.tar.gz (57.44 KB)
最后附上一个自己写的用ocilib和xlslib的demo附件