修改开源xlslib使得支持输出UTF8中文Excel文件不乱码

    技术2022-05-20  70

    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附件


    最新回复(0)