一、简介

  xlslib库是用来创建excel文件、libxls是用来读取excel文件的,在使用C++或者QT语言来设计对excel文件的读取。都需要事先下载这两个库编译成功后再进行程序设计的。之所以选择这两个库来使用,是因为这两个库即可以在windows系统下使用,又可以在Linux系统下使用。对于设计跨平台使用的程序来说这两个库是一个不错的选择。xlslib源码生成动(xlslib.dll)/静(xlslib.lib)态库的具体的编译方法,网上有很多资源,再次不在赘述。本文注重介绍libxls库的生成方法。

二、libxls库的生成方法

  1、首先下载cygwin,32位操作系统下载setup-x86.exe,64位电脑下载setup-x86_64.exe。

  2、安装cygwin下的编译环境
    编译x86链接库安装以下组件:
        Devel下的make、mingw64-i686-binutils、mingw64-i686-gcc-core、mingw64-i686-gcc-g++、mingw64-i686-win-iconv

      编译x64链接库安装以下组件:
      Devel下的make、mingw64-x86_64-binutils、mingw64-x86_64-gcc-core、mingw64-x86_64-gcc-g++、mingw64-x86_64-win-iconv

  3、下载libxls(1.4.0版本)源码:

  4、打开cygwin(默认当前路径为/home/Administrator),使用cd libxls命令将当前文件路径切换到源码所在文件夹,执行下面命令进行configure配置:
        32位:   CC='i686-w64-mingw32-gcc' ./configure --host=i686-w64-mingw32 --build=i686-w64-mingw32
        64位:   CC='x86_64-w64-mingw32-gcc' ./configure --host=x86_64-w64-mingw32 --build=x86_64-w64-mingw32

  5、前面步骤正确的话,步骤4中的配置就会成功并生成必须的makefile文件,执行“make && make install”来进行编译安装了。

  6、只要make没报错,我们就能在$(cygwin_home)/usr/local/libxls下即可看到安装成果($(cygwin_home)是指cygwin的安装目录)。
        安装成果中的bin目录只有xls2csv.exe,但是没法成功运行,原因就如提示一样:缺少iconv.dll。
        x86:拷贝\usr\i686-w64-mingw32\sys-root\mingw\bin下的iconv.dll;
        x64:拷贝\usr\x86_64-w64-mingw32\sys-root\mingw\bin下的iconv.dll即可正常运行。
        安装成果中的lib目录只有libxlsreader.a和libxlsreader.la,并没有我们需要的dll和lib文件。不过可以利用.a文件最终转换出运行需要的dll、链接需要的lib及def文件。

  7、接下来我们利用安装成果中的libxlsreader.a来生成我们需要的dll、lib和def文件。
     (1)x86:在cygwin命令行下执行“i686-w64-mingw32-ar x libxlsreader.a”提取a中的.o文件
      x64:在cygwin命令行下执行“x86_64-w64-mingw32-ar x libxlsreader.a”提取a中的.o文件
     (2)然后利用.o文件来生成dll和def文件,具体命令如下:
                  x86:i686-w64-mingw32-gcc -shared -o libxls.dll *.o -Wl,--export-all-symbols,--output-def,libxls.def -liconv
               x64:x86_64-w64-mingw32-gcc -shared -o libxls.dll *.o -Wl,--export-all-symbols,--output-def,libxls.def -liconv
     (3)利用dll和def通过visual studio的lib来得到链接需要的lib文件,打开visual studio 命令提示,然后切换目录到dl所在目录并执行:
     x86:lib /machine:X86 /def:libxls.def
       x64:lib /machine:X64 /def:libxls.def

  8、至此大功告成,我们得到了x86和x64两个版本的libxls链接库(dll&lib),而且中文也能正常支持。接下来我们就可以愉快地封装和使用libxls库了

三、使用示例

  本程序中我对这两个库做了简易的封装,生成了两个动态库,主要功能就是对excel文件的创建写入和读取显示。

xlslib库的封装

createxcel_global.h文件

#ifndef CREATEXCEL_GLOBAL_H
#define CREATEXCEL_GLOBAL_H#ifdef QEXCEL__API_EXPORTS
# define QEXCEL__API _declspec(dllexport)
#else
# define QEXCEL__API _declspec(dllimport)
#endif#endif // QEXCEL_GLOBAL_H

createxcel.h文件

#ifndef QEXCEL_H
#define QEXCEL_H#include "createxcel_global.h"
#include <QString>
#include <sstream>
#include <string>
#include "xlslib.h"
using namespace std;
using namespace xlslib_core;
class QEXCEL__API QEXCEL
{
public:QEXCEL();~QEXCEL();void CreateWorkSheet(QString SheetName); //创建表格void SaveExcelFile(QString FileName);  //保存工作簿void SetCellNumber(int row,int col,int number); //设置序号void SetCellText(int row,int col,QString text,bool setFont); //设置文本信息void SetCellSize(int row,int col,int row_width ,int col_hight); //设置单元格大小void SetCellCenter(); //设置单元格格式居中void SetCellLeft(); //设置单元格格式靠左居中void MergeCells(int begin_row,int begin_col,int end_row,int end_col);  //合闭单元格// void SetFontSize(int Fontsize);public:// 单元格cell_t * cell;font_t * _font;xf_t * xf;
private:// 工作簿
    workbook pWB;// 工作表worksheet *pWS;
};#endif // QEXCEL_H

createxcel.cpp文件

#include "createxcel.h"
#include <stdio.h>
#pragma comment(lib, ".\\lib\\xlslib_lib.lib")
QEXCEL::QEXCEL()
{pWS = NULL;cell = NULL;_font = NULL;xf = NULL;
}QEXCEL::~QEXCEL()
{}void QEXCEL::CreateWorkSheet( QString SheetName )
{string sheetname = string((const char *)SheetName.toLocal8Bit());  //Qstring 转换成StringpWS = pWB.sheet(sheetname);pWS->defaultColwidth(25);  //设置默认列宽pWS->defaultRowHeight(15);  //设置默认行高_font = pWB.font("Arial");_font->SetBoldStyle(BOLDNESS_BOLD);  // 设置粗字体_font->SetHeight(220);              //设置字体大小11
xf = pWB.xformat();xf->SetFont(_font);xf->SetFillBGColor(CLR_WHITE);xf->SetFillFGColor(CLR_RED);pWS->MakeActive();}void QEXCEL::SaveExcelFile( QString FileName )
{string filename = string((const char *)FileName.toLocal8Bit());pWB.Dump(filename);}void QEXCEL::SetCellText( int row,int col,QString text,bool setFont )
{string value = string((const char *)text.toLocal8Bit());//xlslib_strings::ustring value = text.toStdWString();if (setFont == true)   //显示为粗体
    {cell = pWS->label(row, col,value/* L"中国"*/,xf); }else{cell = pWS->label(row, col, value,NULL);}}void QEXCEL::SetCellNumber( int row,int col,int number )
{stringstream oss;string Num;oss << number;oss >> Num;        cell = pWS->label(row, col, Num,NULL);
}void QEXCEL::SetCellSize( int row,int col,int row_width ,int col_hight )
{if(row_width!=0){pWS->rowheight(row,row_width);}if (col_hight!=0){pWS->colwidth(col,col_hight);}
}void QEXCEL::SetCellCenter()
{cell->halign(HALIGN_CENTER);   //单元格水平方向居中cell->valign(VALIGN_CENTER);  //单元格垂直方向居中

}void QEXCEL::SetCellLeft()
{cell->halign(HALIGN_LEFT);  //单元格水平方向靠左cell->valign(VALIGN_CENTER);
}void QEXCEL::MergeCells( int begin_row,int begin_col,int end_row,int end_col )
{pWS->merge(begin_row,begin_col,end_row,end_col);  //合并单元格

}

libxls库的封装

readexcel_global.h 文件

#ifndef QLIBCOMMON_GLOBAL_H
#define QLIBCOMMON_GLOBAL_H
#ifdef QLibCommon_API_EXPORTS
#define QLibCommon_API _declspec(dllexport)
#else
#define QLibCommon_API _declspec(dllimport)
#endif#endif // QLIBCOMMON_GLOBAL_H

ReadExcel.h 文件

#ifndef CSKQEXCELCOMMOM_H
#define CSKQEXCELCOMMOM_H#include "readexcel_global.h"#include <QString>#include "xls.h"
using namespace xls;
class QLibCommon_API ReadExcel
{
public:ReadExcel(QString strpath);~ReadExcel();// 工作簿xlsWorkBook* getworkbooks();// 工作表xlsWorkSheet* selectSheet(int sheetIndex);//获取工作表数量int getSheetsCount();//获取工作表名称QString getSheetName(int sheetIndex);//获取工作表单元格内容QString getCellValue(int row, int column);//获取单元表行数int getUsedRowsCount();//获取单元表列数int getUsedColsCount();//关闭工作表void closeSheet();//关闭工作簿void closeWorkBook();
private:// 工作簿xlsWorkBook *pWB;// 工作表xlsWorkSheet *pWS;// 单元格xlsCell * cell;};#endif // CSKQEXCELCOMMOM_H

ReadExcel.cpp 文件

#include "ReadExcel.h"
#pragma comment(lib, ".\\lib\\libxls.lib")ReadExcel::ReadExcel( QString strpath )
{pWB = NULL;pWS = NULL;cell = NULL;///qstring转换为const char */
    //方法一std::string str = strpath.toStdString();const char* path = str.c_str();//方法2
//     const char* path;
//     QByteArray ba = strpath.toLatin1();
//     path=ba.data();//pWB = xls_open(path, "GBK");if (!pWB){printf("Open File Error! pWB\n"/*,pWB*/);return ;}else{xls_parseWorkBook(pWB);}
}ReadExcel::~ReadExcel()
{}xlsWorkBook* ReadExcel::getworkbooks()
{return pWB;
}xlsWorkSheet* ReadExcel::selectSheet(int sheetIndex)
{
// 获取工作表(第几个工作表)pWS = xls_getWorkSheet(pWB,sheetIndex);
// 解析工作表
   xls_parseWorkSheet(pWS);return pWS;
}int ReadExcel::getSheetsCount()
{return pWB->sheets.count;
}QString ReadExcel::getSheetName( int sheetIndex )
{return (char *)pWB->sheets.sheet[sheetIndex].name;
}QString ReadExcel::getCellValue( int row, int column )
{cell = xls_cell(pWS, row-1, column-1); //行列起始号为1// 判断单元格及内容是否为空if (cell && cell->str){return (char *)cell->str;    }
}int ReadExcel::getUsedRowsCount()
{return pWS->rows.lastrow;
}

int ReadExcel::getUsedColsCount()
{return pWS->rows.lastcol;
}void ReadExcel::closeSheet()
{//关闭表格
    xls_close_WS(pWS);cell = NULL;pWS = NULL;}void ReadExcel::closeWorkBook()
{// 关闭工作簿
    xls_close_WB(pWB);pWB = NULL;}

转载于:https://www.cnblogs.com/chenshikun/p/6279806.html

对xlslib库与libxls库的简易封装相关推荐

  1. vs2008中xlslib与libxls库的编译及使用

    C++用来操作Excel的方法很多,但是涉及到跨平台,同时又要对Excel的读写操作兼顾,而且免费的库,那应该是要用xlslib和libxls了.由于技术比较菜,折腾这个折腾了一个星期了.最开始是使用 ...

  2. linux libxls xls_open 中文,Linux/Mingw Excel (*.xls)文件读取,使用libxls库

    做个项目需要读取xls文件,通过搜索,找到三个库,BasicExcel.libxl.libxls. 因为BasicExcel不支持中文,而且06年就没更新了,果断放弃.libxl感觉是这三个库中最好的 ...

  3. spdlog 日志库学习,简易封装

    spdlog wiki:https://github.com/gabime/spdlog/wiki 别人的学习笔记:https://www.cnblogs.com/oucsheep/p/8426548 ...

  4. Rust 每天一库系列 Ftp 库

    基础的还不是很牢固,还是写点代码比较好 FTP 作为基础还是不错的 1. First build ftp server on windows 1.1 使用 python3 ftpd 服务库 pip i ...

  5. [转载] JAVA从菜鸟【入门】到新手【实习】一一一一Python 内置函数,标准库与第三方库(拓展库),常用框架

    参考链接: copyreg -注册pickle支持的函数 掌握了python的基本语法和面向对象的设计思想后是学习了程序设计的"使用"规则, 具体实现和调用要依赖"标准库 ...

  6. C++库和C库的区别

    C++标准库非常大.在C++标准中,关于标准库的规格说明占了密密麻麻300多页,这还不包括标准C库,后者只是 "作为参考"包含在C++库中. 当然,并非总是越大越好,但在现在的情况 ...

  7. 【STM32】STM32标准库与HAL库对照学习教程特别篇--系统时钟RCC详讲

    [STM32]STM32标准库与HAL库对照学习教程特别篇--系统时钟RCC详讲 一.前言 二.时钟是什么 三.时钟树 1.时钟树图 2.时钟树讲解 左边部分 中间部分 右边部分 特殊部分 四.初始化 ...

  8. linux代码动态分析软件,举例分析Linux动态库和静态库

    函数库分为静态库和动态库两种.创建Linux静态库和Linux动态库和使用它们在这里将以举例的形式详述一下.静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库.动态库在程序编译时并不 ...

  9. 怎样用python画雪花_python使用turtle库与random库绘制雪花

    本文实例为大家分享了python绘制雪花的具体代码,供大家参考,具体内容如下 代码非常容易理解,画着玩玩还是可以的.直接上代码 # -*- coding: utf-8 -*- "" ...

最新文章

  1. Java内存模型深度剖析
  2. 窗口函数(防忘笔记)
  3. 关于BGP的notification错误码的解释
  4. java 实例化对象的几种姿势
  5. 发动机的工作原理,你知道吗?
  6. linux c 子线程sleep,linux c之sleep的多种实现
  7. 此表单只能填写一次_暴雪战网国服账号修改邮箱只能填写表单申请
  8. c语言检查密码是否出现回文,C程序检查数字是否为回文
  9. php socket_create_listen(),socket_create_listen()
  10. delphi 调用 c# 写的webservice
  11. SQL SERVER中查询无主键的SQL
  12. 嵌入式linux使用opencv,OpenCV嵌入式移植后XML读取问题及解决
  13. kafka生产者集群和分区,消费者轮询接收
  14. MySql存储过程的操作
  15. python校园排课选课系统毕业设计开题报告
  16. 动态规划之流水作业调度问题
  17. 【华为诺亚方舟实验室】2022届毕业生招聘--决策(强化学习)推理方向
  18. 高防服务器有哪些优势
  19. java 微秒 时间_Java中时间的计算 年月日小时分钟秒毫秒微秒
  20. 杜洋的《入门PCB设计》笔记

热门文章

  1. idea开发工具右侧没有maven工具栏
  2. Normalization of Database——数据库的正规化
  3. 破局与进阶,科大讯飞的新武器“讯飞阅读”
  4. C++ 冒泡排序时间复杂度测试
  5. vulnhub-CH4INRULZ
  6. Unity Asset Adventure Creator v1.75.5
  7. OpenSquare 9月项目月报
  8. 如何理解静态语言和动态语言
  9. 简单理解vuex原理
  10. 电子表格分析简单案例