Qt读写Excel--QXlsx工作表显示/隐藏状态设置4 原创

Qt读写Excel–QXlsx工作表显示/隐藏状态设置4🤏

更多精彩内容
👉个人内容分类汇总 👈

1、概述✌

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

  • 使用方式

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

    1. 创建指定名称的工作表(Sheet),自动添加到最末尾;
    2. 查询打开的Excel中所有可用的工作表(Sheet)名称;
    3. 查询选中工作表的状态(显示、隐藏、绝对隐藏);
    4. 设置选中工作表的状态(显示、隐藏、绝对隐藏);
    5. 一键调用WPS快速打开Excel(为了方便查看效果)。

2、准备工作🤞

👉Qt读写Excel–QXlsx基本使用1👈
👉Qt读写Excel–QXlsx编译为静态库2👈

3、函数说明🤟

注意:执行了操作要保存才生效。⛔

  • QStringList sheetNames() const
    • 功能说明: 查询Excel中所有的工作表(Sheet)名称;
    • 返回值:所有工作表的名称列表;
  • bool addSheet(const QString &name = QString(), AbstractSheet::SheetType type = AbstractSheet::ST_WorkSheet)
    • 功能说明: 在末尾创建一个名称为name,类型为type的工作表;
    • 参数name: 创建的工作表的名称,如果没指定名称则默认为Sheet1、Sheet2递增;
    • 参数type: 创建的工作表的类型,可省略;
      • ST_WorkSheet:表格工作表
      • ST_ChartSheet:图表工作表
      • ST_DialogSheet:还不支持
      • ST_MacroSheet:还不支持
    • 返回值: 创建成功则返回true,失败返回false;
      • 如果名称已存在则创建失败;
      • 如果是ST_DialogSheet、ST_MacroSheet也创建失败;(注意这种创建失败有bug,创建失败后输入的name会被保存,下次不能再创建这个名称的工作表,不过不影响使用, 修复方法:xlsxworkbook.cpp文件中的Q_ASSERT(false);下一行添加return sheet;即可)
  • AbstractSheet *Document::sheet(const QString &sheetName) const
    • 功能说明: 根据输入的工作表名称sheetName返回工作表的指针,如果不存在则返回NULL
    • 参数sheetName: 工作表名称;
    • 返回值: 成功返回可用工作表指针,失败返回NULL;
  • AbstractSheet::SheetState AbstractSheet::sheetState() const
    • 功能说明: 获取当前工作表的状态;

    • 返回值: 工作表当前状态enum SheetState { SS_Visible(显示),SS_Hidden(隐藏), SS_VeryHidden(绝对隐藏) };

      • 显示状态:通过WPS打开Excel就可以看见工作表;

      • 隐藏状态:打开Excel不能看见隐藏的工作表,需要设置取消隐藏才可以看见;

        在这里插入图片描述

      • 绝对隐藏:设置了取消隐藏也看不见。

  • void AbstractSheet::setSheetState(SheetState state)
    • 功能说明: 设置工作表状态。
    • 参数state: 需要设置的工作表状态enum SheetState { SS_Visible(显示),SS_Hidden(隐藏), SS_VeryHidden(绝对隐藏) };
  • bool AbstractSheet::isHidden() const
    • 功能说明: 工作表是否隐藏。
    • 返回值: 工作表为【隐藏状态】或者【绝对隐藏状态】返回true,【显示状态】返回false;
  • bool AbstractSheet::isVisible() const
    • 功能说明: 工作表是否显示(与isHidden()相反)。
    • 返回值: 工作表为【隐藏状态】或者【绝对隐藏状态】返回false,【显示状态】返回true;
  • void AbstractSheet::setHidden(bool hidden)
    • 功能说明: 设置工作表隐藏或可见。
    • 参数hidden: true:隐藏 false:显示
  • void AbstractSheet::setVisible(bool visible)
    • 功能说明: 设置工作表隐藏或可见。
    • 参数hidden: true:显示 false:隐藏

4、示例代码🤘

4.1 .h文件👉

/******************************************************************************
 * @文件名     test3.h
 * @功能       基于AbstractSheet类的Demo,主要演示了
 *            1、创建工作表;
 *            2、查询工作表;
 *            3、查询工作表状态;
 *            4、设置工作表状态。
 *
 * @开发者     mhf
 * @邮箱       1603291350@qq.com
 * @时间       2022/06/19
 * @备注
 *****************************************************************************/
#ifndef TEST3_H
#define TEST3_H

#include <QWidget>

namespace Ui {
class Test3;
}

class Test3 : public QWidget
{
    Q_OBJECT

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

private slots:
    void on_but_show_clicked();

    void on_but_addSheet_clicked();

    void on_com_sheets_activated(const QString &arg1);

    void on_com_state_activated(int index);

private:
    Ui::Test3 *ui;
};

#endif // TEST3_H

4.2 .cpp文件👈

#include "test3.h"
#include "ui_test3.h"

#include <QDir>
#include <qprocess.h>
#include <QDebug>
#include "xlsxdocument.h"
QXLSX_USE_NAMESPACE            // 添加Xlsx命名空间

#define EXCEL_NAME "state.xlsx"         // 本Demo使用的Excel文件名

Test3::Test3(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Test3)
{
    ui->setupUi(this);
    this->setWindowTitle("QXlsx查询设置工作表状态Demo");
}

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


/**
 * @brief  通过调用WPS打开当前路径下的Excel文件,如果打开失败需要替换自己的wps的安装路径
 */
void Test3::on_but_show_clicked()
{
    bool ret = QProcess::startDetached("D:/WPS Office/ksolaunch.exe", QStringList() << QDir::currentPath() + "/" + EXCEL_NAME);
    if(!ret)
    {
        qWarning() << "打开Excel失败,请注意wps路径是否存在,或者替换其它程序打开excel";
    }
}

/**
 * @brief 创建一个工作表
 */
void Test3::on_but_addSheet_clicked()
{
    Document xlsx(EXCEL_NAME);             // 如果文件存在则打开EXCEL_NAME,如果不存在则传入文件名,在save时保存为EXCEL_NAME
    qDebug() << xlsx.load();               // 如果文件存在,并且打开成功则为true,否则为false
//    xlsx.addSheet();                     // 创建一个工作表,如果没指定名称则默认为Sheet1、Sheet2递增
    xlsx.addSheet(ui->line_name->text());  // 指定名称创建工作表(默认设置为当前活动工作表)
    xlsx.write(2, 2, "hello");             // 在当前活动工作表写入数据
    if(xlsx.save())                        // 因为在【Document xlsx(EXCEL_NAME);】指定了文件名称,所以保存到EXCEL_NAME,如果没有指定则默认【Book1.xlsx】
    {
        qDebug() << "保存成功!";

        ui->com_sheets->clear();
        ui->com_sheets->addItems(xlsx.sheetNames());   // 查询所有可用工作表
    }
    else
    {
        qDebug() << "保存失败!";
    }
}

/**
 * @brief       通过下拉框选择工作表名称,查询工作表状态
 * @param arg1
 */
void Test3::on_com_sheets_activated(const QString &arg1)
{
    Document xlsx(EXCEL_NAME);
    AbstractSheet* sheet = xlsx.sheet(arg1);   // 根据名称获取工作表指针
    if(!sheet) return;    // 判断是否为NULL

    int state = sheet->sheetState();           // 获取当前工作表状态
    ui->com_state->setCurrentIndex(state);
}

/**
 * @brief         设置工作表状态,
 *                可通过setSheetState设置显示、隐藏、绝对隐藏【三种状态】,
 *                通过sheetState获取工作表当前状态【三种状态】
 *                也可以通过setHidden或setVisible设置显示、隐藏状态【两种状态】,
 *                并通过isHidden或者isVisible查询显示隐藏状态【两种状态】
 * @param index
 */
void Test3::on_com_state_activated(int index)
{
    Document xlsx(EXCEL_NAME);
    AbstractSheet* sheet = xlsx.sheet(ui->com_sheets->currentText());   // 根据名称获取工作表指针
    if(!sheet) return;    // 判断是否为NULL

    sheet->setSheetState(AbstractSheet::SheetState(index));             // 修改工作表状态
    if(xlsx.save())
    {
        qDebug() << "保存成功!" ;
    }
    else
    {
        qDebug() << "保存失败!";
    }
}

5、实现效果👐

在这里插入图片描述

6、源代码💪

gitee
github

🤜🤜🤜🤜🤜🤜🤜🤜🤜

posted @ 2024-07-07 17:21  mahuifa  阅读(0)  评论(0编辑  收藏  举报  来源