对xlslib库与libxls库的简易封装

一、简介

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

二、使用示例

  本程序中我对这两个库做了简易的封装,生成了两个动态库,主要功能就是对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 转换成String
   pWS = 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;

}

#include "qexcel.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 转换成String
   pWS = 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);  //合并单元格

}

时间: 2024-10-10 22:59:59

对xlslib库与libxls库的简易封装的相关文章

linux c: 静态库和动态库的生成和使用

场景: main函数需要两个接口,一个求和函数,一个打印函数. int sum(int i, int j); 求两个int数字的和. void show(int i, char* name); 打印i的值和它的名称. 现在,需要制作: 一个静态库libcalc.a,提供sum的接口; 一个动态库libshow.so,提供show的接口. #include <stdio.h> #include "calc.h" #include "show.h" int

静态库和动态库的分析

本质上来说库是一种可执行代码的二进制形式. linux下的库有两种:静态库和共享库(动态库) 静态库在程序编译时会被连接到目标代码中:程序运行时将不再需要该静态库,因此体积较大. 优点:程序运行时将不再需要该静态库 缺点:可执行文件的体积较大. 相同的库可能会需要被多次加载. 静态库: libxxxxx.a 动态库:动态库在程序编译时并不会被连接到目标代码中, 优点: 在程序运行时动态库才会被载入内存,因此代码体积较小. 缺点: 因此在程序运行时还需要动态库存在. 静态库的制作:将功能函数编译成

iOS 中的静态库与动态库,区别、制作和使用

如果我们有些功能要给别人用,但是又不想公开代码实现,比如高德地图.第三方登录分享等等,这时候我们就要打包成库了.库分静态库和动态库两种: 静态库:以.a 和 .framework为文件后缀名.动态库:以.tbd(之前叫.dylib) 和 .framework 为文件后缀名. 静态库与动态库的区别 静态库:链接时会被完整的复制到可执行文件中,被多次使用就有多份拷贝.动态库:链接时不复制,程序运行时由系统动态加载到内存,系统只加载一次,多个程序共用(如系统的UIKit.framework等),节省内

STM32 寄存器库和固件库

寄存器和固件库开发的差别和联系 固件库就是函数的集合,固件库函数的作用是向下负责与寄存器直接打交道.向上提供用户函数调用的接口(API). 在 51 的开发中我们经常的作法是直接操作寄存器,比方要控制某些 IO 口的状态,我们直 接操作寄存器: P0=0x11; 而在 STM32 的开发中,我们相同能够操作寄存器: GPIOx->BRR = 0x0011; 这样的方法当然能够,可是这样的方法的劣势是你须要去掌握每一个寄存器的使用方法.你才干正确使用 STM32,而对于 STM32 这样的级别的

linux上静态库和动态库的编译和使用(附外部符号错误浅谈)

主要参考博客gcc创建和使用静态库和动态库 对于熟悉windows的同学,linux上的静态库.a相当于win的.lib,动态库.so相当于win的.dll. 首先简要地解释下这两种函数库的区别,参考<Linux程序设计> 1. 静态库也被称为归档文件(archive,因此创建命令是ar),编译器和链接器负责将程序代码和静态库结合在一起组成单独的可执行文件: 但是缺点是许多应用程序同时运行并使用来自同一个静态库的函数时,内存中就会有一个函数的多份副本,而且程序文件自身也有多份同样的副本,这将消

Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf 动态库的后缀为*.so 静态库的后缀为 libxxx.a ldconfig 目录名

Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf  动态库的后缀为*.so  静态库的后缀为 libxxx.a   ldconfig   目录名 转载自:http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻.在这之前,我们需要了解一下源代码到可执行程序之间到底发生了什么神奇而美妙的事情. 在Linux操作系统中,普遍使用ELF格

Linux使用静态库和动态库

Linux使用静态库和动态库 (一)库的概念 库是可以复用的代码,在一些大的项目中常常会用到库. 本质上说:库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 一般说库是说两种: 静态库:linux下.a文件.windows下.lib文件 动态库:linux下.so文件.windows下.dll文件 最近花了一些时间把linux下编译.链接等研究了一下,作为一个菜鸟记录并分享一蛤. (二)静态库与动态库 程序的编译运行要经过以下步骤: 1.源文件(.h .cpp等) 2.预编译 3.编

Linux下Gcc生成和使用静态库和动态库详解

参考文章:http://blog.chinaunix.net/uid-23592843-id-223539.html 一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同(主要是编译器.汇编器和连接器的不同),因此二者库的二进制是不兼容的. 本文仅限于介绍linux下的库. 1.2库的种类 linux下的库有两种:静态库和共享库(动态库). 二者的不同

静态库和动态库

简介 什么是库? 库是程序代码的集合,是共享程序代码的一种方式 根据源代码的公开情况,库可以分为2种类型 开源库 公开源代码,能看到具体实现 比如SDWebImage.AFNetworking 闭源库 不公开源代码,是经过编译后的二进制文件,看不到具体实现 主要分为:静态库.动态库 为什么制作闭源库 国内的企业,掌握有核心技术,同时是又希望更多的程序员来使用其技术,因此采用"闭源"的方式开发使用 例如:百度地图,友盟,JPush等 在企业开发中,一些核心技术或者常用框架,出于安全性和稳