Qt读写Excel--QXlsx基本使用

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() << "文件另存为失败!";
    }
}

觉得有帮助的话,打赏一下呗。。

相关推荐
用户805533698032 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner2 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz7 天前
QML Hello World 入门示例
qt
xcyxiner10 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner11 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner11 天前
DicomViewer (添加模型类)3
qt
xcyxiner12 天前
DicomViewer (目录调整) 2
qt
xcyxiner12 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
Non-existent98714 天前
WPS批量清理单元格空白字符的4种方法-异常数字格式处理-实战
excel·wps
桥田智能14 天前
桥田智能 QT-650S:面向白车身焊装的 800kg 重载快换解决方案
开发语言·qt·系统架构