excel扒数据到ini文件小工具

一、源码

注释很详细,就不讲了

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QVariant>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic: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
#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也可换用WorkSheetsQAxObject* 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();// 将模型设置到TableViewui->tableView_ini->setModel(model);// 隐藏行号和列号ui->tableView_ini->verticalHeader()->hide();ui->tableView_ini->horizontalHeader()->hide();
}

二、视频

QQ202493-163449

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/415489.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

免费SSL证书申请入口——支持自动续签

SSL证书是一种数字证书&#xff0c;用于在客户端&#xff08;如浏览器&#xff09;与服务器之间建立加密通信&#xff0c;确保数据传输的安全性和完整性。它通过加密技术保护网站免受数据窃取和篡改&#xff0c;同时验证网站的身份&#xff0c;让用户确认他们正在与正确的网站进…

最全盘点!国内外主流的在线CRM有哪些?

本文将盘点10款主流的在线CRM&#xff0c;为企业选型提供参考。 在线 CRM 就如同企业与客户之间的强力纽带&#xff0c;能把企业的客户关系管理得妥妥当当。 对于企业来说&#xff0c;如果没有好用的在线 CRM&#xff0c;就像航海者失去了罗盘&#xff0c;在市场的海洋中容易迷…

48.【C语言】结构体补充

承接20.【C语言】初识结构体&#xff08;重要&#xff09;中的结构体成员的访问 目录&#xff1a; 1.结构体创建 2.利用函数控制结构体 3.使用“结构体指针变量-->结构体成员变量”来修改结构体的数据 4.传值还是传址&#xff1f; 1.结构体创建 依据第20篇&#xff0c;可以…

Learning——protobuf的下载

目录 一、protobuf在windows下安装 1.下载地址 2.配置环境变量 ①打开设置 ②搜索框中搜索编译环境变量 ③ 点击“环境变量” ④ 找到PATH并双击打开编辑 ⑤配置环境变量后点击确定 3.检验是否安装成功 二、protobuf在Linux下安装 1.库依赖安装 2.下载地址 我不能使用…

二异硬脂醇苹果酸酯行业分析:前三大厂商占有大约51.0%的市场份额

二异硬脂醇苹果酸酯&#xff08;Distearyl Malate&#xff09;是一种由苹果酸与硬脂醇反应生成的酯类化合物&#xff0c;常用于化妆品和护肤品中作为润肤剂、增稠剂和乳化剂。其特点是具有良好的保湿和滋润效果&#xff0c;同时能提供丝滑的质地和优越的使用感&#xff0c;适合…

12款图纸加密软件大盘点,2024图纸加密软件最新推荐

图纸不仅是设计师的灵感结晶&#xff0c;更是企业宝贵的无形资产。然而&#xff0c;随着网络安全的日益严峻&#xff0c;如何确保这些图纸的安全&#xff0c;防止未经授权的访问和泄露&#xff0c;成为了每个企业和设计师不得不面对的问题。今天&#xff0c;就让我们一起揭开12…

Windows10上Nginx如何通过自签名证书方式发布Https服务(上)

背景 在Android开发中使用平板设备进行调试,Android版本是13。在调试中遇到一个这样的报错信息:“java.io.IOException: Cleartext HTTP traffic to 192.168.137.1 not permitted”,然后查了下报错原因是:应用正在尝试通过不安全的HTTP协议进行网络通信,而你的应用运行的环…

SQL【2】稍稍进阶

目录 首先&#xff0c;怎么安装&#xff0c;环境怎么调。 alter——改变&#xff08;此段Al&#xff09; 创建于删除数据库、表格 上一节进阶 预设值default​编辑 关于插入顺序 有条件的删除DELETE FROM 表 WHERE 条件 多种语句组合查看 查看排序​编辑 LIMIT 2只取前…

大模型入门 ch01:大模型概述

本文是github上的大模型教程LLMs-from-scratch的学习笔记&#xff0c;教程地址&#xff1a;教程链接 STAGE 1&#xff1a; BUILDING 1. 数据准备与采样 LLM的预测过程&#xff0c;是一个不断预测下一个词&#xff08;准确的说是token&#xff09;的过程&#xff0c;每次根据输…

计算机网络(八股文)

这里写目录标题 计算机网络一、网络分层模型1. TCP/IP四层架构和OSI七层架构⭐️⭐️⭐️⭐️⭐️2. 为什么网络要分层&#xff1f;⭐️⭐️⭐️3. 各层都有那些协议&#xff1f;⭐️⭐️⭐️⭐️ 二、HTTP【重要】1. http状态码&#xff1f;⭐️⭐️⭐️2. 从输入URL到页面展示…

佰朔资本:两步走!“科创板八条”后首单,亮点多多!

“科创板八条”后首单并购重组 普源精电创立于1998年&#xff0c;是国产电子测量仪器领军企业&#xff0c;公司拥有数字示波器、射频类仪器、波形发生器、电源及电子负载、万用表及数据收集五大产品族、八大产品线&#xff0c;并供应芯片级、模块级和系统级多层次处理方案&…

Carla自动驾驶仿真十:Carlaviz三维可视化平台搭建

文章目录 前言一、环境准备1、docker安装2、websocket-client安装3、carlaviz代码下载 二、carlaviz使用1、打开carla客户端2、输入启动命令3、进入carlaviz4、修改manual_control.py脚本5、运行manual_control.py脚本6、运行carlaviz官方脚本&#xff08;推荐&#xff09; 前言…

Oracle授权如何购买?多少钱?如何计算?

前言 作为DBA时常也会遇到一些商务的问题&#xff0c;比如购买Oracle 的授权&#xff0c;比如老板问用oracle有没有法律风险&#xff0c;这个组件是否收费&#xff1f;如何计算授权数&#xff1f;等等&#xff0c;本文根据博主的经验和一些Oracle公开的资料&#xff0c;来做一个…

戴尔科技领涨市场,AI服务器需求成关键驱动力

戴尔科技强劲上涨&#xff0c;AI服务器需求激增 戴尔科技公司日内股价飙升4.2%&#xff0c;达到115.42美元&#xff0c;接近一个月高点。这一强劲表现主要得益于该公司上调了年度盈利预期&#xff0c;原因是对Nvidia驱动的人工智能优化服务器的需求显著增加。戴尔将2025财年的年…

智能的JavaScript开发工具WebStorm v2024.2全新发布

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具&#xff0c;被广大中国JS开发者誉为"Web前端开发神器""强大的HTML5编辑器""智能的JavaSscript IDE"等。与IntelliJ IDEA同源&#xff0c;继承了IntelliJ IDEA强大的JS部分的功能。 立即获…

mate-indicators占用内存过高导致熔断

目录&#xff1a; 1、问题现象2、解决方法 1、问题现象 mate-indicators占用内存达30.9%&#xff08;内存溢出&#xff09;导致内存不足服务熔断。 2、解决方法 发现mate-indicators进程占用内存资源达到节点总内存40%&#xff0c;导致服务出现内存熔断 临时解决 systemct…

React 实现PDF预览(数据源使用文件流而不是url)

一 前提 应公司要求&#xff0c;需要进行上传文件&#xff08;pdf&#xff09;的预览功能&#xff0c;网上大部分都是使用url作为预览数据源&#xff0c;但是现在后端那边只返回了pdf文件流&#xff0c;所以本文主要是用文件流来预览pdf。 二 首先需要获取pdf文件流&#xff…

OpenCV绘图函数(15)图像上绘制矩形函数 rectangle()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 绘制一个简单的、粗的或填充的直立矩形。 这个函数 cv::rectangle 绘制一个矩形轮廓或一个填充的矩形&#xff0c;其两个相对的顶点分别是 pt1 和…

【STM32+HAL库】---- 按键中断控制LED

硬件开发板&#xff1a;STM32G0B1RET6 软件平台&#xff1a;cubemaxkeilVScode1 新建cubemax工程 1.1 配置系统时钟树 1.2 配置相关GPIO引脚 ①LED由PC13引脚控制 选择PA5引脚&#xff0c;GPIO_Output模式 GPIO模式配置&#xff1a; ②按键开关由PC13引脚控制 选择PC13引…

arcgisjs4.0 内网部署字体不显示问题处理

问题背景问题定位解决方案 问题背景 内网环境&#xff0c;通过压缩包的hash值验证了包是一摸一样的&#xff0c;ningx也读到了index.html&#xff0c;但是网格的字提显示出不来&#xff0c;并且地图上的注记文字均不显示 本地环境地图情况&#xff1a; 内网环境地图情况&…