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 65536
- int 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附件。 |