修改开源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附件

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
libxlsxlslib 都是用于读 Excel xls 文件的 C++ 库。 libxls 是一个开源的 C 语言库,用于读取 Excel xls 文件。它可以读取 Excel 97-2003 格式的 xls 文件,并提供了一些基本的 API,如打开 xls 文件、读取单元格数据、获取工作表名称等。 以下是一个使用 libxls 的简单示例: ``` xlsWorkBook* pWorkbook = xls_open("test.xls", "UTF-8"); xlsWorkSheet* pWorksheet = xls_getWorkSheet(pWorkbook, 0); int row = 0, col = 0; xlsCell* pCell = NULL; for (row = 0; row <= pWorksheet->rows.lastrow; ++row) { for (col = 0; col <= pWorksheet->rows.lastcol; ++col) { pCell = xls_cell(pWorksheet, row, col); if (pCell) { printf("cell(%d, %d): %s\n", row, col, pCell->str); } } } xls_close(pWorkbook); ``` xlslib 是一个 C++ 库,用于创建和操作 Excel xls 格式的电子表格文件。它支持创建、读取和修改 Excel xls 文件,并提供了一些高级的 API,如设置单元格格式、插入图片等。 以下是一个使用 xlslib 的简单示例: ``` xlslib::Workbook* pWorkbook = xlslib::Workbook::Create("test.xls"); xlslib::Worksheet* pWorksheet = pWorkbook->GetWorksheet("Sheet1"); pWorksheet->Label(1, 1, "Name"); pWorksheet->Label(1, 2, "Age"); pWorksheet->Label(2, 1, "John"); pWorksheet->Number(2, 2, 30); pWorkbook->Save(); ``` 需要注意的是,xlslib支持 Excel xls 格式的文件,不支持 xlsx 格式。如果需要读 xlsx 格式的文件,可以考虑使用其他库,如 libxlsxwriter 或 OpenXML SDK。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值