Qt读写Excel--QXlsx工作表显示/隐藏状态设置4 原创
Qt读写Excel–QXlsx工作表显示/隐藏状态设置4🤏
更多精彩内容 |
---|
👉个人内容分类汇总 👈 |
1、概述✌
-
QXlsx是一个可以读写Excel文件的库。不依赖office以及wps组件,可以在Qt5支持的任何平台上使用;
-
使用方式
- QXlsx可以编译为动态库使用(使用动态库不用每次的编译,也可以让项目代码量更少,不用一打开工程就几十个文件);
- 直接将QXlsx.pri加入代码中使用(我比较推荐直接使用源码,因为QXlsx的注释信息基本在cpp文件中,可以通过阅读源码和注释来学习QXlsx的功能,当然,如果你已经熟悉了QXlsx的使用方式那编译成库使用会更方便,可以使工程的代码量变少);
-
本文中实现的功能:
- 创建指定名称的工作表(Sheet),自动添加到最末尾;
- 查询打开的Excel中所有可用的工作表(Sheet)名称;
- 查询选中工作表的状态(显示、隐藏、绝对隐藏);
- 设置选中工作表的状态(显示、隐藏、绝对隐藏);
- 一键调用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、源代码💪
🤜🤜🤜🤜🤜🤜🤜🤜🤜