修改開源xlslib使得支持輸出UTF8中文Excel文件不亂碼

http://xlslib.sourceforge.net


修改開源xlslib使得支持輸出UTF8中文Excel文件內容不亂碼
在Ubuntu 64位環境下測試通過。
希望大家支持。

  1. /*
  2. * 在xlslib/src/sheetrec.h中增加如下代碼
  3. */
  4. cell_t* label(int code, unsigned16_t row, unsigned16_t col, const std::ustring& strlabel, xf_t* pxformat = NULL);
  5. cell_t* label(int code, unsigned16_t row, unsigned16_t col, const char* strlabel, xf_t* pxformat = NULL);
  6. /*
  7. * 在xlslib/src/sheetrec.cpp中增加如下代碼
  8. */
  9. cell_t* worksheet::label(int code, unsigned16_t row, unsigned16_t col, 
  10.                          const ustring& strlabel, xf_t* pxformat)
  11. {
  12.         enum { UTF8, GBK };
  13.         u16string str16;
  14.         label_t* lbl;
  15.         u16string::const_iterator u16begin, u16end;
  16.         ustring::const_iterator ubegin, uend;
  17.         size_t len;
  18.         
  19.         if (code == UTF8) {
  20.                 len = strlabel.length();
  21.                 str16.reserve(len);
  22.                 ubegin = strlabel.begin();
  23.                 uend = strlabel.end();
  24.         
  25.                 while(ubegin != uend) {
  26.                         unichar_t c;
  27.                         c = *ubegin++;
  28.                         str16.push_back(c);        
  29.                 }
  30.                 lbl = new label_t(m_GlobalRecords, row, col, str16, pxformat);
  31.                 AddCell((cell_t*)lbl);
  32.                 return (cell_t*)lbl;
  33.         } else {
  34.                 return NULL;
  35.         }
  36. }
  37. cell_t* worksheet::label(int code, unsigned16_t row, unsigned16_t col, 
  38.                          const char* strlabel, xf_t* pxformat)
  39. {
  40.         enum { UTF8, GBK };
  41.         unsigned16_t u16;
  42.         u16string str16;
  43.         label_t* lbl;
  44.         wstring::const_iterator wbegin, wend;
  45.         size_t len;
  46.         
  47.         if (code == UTF8) {
  48.                 if (strlabel == NULL) {
  49.                         return NULL;
  50.                 } else {
  51.                         len = strlen(strlabel);
  52.                         wchar_t wcs[len+1];
  53.                         mbstowcs(wcs, strlabel, len+1);
  54.                         len = wcslen(wcs);
  55.                         for (int i = 0; i < len; i++) {
  56.                                 u16 = wcs[i];
  57.                                 str16.push_back(u16);
  58.                         }
  59.                 }
  60.                 lbl = new label_t(m_GlobalRecords, row, col, str16, pxformat);
  61.                 AddCell((cell_t*)lbl);
  62.                 return (cell_t*)lbl;
  63.         } else {
  64.                 return NULL;
  65.         }
  66. }
複製代碼
這樣來使用:
  1. #include <locale.h>
  2. #include "ocilib.h"
  3. #include "xlslib.h"
  4. using namespace xlslib_core;
  5. #define RECORDCOUNT                65536
  6. int main(int argc, char *argv[])
  7. {
  8.         setlocale(LC_ALL, "zh_CN.utf-8");
  9.         enum { UTF8, GBK };
  10.         workbook wb1, wb2;
  11.         worksheet* wb1sh1 = wb1.sheet("Sheet1");
  12.         worksheet* wb2sh1 = wb2.sheet("Sheet1");
  13.         int row = 0, coloumn = 0;
  14.         if (argc != 4) {
  15.                 printf("Example: ./demo SID USER PASSWORD/n");
  16.                 return 0;
  17.         }
  18.         OCI_Connection* cn;
  19.     OCI_Statement* st;
  20.     OCI_Resultset* rs;
  21.     OCI_Initialize(NULL, NULL, OCI_ENV_DEFAULT);
  22.     cn = OCI_ConnectionCreate(argv[1], argv[2], argv[3], OCI_SESSION_DEFAULT);
  23.     st = OCI_StatementCreate(cn);
  24.     OCI_ExecuteStmt(st, "select * from t_test_a");
  25.     rs = OCI_GetResultset(st);
  26.     while (OCI_FetchNext(rs))
  27.     {
  28.                 if (row < RECORDCOUNT) {
  29.                         wb1sh1->label(UTF8, row, coloumn,        OCI_GetString(rs, 1));
  30.                         wb1sh1->label(UTF8, row, coloumn+1,        OCI_GetString(rs, 5));
  31.                         wb1sh1->label(UTF8, row, coloumn+2,        OCI_GetString(rs, 6));
  32.                 } else {
  33.                         wb2sh1->label(UTF8, row-RECORDCOUNT, coloumn,        OCI_GetString(rs, 1));
  34.                         wb2sh1->label(UTF8, row-RECORDCOUNT, coloumn+1, OCI_GetString(rs, 5));
  35.                         wb2sh1->label(UTF8, row-RECORDCOUNT, coloumn+2, OCI_GetString(rs, 6));
  36.                 }
  37.                 printf("/r%d", row+1);
  38.                 fflush(stdout);
  39.                 row++;
  40.     }
  41.         printf("/n");
  42.         wb1.Dump("./demo1.xls");
  43.         wb2.Dump("./demo2.xls");
  44.     OCI_Cleanup();
  45.     return EXIT_SUCCESS;
  46. }
複製代碼
最後附上一個自己寫的用ocilib和xlslib的demo附件。

ocilibxlslibdemo.tar.gz (57.44 KB)

 

 

最後附上一個自己寫的用ocilib和xlslib的demo附件

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章