Qt读写Excel--QXlsx基本使用1

9 篇文章 65 订阅
本文介绍了如何在Qt中使用QXlsx库进行Excel文件的读写操作,包括创建新Excel、写入数据、读取数据以及文件保存和释放资源。通过实例展示了如何加载库、编写.h和.cpp文件,并演示了使用单元格引用和行列号进行数据操作的方法。
摘要由CSDN通过智能技术生成

Qt读写Excel–QXlsx基本使用1🍇

更多精彩内容
👉个人内容分类汇总 👈
👉Qt读写Excel–QXlsx基本使用1👈
👉Qt读写Excel–QXlsx编译为静态库2👈
👉Qt读写Excel–QXlsx通过Document对象操作工作表3👈

1、概述🍈

  • QXlsx是一个可以读写Excel文件的库。不依赖office以及wps组件,可以在Qt5支持的任何平台上使用;

  • 使用方式

    1. QXlsx可以编译为静态库库使用(可以提升项目编译速度,也可以让项目代码量更少,不用一打开工程就几十个文件);
    2. 直接将QXlsx.pri加入代码中使用(我比较推荐直接使用源码,因为QXlsx的注释信息基本在cpp文件中,可以通过阅读源码和注释来学习QXlsx的功能,当然,如果你已经熟悉了QXlsx的使用方式那编译成库使用会更方便,可以使工程的代码量变少);
  • 本文中实现的功能:

    1. 创建一个新的Excel,并具有一个默认的Sheet;
    2. 打开Excel文件,并判断是否打开成功;
    3. 分别使用单元格引用和行列号两种方式将数据写入Excel;
    4. 分别使用单元格引用和行列行两种方式读取Excel所有数据;
    5. 将Excel数据另存为2.xlsx;
    6. 释放Excel数据。

2、QXlsx和QAxObject 读写Excel比较🍉

  • QAxObject使用需要系统中安装了offie或wps,这种方法不推荐使用;
    • 因为如果安装了wps,可能部分功能用不了;
    • 同时安装了office、wps在使用时可能有问题;
    • 或者电脑里安装了一些pdf阅读器则直接不能使用了;
  • QXlsx不依赖于系统环境,使用时打开excel文件将所有数据读入内存,然后就关闭文件了,也不存在文件被占用的情况。

3、准备工作🍊

3.1 下载源码🍋

本文中使用到的QXlsx版本为:1.4.3

  • 下载
  • 或者使用Git命令下载git clone git@github.com:QtExcel/QXlsx.git

3.2 使用QXlsx🍏

  • 下载后如下图所示:里面的QXlsx为我们需要用到的源码,其它的为一些官方的示例代码;

    在这里插入图片描述

  • 打开QXlsx文件夹后如下图所示:通过QXlsx.pro打开可以编译为动态库使用,在程序里加载QXlsx.pri可以直接使用源码。

    在这里插入图片描述

  • 将QXlsx源码文件夹拷贝到创建的Qt工程路径下(也可以是其它路径)

    在这里插入图片描述

4、示例代码🍌

4.1 加载QXlsx源码🍍

  • 在工程的.pro文件中添加下列代码,

    注意QXlsx文件夹的路径改成自己的

    include($$PWD/QXlsx/QXlsx.pri)             # QXlsx源代码
    INCLUDEPATH += $$PWD/QXlsx
    

4.2 .h文件🥭

#ifndef TEST1_H
#define TEST1_H

#include <QWidget>
#include "xlsxdocument.h"


namespace Ui {
class Test1;
}

class Test1 : public QWidget
{
    Q_OBJECT

public:
    explicit Test1(QWidget *parent = nullptr);
    ~Test1();

private slots:
    void on_but_open_clicked();

    void on_but_init_clicked();
    void on_but_write_clicked();

    void on_but_recv_clicked();

    void on_but_saveAs_clicked();

    void on_but_close_clicked();

private:
    Ui::Test1 *ui;

    QXlsx::Document* m_xlsx = nullptr;
};

#endif // TEST1_H

4.3 .cpp文件🍎

#include "test1.h"
#include "ui_test1.h"
#include <QDebug>

QXLSX_USE_NAMESPACE            // 添加Xlsx命名空间

#define EXCEL_NAME "./1.xlsx"  // 本demo中用到的excel文件路径文件名

Test1::Test1(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Test1)
{
    ui->setupUi(this);
    this->setWindowTitle("QXlsx基本读写Excel");

}

Test1::~Test1()
{
    delete ui;
}

/**
 * @brief 创建一个excel文件
 */
void Test1::on_but_init_clicked()
{
    Document xlsx;                      // 初始化后默认有一个sheet1
//    doc.addSheet("第一个sheet", AbstractSheet::ST_WorkSheet);  // 添加第一个sheet,如果不添加则会有一个默认的
    bool ret = xlsx.saveAs(EXCEL_NAME); // 保存到EXCEL_NAME,如果已经存在则覆盖
    if(ret)
    {
        qInfo() << "创建excel成功!";
    }
    else
    {
        qWarning() << "创建excel失败!";
    }
}

/**
 * @brief 打开文件并判断是否打开成功
 */
void Test1::on_but_open_clicked()
{
    if(!m_xlsx)
    {
        m_xlsx = new Document(EXCEL_NAME, this);        // 打开EXCEL_NAME文件,将所有数据读取到内存中,然后关闭excel文件
    }
    if(m_xlsx->load())  // 判断文件是否打开成功(也可以使用isLoadPackage)
    {
        qInfo() << "excel打开成功!";

        ui->but_write->setEnabled(true);
        ui->but_recv->setEnabled(true);
        ui->but_saveAs->setEnabled(true);
        ui->but_close->setEnabled(true);
    }
    else
    {
        qWarning() << "excel打开失败!";
    }
}

/**
 * @brief 使用两种不同的方式将数据写入excel,未指定sheet则默认为sheet1
 */
void Test1::on_but_write_clicked()
{
#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() << "数据写入失败!";
    }
}

/**
 * @brief 读取excel中所有数据
 */
void Test1::on_but_recv_clicked()
{
    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;
    }

}

/**
 * @brief 将数据另存到2.xlsx
 */
void Test1::on_but_saveAs_clicked()
{
    if(m_xlsx->saveAs("./2.xlsx"))
    {
        qInfo() << "另存为2.xlsx";
    }
    else
    {
        qWarning() << "文件另存为失败!";
    }
}

/**
 * @brief 释放数据
 */
void Test1::on_but_close_clicked()
{
    delete m_xlsx;
    m_xlsx = nullptr;
    ui->but_write->setEnabled(false);
    ui->but_recv->setEnabled(false);
    ui->but_saveAs->setEnabled(false);
    ui->but_close->setEnabled(false);
}

5、实现效果🥝

在这里插入图片描述

6、源代码🍒

gitee
github

😀🤣😂🙂🙃

评论 33
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mahuifa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值