简介:
QXlsx是一个可以读写Excel文件的库。不依赖office以及wps组件,可以在Qt5支持的任何平台上使用。
QXlsx和QAxObject 比较
QAxObject使用需要系统中安装了offie或wps,这种方法不推荐使用;
因为如果安装了wps,可能部分功能用不了;
同时安装了office、wps在使用时可能有问题;
或者电脑里安装了一些pdf阅读器则直接不能使用了;
QXlsx不依赖于系统环境,使用时打开excel文件将所有数据读入内存,然后就关闭文件了,也不存在文件被占用的情况。
下载QtXlsx
下载地址:GitHub - dbzhang800/QtXlsxWriter: .xlsx file reader and writer for Qt5
该代码可以同时在windows和linux系统上使用。整个安装包QtXlsxWriter-master如下:
使用QtXlsx
windows平台
有2种办法使用QtXlsx,一种是QtXlsx源码嵌入QTCreator中使用,第二种是把QtXlsx编译成lib、dll库使用。
环境:windows10 + QT5.15.2
QtXlsx源码嵌入QTCreator中使用
- 新建一个QTCreator对话框项目test1xlsx,其代码目录结构如下
- 在test1xlsx的pro文件添加xlsx的pri信息,如下
include($$PWD/../QtXlsxWriter-master/src/xlsx/qtxlsx.pri)
- 编写调用qtxlsx函数代码
QXlsx::Document xlsx;
xlsx.write(1, 2, "Hello Qt!");
xlsx.write(2, 2, "中文");
xlsx.saveAs("Text.xlsx");
QtXlsx源码编译成为.lib库使用
需要先下载安装Perl
下载链接:Strawberry Perl for Windows
可以选择下载32bit或者64位的,这里我下载strawberry-perl-5.32.1.1-32bit.msi
注意,这个是一定要下载安装的,否则编译lib库会编译失败!!
编译QtXlsx源码
打开下载的QtXlsx文件夹,使用qt打开qtxlsx.pro.直接编译。在构建目录下得到include、lib、bin的目录文件。
使用QtXlsx库
- 新建qt项目testxlsx。
Code目录为testxlsx项目源码,xlsx为新建目录,包含include、lib文件夹。
- 拷贝include文件
把qtxlsx项目构建的include文件夹拷贝过来,但include文件夹的头文件都是引用qtxlsx项目src的头文件,所以直接把qtxlsx项目的src\xlsx目录上的.h文件拷贝到include文件夹覆盖原有的(总共16个)。
把qtxlsx项目的src\xlsx目录上的_p.h文件拷贝到include文件夹\QtXlsx\0.3.0\QtXlsx\private目录下覆盖原有的(总共27个)
- 拷贝lib文件
把qtxlsx项目构建的lib文件夹的lib文件拷贝到\xlsx\lib过来,
- 拷贝dll文件
把qtxlsx项目构建的bin文件夹的dll文件拷贝到\bin\debug过来,
- 在测试项目testxlsx的pro配置头文件、lib库
INCLUDEPATH += $$PWD/../xlsx/include/QtXlsx
CONFIG(debug, debug|release) {
#指定生成的应用程序放置的目录
DESTDIR += $$PWD/../bin/debug/
LIBS += -L$$PWD/../xlsx/lib/ -lQt5Xlsxd
} else {
#指定生成的应用程序放置的目录
DESTDIR += $$PWD/../bin/release/
LIBS += -L$$PWD/../xlsx/lib/ -lQt5Xlsx
}
- 编码调用xlsx,直接引用#include <QtXlsx>即可。
void Dialog::on_pushButton_clicked()
{
QXlsx::Document xlsx;//只处理当前的sheet页,默认为第一页。
QString strsheetName = xlsx.currentSheet()->sheetName();
xlsx.renameSheet(strsheetName,"1");
xlsx.write(1, 2, "Hello Qt!");
xlsx.write(1, 1, 1);
xlsx.write(2, 1, 2);
xlsx.write(3, 1, 3);
xlsx.write(4, 1, 4);
xlsx.defineName("Factor", "=2");
xlsx.defineName("Cell_1", "=1!$A$1:$A$4"); // A1-A4命名为Cell_1
xlsx.write(5, 1, "=SUM(Cell_1)");
xlsx.write(6, 1, "=SUM($A$1:$A$4)");
xlsx.write(7, 1, "=SUM(Cell_1)*Factor");
xlsx.addSheet("2");
QXlsx::Format format;
format.setFontColor(Qt::red); // 设置字体颜色为红色
xlsx.write(2, 2, "中文",format);
xlsx.setRowHeight(4, 50);
xlsx.setColumnWidth(3, 100);
xlsx.mergeCells("G4:L6");
QXlsx::CellRange cells(3,3,5,5);
xlsx.mergeCells(cells);
xlsx.saveAs("Text.xlsx");
}
void Dialog::on_pushButton_2_clicked()
{
QXlsx::Document xlsx("Text.xlsx");
QStringList sheetList = xlsx.sheetNames();
QString strsheetName;
foreach (auto var, sheetList)
{
if(var == "2")
strsheetName ="2";
}
QXlsx::Workbook *wb = xlsx.workbook();
int nsheetCount = wb->sheetCount();
QString strtext1 = xlsx.read(1,2).toString();
xlsx.selectSheet(strsheetName);
QXlsx::Worksheet *workSheet = static_cast<QXlsx::Worksheet*>(wb->sheet(1));
int row1 = xlsx.dimension().rowCount();
int row2 = workSheet->dimension().rowCount();
int col1 = xlsx.dimension().columnCount();
int col2 = workSheet->dimension().columnCount();
QString strtext2 = xlsx.read(2,2).toString();
xlsx.unmergeCells("G4:L6");
workSheet = static_cast<QXlsx::Worksheet*>(wb->sheet(0));
QString strtext3 = xlsx.read(1,2).toString();
QString strtext4 = xlsx.read(2,2).toString();
}
Linux平台
环境:麒麟桌面版 + qt5.12.2
QtXlsx源码嵌入QTCreator中使用
在linux平台上也可以直接拿qtxlsx源码直接在项目上使用。
在测试项目test1xlsx的pro文件添加配置,调用方法和上面windows一样。
include($$PWD/../QtXlsxWriter-master/src/xlsx/qtxlsx.pri)
QtXlsx源码编译成为so库使用
编译QtXlsx源码
在linux系统上无lib文件的,只有生成so文件。直接使用qt编译qtxlsx项目即可。
使用QtXlsx库
和windows一样的使用办法。
区别是:
1.在编译测试项目textxlsx遇到错误GL/gl.h: No such file or directory。解决办法是:
sudo apt-get install mesa-common-dev
sudo apt-get install libgl1-mesa-dev libglu1-mesa-dev
2.头文件的QtXlsx的文件#include <QtXlsx/QtXlsxDepends>需改成#include <QtXlsxDepends>
QtXlsx常用函数
- 定义
QXlsx::Document xlsx;
QXlsx::Document xlsx("Text.xlsx");
- 往单元格中写入数据
xlsx.write(2, 2, "中文"); 参数一是行,参数二是列,参数三是数据
- 读取单元格中的数据
QString str1 = xlsx.read(1, 1).toString(); 指定行列获取
- 设置行高
xlsx.setRowHeight(4, 30); 设置第四行高度为30
- 设置列宽
xlsx.setColumnWidth(3, 50); 设置第三列宽度为50
- 设置单元格样式
QXlsx::Format format;
format.setFontColor(Qt::red); // 设置字体颜色为红色
xlsx.write(2, 2, "中文",format);
- 合并单元格
xlsx.mergeCells("C4:E6"); 参数指定那个单元格区间
- 取消合并
xlsx.unmergeCells("C4:E6"); 指定的单元格区间一定是要已经合并的,否则报错
- 添加工作表
xlsx.addSheet("sheet_2"); 添加这一张名为“sheet_2”的工作表
- 工作表重命名
xlsx.workbook()->renameSheet(1, "sheet_3");
- 选择当前工作表
xlsx.selectSheet("sheet_3"); 选择名为“sheet_3”的工作表为当前xlsx工作表
- 获得所有工作表的名字
QStringList sheetList = xlsx.sheetNames(); 获取返回的是一个字符串链表
- 获取工作簿对象
QXlsx::Workbook *workBook = xlsx.workbook();
- 获取当前工作簿的第一张sheet工作表
QXlsx::Worksheet *workSheet = static_cast<QXlsx::Worksheet*>(workBook->sheet(0));
- 获取当前sheet表所使用到的行数
int row = workSheet->dimension().rowCount();
- 获取当前sheet表所使用到的列数
int colum = workSheet->dimension().columnCount();
- 保存
xlsx.saveAs("Text.xlsx"); 初始化xlsx对象时没有指定excel文件,那么保存时使用这个
xlsx.save(); 初始化xlsx对象时,指定了excel文件,那么保存时使用这个
- 赋值
xlsx.defineName("Factor", "=0.5"); // 将0.5赋值给Factor,相当于变量赋值一样
- 使用公式
xlsx.write(11, 1, "=SUM(Cell_1)"); // 计算A1-A10数据总和,并写入(11,1)单元格中
xlsx.write(15, 1, "=SUM($A$1:$A$10)"); // 计算A1-A10数据总和,并写入(15,1)单元格中
使用公式和变量
xlsx.write(12, 1, "=SUM(Cell_1)*Factor"); // 计算A1-A10数据总和再乘以0.5,并写入(12,1)单元格中
xlsx.write(16, 1, "=SUM($A$1:$A$10)*Factor"); // 计算A1-A10数据总和再乘以0.5,并写入(16,1)单元格中