1、概述
Document
类是一个用于操作 XLSX 文件的类,继承自 QObject
。它提供了对 Excel 文件的读写操作,包括单元格的读写、图片和图表的插入、单元格合并、列和行的格式化、数据验证和条件格式化等功能。此外,它还支持对工作簿和工作表的操作,如添加、删除、重命名工作表等。这个类可以用于创建、编辑和保存 XLSX 文件,也可以将 XLSX 文件的内容保存为 CSV 格式。
2、重要方法
explicit Document(QObject *parent = nullptr)
:默认构造函数,创建一个空的Document
对象。Document(const QString &xlsxName, QObject *parent = nullptr)
:通过指定 XLSX 文件名创建Document
对象。Document(QIODevice *device, QObject *parent = nullptr)
:通过指定QIODevice
创建Document
对象,用于从内存设备读取或写入 XLSX 文件。~Document()
:析构函数,释放Document
对象。
bool write(const CellReference &cell, const QVariant &value, const Format &format = Format())
:向指定单元格写入值,并可选地设置格式。bool write(int row, int col, const QVariant &value, const Format &format = Format())
:向指定行列的单元格写入值,并可选地设置格式。QVariant read(const CellReference &cell) const
:读取指定单元格的值。QVariant read(int row, int col) const
:读取指定行列的单元格的值。
int insertImage(int row, int col, const QImage &image)
:在指定位置插入图片。bool getImage(int imageIndex, QImage &img)
:根据图片索引获取图片。bool getImage(int row, int col, QImage &img)
:根据行列位置获取图片。uint getImageCount()
:获取图片数量。Chart *insertChart(int row, int col, const QSize &size)
:在指定位置插入图表。
bool mergeCells(const CellRange &range, const Format &format = Format())
:合并指定范围的单元格,并可选地设置格式。bool unmergeCells(const CellRange &range)
:拆分已合并的单元格。bool setColumnWidth(const CellRange &range, double width)
:设置指定列范围的宽度。bool setColumnFormat(const CellRange &range, const Format &format)
:设置指定列范围的格式。bool setColumnHidden(const CellRange &range, bool hidden)
:设置指定列范围是否隐藏。bool setRowHeight(int row, double height)
:设置指定行的高度。bool setRowFormat(int row, const Format &format)
:设置指定行的格式。bool setRowHidden(int row, bool hidden)
:设置指定行是否隐藏。
QStringList sheetNames() const
:获取所有工作表的名称。bool addSheet(const QString &name, AbstractSheet::SheetType type = AbstractSheet::ST_WorkSheet)
:添加一个工作表。bool insertSheet(int index, const QString &name, AbstractSheet::SheetType type = AbstractSheet::ST_WorkSheet)
:在指定位置插入一个工作表。bool selectSheet(const QString &name)
:选择指定名称的工作表。bool selectSheet(int index)
:选择指定索引的工作表。bool renameSheet(const QString &oldName, const QString &newName)
:重命名工作表。bool copySheet(const QString &srcName, const QString &distName = QString())
:复制工作表。bool moveSheet(const QString &srcName, int distIndex)
:移动工作表。bool deleteSheet(const QString &name)
:删除工作表。
bool save() const
:保存当前的 XLSX 文件。bool saveAs(const QString &xlsXname) const
:将当前的 XLSX 文件保存为指定名称。bool saveAs(QIODevice *device) const
:将当前的 XLSX 文件保存到指定的QIODevice
。bool saveAsCsv(const QString mainCSVFileName) const
:将当前的 XLSX 文件保存为 CSV 格式。bool isLoadPackage() const
:检查是否已加载 XLSX 文件。bool load() const
:加载 XLSX 文件。
3、移植QXlsx源码
github下载:点击跳转
csdn下载:点击跳转
下载后如下图所示:里面的QXlsx为我们需要用到的源码,其它的为一些官方的示例代码:
打开QXlsx文件夹后如下图所示:通过QXlsx.pro打开可以编译为动态库使用,在程序里加载QXlsx.pri可以直接使用源码。
将QXlsx源码文件夹拷贝到创建的Qt工程路径下(也可以是其它路径):
4、demo
在工程的.pro文件中添加下列代码:
include($$PWD/QXlsx/QXlsx.pri) # QXlsx源代码
INCLUDEPATH += $$PWD/QXlsx
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include "xlsxdocument.h"
QXLSX_USE_NAMESPACE // 添加Xlsx命名空间
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
setWindowTitle("QXlsx基本读写Excel");
//创建一个excel文件
Document xlsx; // 初始化后默认有一个sheet1
//doc.addSheet("第一个sheet", AbstractSheet::ST_WorkSheet); // 添加第一个sheet,如果不添加则会有一个默认的
bool ret = xlsx.saveAs("./1.xlsx"); // 保存到EXCEL_NAME,如果已经存在则覆盖
if(ret)
{
qInfo() << "创建excel成功!";
}
else
{
qWarning() << "创建excel失败!";
}
//打开文件
Document *m_xlsx = new Document("./1.xlsx", this);
if(m_xlsx->load()) // 判断文件是否打开成功(也可以使用isLoadPackage)
{
qInfo() << "excel打开成功!";
}
else
{
qWarning() << "excel打开失败!";
}
//将数据写入excel
#if 0
m_xlsx->write("A2", 123); // 从A1开始
m_xlsx->write("B2", 0.001);
m_xlsx->write("C2", "abc");
m_xlsx->write("D2", true);
m_xlsx->write("E2", "你好");
#else
m_xlsx->write(1, 1, 456); // 从1,1开始
m_xlsx->write(1, 2, 0.002);
m_xlsx->write(1, 3, "aaa");
m_xlsx->write(1, 4, false);
m_xlsx->write(1, 5, "你好");
#endif
if(m_xlsx->save())
{
qInfo() << "数据写入成功!";
}
else
{
qWarning() << "数据写入失败!";
}
//读取excel中所有数据
int rowLen = m_xlsx->dimension().rowCount(); // 获取最大行数
int columnLen = m_xlsx->dimension().columnCount(); // 获取最大列数
for(int i = 1; i <= rowLen; i++) // 遍历每一行
{
QString data = QString("第%1行:").arg(i);
for(int j = 1; j <= columnLen; j++) // 遍历每一个单元格(列)
{
#if 1
QVariant value = m_xlsx->read(i, j); // 通过单元格行号、列号读取数据
#else
QVariant value = m_xlsx->read(QString("%1%2").arg((char)(64 + i)).arg(j)); // 通过单元格引用读取数据
#endif
if(!value.isNull())
{
data.append(value.toString()).append(" ");
}
else
{
data.append("NULL ");
}
}
qInfo() << data;
}
//将数据另存到2.xlsx
if(m_xlsx->saveAs("./2.xlsx"))
{
qInfo() << "另存为2.xlsx";
}
else
{
qWarning() << "文件另存为失败!";
}
}
觉得有帮助的话,打赏一下呗。。