简介:由于项目需要把检测数据生成Excel表格,并且不同类型的数据要分tab记录,要求不同的数据要用不同的的颜色标示出来,还要可以修改任意行的内容,在任意表格插入内容。为了完成需求从网上找到了libxl这个库,但是正版需要钱买,后来下载了一个破解版的libxl,现在使用起来感觉不错,写此文章记录使用细节。
第一步:准备工具。
1.1、下载libxl库,下载地址:https://download.csdn.net/download/cwj066/10656221。
1.2、安装vs2010即以上版本软件。
第二步:在vs2010上配置libxl开发环境。
2.1、打开vs2010新建一个名字为testLibXL的win32控制台空项目。
2.2、解压下载的压缩包,把LibXL拷贝任意目录(里面有bin、lib和include三个目录)。
2.3、配置
项目(testLibXL)---》属性---》配置属性---》VC++目录---》可执行文件目录 D:\xxx\LibXL\bin
项目(testLibXL)---》属性---》配置属性---》VC++目录---》包含目录 D:\xxx\LibXL\include
项目(testLibXL)---》属性---》配置属性---》VC++目录---》库目录 D:\xxx\LibXL\lib
项目(testLibXL)---》属性---》配置属性---》链接器---》输入---》附加依赖项:写入libxl.lib
第三步:vs2010上使用libXL(简单例子)。
3.1、在testLibXL项目添加一个名字为main.cpp的源文件。
在main.cpp文件中引入libXL库,代码如下所示
//引入C++库
#include <iostream>
using namespace std;
// 引入libxl.h
#include "libxl.h"
#pragma comment(lib, "libxl.lib")
using namespace libxl;
3.2、添加表格操作对象。
//表格操作对象
Sheet *pRunRecordSheet; //runrecord表sheet操作对象
libxl::Font *pFontSize; //字体大小
libxl::Font *pFontRed; //红色字体
libxl::Font *pFontGreen; //绿色字体
Format* pBoldFormatRed; //红色格式
Format* pBoldFormatGreen; //绿色格式
Format* pBoldFormatSize; //字体大小格式
Format* pDateFormat; //居中显示
3.3、声明表格操作函数
//声明表格操作函数
void CreateBook(); //新建一个Excel
void CreateStudenInfoHead(); //创建学生信息表头
void CreateStudenScoreHead(); //创建学生成绩表头
void SaveBook(char *pFilePath); //保存Excel内容
void AddTab(char *pTabName); //添加一个tab(即:Sheet表单)
void WriteData2Sheet(const char *pStudenName, const char *pClassName, const int iAge, const char *pSex);//写学生信息到表(指定行)
void WriteScore2Sheet(const char *pStudenName, const char *pClassName, const double fScore); //写学生成绩到表(指定行)
3.5 实现声明函数。
/*****************************************************************************
* 函数名称:CreateBook
* 函数功能:新建一个Excel
* 输入参数: 无
* 输出参数: 无
* 返回值 : 无
* 日 期 : 2018.9.18
* 作 者 : mark-puls
*****************************************************************************/
void CreateBook()
{
if(pDataBook) pDataBook->release();
pDataBook = xlCreateBook();//创建一个二进制格式的XLS(Execl97-03)的实例,在使用前必须先调用这个函数创建操作excel的对象
}
/*****************************************************************************
* 函数名称:CreateStudenInfoHead
* 函数功能:创建学生信息表头
* 输入参数: 无
* 输出参数: 无
* 返回值 : 无
* 日 期 : 2018.9.18
* 作 者 : mark-puls
*****************************************************************************/
void CreateStudenInfoHead()
{
iRowCount = 2;
//1 添加一个tab
pRecordSheet = pDataBook->addSheet("学生信息");
//2 创建tab的属性
pFontSize = pDataBook->addFont();//创建字体大小对象
pFontSize->setColor(COLOR_BLACK);//颜色为黑色
pFontSize->setSize(15); //字体大小为15
//3 设置表头的属性
pBoldFormatSize = pDataBook->addFormat();//设置字体格式指针
pBoldFormatSize->setFont(pFontSize);
pBoldFormatSize->setAlignV(ALIGNV_CENTER);//表头垂直居中显示
pBoldFormatSize->setAlignH(ALIGNH_CENTER);//表头水平居中显示
//4 把表头属性写到表里
pRecordSheet->writeStr(0, 0, "学生信息", pBoldFormatSize); //设置第一行的内容
pRecordSheet->setMerge(0, 0, 0, 3);
//5 设置行列属性
pDateFormat = pDataBook->addFormat();
pDateFormat->setAlignV(ALIGNV_CENTER);
pDateFormat->setAlignH(ALIGNH_CENTER);
pRecordSheet->setRow(1, 18);
pRecordSheet->setCol(0, 0, 20);
pRecordSheet->setCol(1, 1, 14);
pRecordSheet->setCol(2, 2, 10);
pRecordSheet->setCol(3, 3, 22);
pRecordSheet->writeStr(1, 0, "姓名", pDateFormat); //标题第1列 固定模式
pRecordSheet->writeStr(1, 1, "班级", pDateFormat); //标题第2列 固定模式
pRecordSheet->writeStr(1, 2, "年龄", pDateFormat); //标题第3列 固定模式
pRecordSheet->writeStr(1, 3, "性别", pDateFormat); //标题第4列 固定模式
//红色字体属性
pFontRed = pDataBook->addFont();//创建一个红色字体对象
pFontRed->setColor( COLOR_RED); //设置红颜色
pBoldFormatRed = pDataBook->addFormat();//设置字体格式指针
pBoldFormatRed->setFont(pFontRed); //应用上面设置的字体
pBoldFormatRed->setAlignV(ALIGNV_CENTER); //表头居中显示
pBoldFormatRed->setAlignH(ALIGNH_CENTER);
//绿色字体属性
pFontGreen = pDataBook->addFont(); //创建一个绿色字体对象
pFontGreen->setColor(COLOR_GREEN); //设置绿颜色
pBoldFormatGreen = pDataBook->addFormat();//设置字体格式指针
pBoldFormatGreen->setFont(pFontGreen); //应用上面设置的字体
pBoldFormatGreen->setAlignV(ALIGNV_CENTER); //表头居中显示
pBoldFormatGreen->setAlignH(ALIGNH_CENTER);
}
/*****************************************************************************
* 函数名称:CreateStudenScoreHead
* 函数功能:创建学生成绩表头
* 输入参数: 无
* 输出参数: 无
* 返回值 : 无
* 日 期 : 2018.9.18
* 作 者 : mark-puls
*****************************************************************************/
void CreateStudenScoreHead()
{
iRowCount = 2;
//1 添加一个tab
pRecordSheet = pDataBook->addSheet("学生成绩单");
//2 创建tab的属性
pFontSize = pDataBook->addFont();//创建字体大小对象
pFontSize->setColor(COLOR_BLACK);//颜色为黑色
pFontSize->setSize(15); //字体大小为15
//3 设置表头的属性
pBoldFormatSize = pDataBook->addFormat();//设置字体格式指针
pBoldFormatSize->setFont(pFontSize);
pBoldFormatSize->setAlignV(ALIGNV_CENTER);//表头垂直居中显示
pBoldFormatSize->setAlignH(ALIGNH_CENTER);//表头水平居中显示
//4 把表头属性写到表里
pRecordSheet->writeStr(0, 0, "学生成绩单", pBoldFormatSize); //设置第一行的内容
pRecordSheet->setMerge(0, 0, 0, 2);
//5 设置行列属性
pDateFormat = pDataBook->addFormat();
pDateFormat->setAlignV(ALIGNV_CENTER);
pDateFormat->setAlignH(ALIGNH_CENTER);
pRecordSheet->setRow(1, 18);
pRecordSheet->setCol(0, 0, 20);
pRecordSheet->setCol(1, 1, 14);
pRecordSheet->setCol(2, 2, 10);
pRecordSheet->setCol(3, 3, 22);
pRecordSheet->writeStr(1, 0, "姓名", pDateFormat); //标题第1列 固定模式
pRecordSheet->writeStr(1, 1, "班级", pDateFormat); //标题第2列 固定模式
pRecordSheet->writeStr(1, 2, "成绩", pDateFormat); //标题第3列 固定模式
}
/*****************************************************************************
* 函数名称:AddTab
* 函数功能:添加一个tab(即:Sheet表单)
* 输入参数: pTabName tab的名字
* 输出参数: 无
* 返回值 : 无
* 日 期 : 2018.9.18
* 作 者 : mark-puls
*****************************************************************************/
void AddTab(char *pTabName)
{
//判断数据合法性
if (pDataBook == NULL || pBoldFormatSize == NULL) return;
//添加一个tab
pRecordSheet = pDataBook->addSheet(pTabName); //添加一个工作表(tab名字)
pRecordSheet->writeStr(0, 0, pTabName, pBoldFormatSize); //表头名字
}
/*****************************************************************************
* 函数名称:WriteData2Sheet
* 函数功能:写数据到表(指定行)
* 输入参数1: pStudenName 学生名称
* 输入参数2: pClassName 班级名称
* 输入参数3: iAge 学生年龄
* 输入参数4: pSex 学生性别
* 输出参数: 无
* 返回值 : 无
* 日 期 : 2018.9.18
* 作 者 : mark-puls
*****************************************************************************/
void WriteData2Sheet(const char *pStudenName, const char *pClassName, const int iAge, const char *pSex)
{
//每次写4列
pRecordSheet->writeStr(iRowCount, 0, pStudenName, pDateFormat);
pRecordSheet->writeStr(iRowCount, 1, pClassName, pDateFormat);
pRecordSheet->writeNum(iRowCount, 2, iAge, pDateFormat);
pRecordSheet->writeStr(iRowCount, 3, pSex, pDateFormat);
//第一列默认绿色
pRecordSheet->setCellFormat(iRowCount, 0, pBoldFormatGreen);
//写完之后移到下一行
iRowCount++;
}
/*****************************************************************************
* 函数名称:WriteScore2Sheet
* 函数功能:写学生成绩到表(指定行)
* 输入参数1: pStudenName 学生名称
* 输入参数2: pClassName 班级名称
* 输入参数3: iAge 学生年龄
* 输入参数4: pSex 学生性别
* 输出参数: 无
* 返回值 : 无
* 日 期 : 2018.9.18
* 作 者 : mark-puls
*****************************************************************************/
void WriteScore2Sheet(const char *pStudenName, const char *pClassName, const double fScore)
{
//每次写4列
pRecordSheet->writeStr(iRowCount, 0, pStudenName, pDateFormat);
pRecordSheet->writeStr(iRowCount, 1, pClassName, pDateFormat);
pRecordSheet->writeNum(iRowCount, 2, fScore, pDateFormat);
pRecordSheet->setCellFormat(iRowCount, 0, pBoldFormatGreen);//名字默认绿色
pRecordSheet->setCellFormat(iRowCount, 2, pBoldFormatRed);//成绩默认红色
//写完之后移到下一行
iRowCount++;
}
/*****************************************************************************
* 函数名称:SaveBook
* 函数功能:保存Excel内容
* 输入参数: pFilePath 保存文件路径
* 输出参数: 无
* 返回值 : 无
* 日 期 : 2018.9.18
* 作 者 : mark-puls
*****************************************************************************/
void SaveBook(char *pFilePath)
{
//数据合法性判断
if (pDataBook == NULL || pFilePath == NULL) return;
//保存Excel内容
pDataBook->save(pFilePath);
}
3.6、main函数的调用
//统计写了多少行
int iRowCount = 2;
int main(int argc, char *argv[])
{
//1 新建一个Excel
CreateBook();
//2 创建学生信息表头
CreateStudenInfoHead();
//3 写一行学生信息到表中
WriteData2Sheet("朱晓明", "二年级1班", 8, "男");
WriteData2Sheet("陈大勇", "二年级6班", 6, "男");
WriteData2Sheet("李红霞", "二年级4班", 8, "女");
WriteData2Sheet("谭伟强", "二年级1班", 9, "男");
WriteData2Sheet("范冰冰", "二年级3班", 8, "女");
//4 创建成绩表头
CreateStudenScoreHead();
//5 写一行学生数学成绩到表中
WriteScore2Sheet("朱晓明", "二年级1班", 98.5);
WriteScore2Sheet("陈大勇", "二年级6班", 68.6);
WriteScore2Sheet("李红霞", "二年级4班", 88.8);
WriteScore2Sheet("谭伟强", "二年级1班", 86.3);
WriteScore2Sheet("范冰冰", "二年级3班", 58.9);
//6 保存Excel内容
SaveBook("C:\\Users\\MARK\\Desktop\\studen.xls");
return 0;
}
第四步:测试结果如下
4.1 学生信息表
4.2 学生成绩表
总结:1、如果不是破解版的libXL库会有水印,所以还是下载破解版的,有钱的可以买正版
2、只有当写完了所有数据才能调用save()函数保存Excel,调用了之后不可再写数据到表里面了
3、这的AddTab()没有演示,喜欢的老铁可以自己测试一下