excel扒数据到ini文件小工具

一、源码

注释很详细,就不讲了

cpp 复制代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QVariant>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;

private:
    void readFile();
    bool isXlsxFile(const QString &filePath);

    void readFileIni();
    bool isIniFile(const QString &filePath);
    void selectFileIni();
    void chooseFileIni();
    void setUIIni(const QStringList keys, const QVariant value);
    bool isSectionEmpty();

    void matchData();
    bool isFilesOpenEmpty();
    void dataHandle();
    void brushUIIni();


private:
    QList<QList<QVariant>> xls_data;
    QString filepathini;
    QString filepathexcel;
    QStringList sectionKeys; // 用于存储特定节的所有键
    QVariant valueIni;
    QStringList keysIniMatch;
    QVariant valuesIniMatch;
};
#endif // MAINWINDOW_H
cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QDir>
#include <QFile>
#include <QFileDialog>
#include <QMessageBox>
#include <QFileInfo>
#include <QDebug>
#include <QAxObject>
#include <QVariant>
#include <QMap>
#include <QStandardItemModel>
#include <QSettings>

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

    readFile();
    selectFileIni();
    matchData();
}

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

void MainWindow::readFile()
{
    connect(ui->pushButton, &QPushButton::clicked, this, [=](){
        QString currentpath = QDir::homePath();
        QString openfiletitle = "请选择文件";
        QString filefilter = "all(*.*)";
        filepathexcel = QFileDialog::getOpenFileName(this, openfiletitle, currentpath, filefilter);

        if(filepathexcel.isEmpty())
        {
            QMessageBox::warning(this, "警告!!", "文件夹不能为空!");
            return;
        }

        QFileInfo info(filepathexcel);//获取文件信息
        ui->lineEdit->setText(info.fileName());

        //excel表格读取
        QAxObject *excel = new QAxObject(this);
        excel->dynamicCall("Visible(bool)", false);
        if (isXlsxFile(filepathexcel))
        {
            excel->setControl("Excel.Application");// 加载 Microsoft Excel 控件
        }
        else
        {
            excel->setControl("ket.Application");  // 加载 WPS Excel 控件
        }

        excel->setProperty("Visible", false);  // 不显示 Excel 窗体
        QAxObject* workBooks = excel->querySubObject("WorkBooks");  //获取工作簿集合
        workBooks->dynamicCall("Open(const QString&)", filepathexcel); //打开打开已存在的工作簿
        QAxObject* workBook = excel->querySubObject("ActiveWorkBook"); //获取当前工作簿

        QAxObject* sheets = workBook->querySubObject("Sheets");  //获取工作表集合,Sheets也可换用WorkSheets
        QAxObject* sheet = workBook->querySubObject("WorkSheets(int)", 1);//获取工作表集合的工作表1,即sheet1

        //获取该sheet的使用范围对象(一般读取 Excel 时会选取全部范围)
        QAxObject* usedRange = sheet->querySubObject("UsedRange");

        /*
        //获取 sheet 的指定范围(一般写入数据时,会选取指定范围)
        QAxObject* usedRange = sheet->querySubObject("Range(const QString)", "A1:C12");

        //获取 sheet 的指定范围(一般修改数据时,会选取指定单元格)
        QAxObject* usedRange = sheet->querySubObject("Range(QVariant,QVariant)", "A6");
        */

        //读取单元格内容
        QVariant var = usedRange->dynamicCall("Value");
        delete usedRange;

        //数据转换
        QVariantList varRows = var.toList();
        if (varRows.isEmpty()) {
            return;
        }

        const int rowCount = varRows.size();

        QVariantList rowData;

        for (int i = 0; i < rowCount; i++){
            rowData = varRows[i].toList();
            int clumnCount = rowData.size();
            if(rowData.count() > clumnCount)
            {
                clumnCount = rowData.count();
            }
            xls_data.push_back(rowData);
        }

        //写进UI表格
        // 创建模型
        QStandardItemModel *model = new QStandardItemModel(rowCount, rowData.size(), this);
        for (int i = 0; i < xls_data.count(); i++) {
            for (int j = 0; j < xls_data.at(i).count(); j++) {
                QStandardItem *item = new QStandardItem(QString(xls_data.at(i).at(j).toByteArray()));
                model->setItem(i, j, item);
//                delete item;
            }
        }
        ui->tableView->setModel(model);

        // 隐藏行号和列号
        ui->tableView->verticalHeader()->hide();
        ui->tableView->horizontalHeader()->hide();
    });
}

bool MainWindow::isXlsxFile(const QString &filePath)
{
    QFileInfo fileInfo(filePath);
    QString extension = fileInfo.suffix().toLower();

    // 列出常见的文本文件扩展名
    static const QStringList textExtensions = {"xlsx", "xls", "xlsm"};

    return textExtensions.contains(extension);
}

void MainWindow::selectFileIni()
{
    //选择ini文件
    connect(ui->pushButton_ini, &QPushButton::clicked, this, [=](){
        if(isSectionEmpty())
        {
            QMessageBox::warning(this, "警告", "请先输入查询的节名称!!!");
            return;
        }
        else
        {
            chooseFileIni();
            readFileIni();
        }
    });
}

void MainWindow::chooseFileIni()
{
    QString currentpath = QDir::homePath();
    QString openfiletitle = "请选择文件";
    QString filefilter = "all(*.*)";
    filepathini = QFileDialog::getOpenFileName(this, openfiletitle, currentpath, filefilter);

    if(filepathini.isEmpty())
    {
        QMessageBox::warning(this, "警告!!", "文件夹不能为空!");
        return;
    }
    else
    {
        //是否为ini文件
        if(isIniFile(filepathini))
        {
            QFileInfo info(filepathini);//获取文件信息
            ui->lineEdit_ini->setText(info.fileName());
        }
    }
}

void MainWindow::readFileIni()
{
    //创建qsettings对象
    QSettings settings(filepathini, QSettings::IniFormat);

    //读取
    const QString sectionName = ui->lineEdit_section->text();

    // 读取所有键的前缀
    QStringList allKeys = settings.allKeys();

    // 遍历所有键,找到属于特定节的键
    for (const QString &key : allKeys) {
        if (key.startsWith(sectionName)) {
            // 去掉节前缀
            QString cleanKey = key.mid(sectionName.size() + 1);
            sectionKeys.append(cleanKey);
        }
    }

    // 遍历特定节的所有键并读取对应的值
    foreach (const QString &key, sectionKeys) {
        valueIni = settings.value(key);
//        qDebug() << key << ": " << value.toString();
        setUIIni(sectionKeys, valueIni);
    }
}

bool MainWindow::isIniFile(const QString &filePath)
{
    QFileInfo fileInfo(filePath);
    QString extension = fileInfo.suffix().toLower();

    // 列出常见的文本文件扩展名
    static const QStringList textExtensions = {"ini"};

    return textExtensions.contains(extension);
}

void MainWindow::setUIIni(const QStringList keys, const QVariant value)
{
    QStandardItemModel *model = new QStandardItemModel(keys.size(), 2, this);
    for (int i = 0; i < keys.size(); i++)
    {
        QStandardItem *item = new QStandardItem(keys.at(i));
        model->setItem(i, 0, item);
    }
    for (int i = 0; i < QString(value.toByteArray()).size(); i++)
    {
        QStandardItem *item = new QStandardItem(QString(value.toByteArray()));
        model->setItem(i, 1, item);
    }
    ui->tableView_ini->setModel(model);

    // 隐藏行号和列号
    ui->tableView_ini->verticalHeader()->hide();
    ui->tableView_ini->horizontalHeader()->hide();
}

bool MainWindow::isSectionEmpty()
{
    if(ui->lineEdit_section->text().isEmpty())
        return true;
}

void MainWindow::matchData()
{
    connect(ui->pushButton_match, &QPushButton::clicked, this, [=](){
        //判断excel和ini选择没有
        if(!isFilesOpenEmpty())
        {
            dataHandle();
        }
        else
        {
            QMessageBox::warning(this,"警告","请选择excel和ini文件!!!");
        }
    });
}

bool MainWindow::isFilesOpenEmpty()
{
    if(!(isXlsxFile(filepathexcel)&&isIniFile(filepathini)))
    {
        return true;
    }
}

void MainWindow::dataHandle()
{
    QSettings settings(filepathini, QSettings::IniFormat);
    for (int i = 0; i < xls_data.count(); i++) {
        for (int j = 0; j < xls_data.at(i).count(); j++) {
            if(sectionKeys.contains(QString(xls_data.at(i).at(0).toByteArray())))
            {
                //找到key值,ini数据写入
                const QString sectionName = ui->lineEdit_section->text();

                settings.beginGroup(sectionName);
                // 定义要写入的键值对
                settings.setValue(QString(xls_data.at(i).at(0).toByteArray()), QString(xls_data.at(i).at(1).toByteArray()));

                settings.endGroup();

                // 同步到磁盘
                settings.sync();
            }
        }
    }
    QVariant valueIniMatch;
    foreach (const QString &key, settings.allKeys()) {
        valueIniMatch = settings.value(key);
    }

    //刷新页面
    brushUIIni();

    //成功提示
    QMessageBox::information(this,"success","success!!!");
}

void MainWindow::brushUIIni()
{
    // 使用QSettings读取INI文件
    QSettings settings(filepathini, QSettings::IniFormat);

    // 创建一个模型
    QStandardItemModel *model = new QStandardItemModel(0, 2, this); // 假设我们有两列
    model->setHorizontalHeaderItem(0, new QStandardItem("Key"));
    model->setHorizontalHeaderItem(1, new QStandardItem("Value"));

    settings.beginGroup(ui->lineEdit_section->text());
    // 遍历组内的键
    QStringList keys = settings.allKeys();
    for (const QString &key : keys) {
        // 添加行
        int row = model->rowCount();
        model->insertRow(row);
        model->setData(model->index(row, 0), key);
        model->setData(model->index(row, 1), settings.value(key));
    }
    settings.endGroup();

    // 将模型设置到TableView
    ui->tableView_ini->setModel(model);

    // 隐藏行号和列号
    ui->tableView_ini->verticalHeader()->hide();
    ui->tableView_ini->horizontalHeader()->hide();
}

二、视频

QQ202493-163449

相关推荐
m0_748255268 分钟前
easyExcel导出大数据量EXCEL文件,前端实现进度条或者遮罩层
前端·excel
小张认为的测试30 分钟前
Linux性能监控命令_nmon 安装与使用以及生成分析Excel图表
linux·服务器·测试工具·自动化·php·excel·压力测试
PieroPc7 小时前
Python 写的 智慧记 进销存 辅助 程序 导入导出 excel 可打印
开发语言·python·excel
不吃鱼的羊1 天前
Excel生成DBC脚本源文件
服务器·网络·excel
chenchihwen1 天前
数据分析时的json to excel 转换的好用小工具
数据分析·json·excel
lxxxxl1 天前
C#调用OpenXml,读取excel行数据,遇到空单元跳过现象处理
excel
m0_748246351 天前
前端通过new Blob下载文档流(下载zip或excel)
前端·excel
不吃鱼不吃鱼2 天前
Excel加载项入门:原理、安装卸载流程与常见问题
excel·wps
深耕AI2 天前
在Excel中绘制ActiveX控件:解决文本编辑框定位问题
java·前端·excel