zoukankan      html  css  js  c++  java
  • libxl库的介绍,对Excel操作封装得很好的一个库,兼容2007版和多字节字符(最后有破解版下载)

    前段时间忙着毕业论文,终于有时间写博客了。

    早些时候老大给我的一个任务需要对excel进行读表操作,研究了一下c++对excel的操作。

    对Excel的操作基本有com,ODBC,AD等,其中ODBC有一个封装的库CSpreadSheet,但它只能对2003版进行操作,不兼容2007版,然后我就找了一个收费的libxl的库,网上有破解版,它兼容2007版,而且提供的接口非常简单,重要的是兼容多字节的版本(网上说只兼容unicode版,我也不知道怎么回事)。

    我下的是libxl-3.1.0,函数的接口和说明在官网有:http://www.libxl.com/documentation.html;

    使用还是老样子 libxl.h , libxl.lib , libxl.dll  三个文件

    下面直接上例子:    //控制台,mfc库(因为我要对CString进行操作)

    // ExcelTest.cpp : 定义控制台应用程序的入口点。
    
    #include "stdafx.h"
    #include <Windows.h>
    #include"libxl.h"
    #pragma comment (lib,"libxl.lib")
    #include"ExcelTest.h"
    using namespace std;
    using namespace libxl;
    
    #define DLLCLASS_EXPORTS
    //中文的内容读出来后要进行编码的转换,这个为转换函数:wchar_t to char
    char *w2c(char *pcstr,const wchar_t *pwstr, size_t len)
    {
        int nlength=wcslen(pwstr);
        //获取转换后的长度
        int nbytes = WideCharToMultiByte( 0, 0, pwstr, nlength, NULL,0,NULL, NULL ); 
        if(nbytes>len)   nbytes=len;
        // 通过以上得到的结果,转换unicode 字符为ascii 字符
        WideCharToMultiByte( 0,0, pwstr, nlength,   pcstr, nbytes, NULL,   NULL );
        return pcstr ;
    }
    
    void myDllFunc(char *destStr)
    {
        libxl::IBookT<wchar_t>* book;
        bool retLoad;
        int i=0;
        cin>> i;
        if(i!=0)
        {
            book = xlCreateBookW();
            retLoad=book->load(L"E:\代码\ExcelTest\Debug\3.xls");
        }
        else
        {
            book = xlCreateXMLBookW();
            retLoad=book->load(L"E:\代码\ExcelTest\Debug\1.xlsx");
        }
    
        if(retLoad)
        {
            libxl::Sheet * sheet = book->getSheet(0);
            if(sheet){
                libxl::CellType celltype = sheet->cellType(0,0);
                switch(celltype)
                {
                case CELLTYPE_NUMBER:
                    {
                        double intmy =sheet->readNum(0,0);
                        char csNum[23]={};
                        sprintf(csNum,"num:%ld",intmy);
                        cout<<csNum<<endl;
                        break;
                    }
                case CELLTYPE_STRING:
                    {
                        cout<<"true
    ";
                        const wchar_t * t = sheet->readStr(0,0);
                        char *pcstr = (char *)malloc(sizeof(char)*(2 * wcslen(t)+1));
                        memset(pcstr , 0 , 2 * wcslen(t)+1 );
                        w2c(pcstr,t,2 * wcslen(t)+1);
                        cout<<"result:"<<pcstr<<endl;
                        cout<<strlen(pcstr)<<endl;
                        memcpy(destStr,pcstr,strlen(pcstr));
                        free(pcstr);
                        break;
                    }
                case libxl::CELLTYPE_EMPTY:
                    cout<<"true
    ";
                    break;
                }
            }        
            cout<<"flag
    ";
            cout<<sheet->lastRow()<<endl;
            cout<<sheet->lastCol()<<endl;
        }
    }
    
    int main()
    {
        char myy[23]={};
        while(1)
            myDllFunc(myy);
    }

     随便对它的一些接口进行了测试,大家试试就知道用法了。下面是破解版的下载地址:http://pan.baidu.com/s/1sjHIAT3

  • 相关阅读:
    [dubbo实战] dubbo+zookeeper伪集群搭建
    Spring中使用Map、Set、List、数组、属性集合的注入方法配置文件
    Docker实践
    docke镜像上传到dockerhub仓库和阿里云docker仓库的方法
    Linux chmod命令详解
    使用nexus搭建maven私服
    Zookeeper注册节点的掉线自动重新注册及测试方法
    Dubbo负载均衡策略
    各种排序算法及其java程序实现
    java中的各种数据类型在内存中存储的方式
  • 原文地址:https://www.cnblogs.com/sixbeauty/p/3757712.html
Copyright © 2011-2022 走看看