免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 9633 | 回复: 3
打印 上一主题 下一主题

修改开源xlslib使得支持输出UTF8中文Excel文件不乱码 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-08-30 08:56 |只看该作者 |倒序浏览
本帖最后由 戴东官 于 2010-08-31 09:41 编辑

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, 下载次数: 207

论坛徽章:
0
2 [报告]
发表于 2010-08-30 21:05 |只看该作者
这个好
//

论坛徽章:
0
3 [报告]
发表于 2010-08-31 11:20 |只看该作者

论坛徽章:
0
4 [报告]
发表于 2012-03-13 19:45 |只看该作者
说实话,和我想的不太一样……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP