Qt读写Excel--QXlsx合并单元格、文本对齐7

Qt读写Excel–QXlsx合并单元格、文本对齐7

文章目录

  • Qt读写Excel--QXlsx合并单元格、文本对齐7
    • @[toc]
    • 1、概述
    • 2、准备工作
    • 3、函数说明
    • 4、示例代码
      • 4.1 .h文件
      • 4.2 .cpp文件
    • 5、实现效果
    • 6、源代码

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

1、概述

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

  • 使用方式

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

    1. 通过【单元格引用】直接设置单元格合并;
    2. 通过【行列号】设置单元格合并;
    3. 在设置单元格合并时可以设置单元格【格式】,如文本居中对齐;
    4. 取消单元格合并;
    5. 在不修改其它内容情况下设置单元格水平对齐;
    6. 在不修改其它内容情况下设置单元格垂直对齐。

2、准备工作

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

3、函数说明

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

  • bool Document::mergeCells(const CellRange &range, const Format &format)
    • 功能说明: 合并range范围的单元格,合并后用第一个单元格的数据填充,其它单元格的数据会被清除;可通过format设置单元格格式。
    • 参数range: 需要合并的单元格范围;
    • 参数format: 单元格的格式(如文本对齐、字体大小、颜色等);
    • 返回值:true:合并单元格成功,false:合并单元格失败;
  • bool Document::unmergeCells(const CellRange &range)
    • 功能说明: 取消合并单元格;
    • 参数range: 取消合并单元格的范围,必须与合并单元格时输入的【范围一致】,否则取消合并单元格失败;
    • 返回值: true:取消合并单元格成功,false:取消合并单元格失败;
  • void Format::setHorizontalAlignment(HorizontalAlignment align)
    • 功能说明: 将水平对齐设置为给定的对齐;
    • 参数align:Format::HorizontalAlignment枚举指定水平对齐方式;
  • void Format::setVerticalAlignment(VerticalAlignment align)
    • 功能说明: 使用给定的对齐设置垂直对齐;
    • 参数align:Format::VerticalAlignment枚举指定垂直对齐方式;

4、示例代码

4.1 .h文件

/******************************************************************************
 * @文件名     test6.h
 * @功能       1、通过【单元格引用】直接设置单元格合并;
 *            2、通过【行列号】设置单元格合并;
 *            3、在设置单元格合并时可以设置单元格【格式】,如文本居中对齐;
 *            4、取消单元格合并;
 *            5、在不修改其它内容情况下设置单元格水平对齐;
 *            6、在不修改其它内容情况下设置单元格垂直对齐。
 *
 * @开发者     mhf
 * @邮箱       [email protected]
 * @时间       2022/07/09
 * @备注
 *****************************************************************************/
#ifndef TEST6_H
#define TEST6_H

#include 
#include "Interface.h"

namespace Ui {
class Test6;
}

class Test6 : public InterFace
{
    Q_OBJECT

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

    QString getExcelName() override;

private slots:
    void on_but_merge_clicked();

    void on_but_unmerge_clicked();

    void on_com_alignmentH_activated(int index);

    void on_com_alignmentV_activated(int index);

private:
    Ui::Test6 *ui;
};

#endif // TEST6_H

4.2 .cpp文件

#include "test6.h"
#include "ui_test6.h"
#include 
#include 
#include 
#include 
QXLSX_USE_NAMESPACE

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

Test6::Test6(QWidget *parent) :
    InterFace(parent),
    ui(new Ui::Test6)
{
    ui->setupUi(this);

    this->setWindowTitle("QXlsx合并单元格、文本对齐");
    this->setToolTip(this->windowTitle());
}

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

QString Test6::getExcelName()
{
    return EXCEL_NAME;
}

/**
 * @brief 演示三种方式的单元格合并
 *        1、通过【单元格引用】直接设置单元格合并;
 *        2、通过【行列号】设置单元格合并;
 *        3、在设置单元格合并时可以设置单元格【格式】,如文本居中对齐
 */
void Test6::on_but_merge_clicked()
{
    Document xlsx;

    // 在Excel中写入三组数据
    xlsx.write("B3", "hello");
    xlsx.write("C3", "123");
    xlsx.write("B8", 123456);
    xlsx.write("E8", "北风卷地白草折,胡天八月即飞雪");

    xlsx.mergeCells("B3:F6");                  // 可以通过【单元格引用】直接设置单元格合并(注意,有数据的单元格应该时第一个位置)
    xlsx.mergeCells(CellRange(8, 2, 20, 3));   // 通过【行列号】设置单元格合并

    Format format;
    format.setHorizontalAlignment(Format::AlignHCenter);  // 水平居中
    format.setVerticalAlignment(Format::AlignVCenter);    // 垂直居中
    xlsx.mergeCells("E8:F20", format);                    // 在设置单元格合并时可以设置单元格【格式】,如文本居中对齐

    if(xlsx.saveAs(EXCEL_NAME))    // 如果文件已经存在则覆盖
    {
        qInfo() << "Excel保存成功!";
        // 保存成功后其它三种操作才可以用
        ui->but_unmerge->setEnabled(true);
        ui->com_alignmentH->setEnabled(true);
        ui->com_alignmentV->setEnabled(true);
    }
    else
    {
        qWarning() << "Excel保存失败!";
    }
}

/**
 * @brief 取消合并单元格
 */
void Test6::on_but_unmerge_clicked()
{
    Document xlsx(EXCEL_NAME);
    if(!xlsx.load())
    {
        QMessageBox::warning(this, "错误", QString("打开%1失败,可能是文件不存在!").arg(EXCEL_NAME));
        return;
    }

    xlsx.unmergeCells("B3:F6");   // 这里取消合并的范围【B3:F6】必须和之前合并单元格的【范围相同】,否则取消合并失败
    if(xlsx.save())
    {
        qInfo() << "Excel保存成功!";
    }
    else
    {
        qWarning() << "Excel保存失败!";
    }
}

/**
 * @brief    在不修改其它内容情况下设置单元格水平对齐
 * @param
 */
void Test6::on_com_alignmentH_activated(int index)
{
    Document xlsx(EXCEL_NAME);
    if(!xlsx.load())
    {
        QMessageBox::warning(this, "错误", QString("打开%1失败,可能是文件不存在!").arg(EXCEL_NAME));
        return;
    }

    Format format = xlsx.cellAt(8, 2)->format();                        // 获取单元格原有格式
    format.setHorizontalAlignment(Format::HorizontalAlignment(index));  // 设置单元格水平对齐格式
    xlsx.write(8, 2, xlsx.read(8, 2), format);                          // 将单元格原有内容、格式写入原来位置

    if(xlsx.save())
    {
        qInfo() << "Excel保存成功!";
    }
    else
    {
        qWarning() << "Excel保存失败!";
    }
}

/**
 * @brief       在不修改其它内容情况下设置单元格垂直对齐
 * @param index
 */
void Test6::on_com_alignmentV_activated(int index)
{
    Document xlsx(EXCEL_NAME);
    if(!xlsx.load())
    {
        QMessageBox::warning(this, "错误", QString("打开%1失败,可能是文件不存在!").arg(EXCEL_NAME));
        return;
    }

    Format format = xlsx.cellAt(8, 2)->format();                        // 获取单元格原有格式
    format.setVerticalAlignment(Format::VerticalAlignment(index));      // 设置单元格垂直对齐格式
    xlsx.write(8, 2, xlsx.read(8, 2), format);                          // 将单元格原有内容、格式写入原来位置

    if(xlsx.save())
    {
        qInfo() << "Excel保存成功!";
    }
    else
    {
        qWarning() << "Excel保存失败!";
    }
}

5、实现效果

6、源代码

gitee
github

你可能感兴趣的:(QT,QXlsx,qt,QXlsx,Excel,单元格合并)