Qt处理JSON数据(含数组)并保存至excel表格
今天主要是说一下,今天在项目中解决掉得一个项目需求,需求大概是这样的:qt后台需要处理一份JSON文件,当然了这个是一份标准的JSON文件,然后处理转换存入excel表格。其实这个需求可以分解为三步:
- 解析JSON文件中的数据
- 将第一步中解析出来的数据保存在数据结构中。
- 将第二部中的保存的数据写入excel表格。
为了能够让大家更方便的学习,我写了一个小的项目,来让大家看的更清楚。具体的项目是做的过程是将下面这一份示例文件,存入excel表格。
{"NBA": [{"teamName": "金州勇士队","coach": "史蒂夫-科尔","boss": "乔-拉克布"}, {"teamName": "洛杉矶快船","coach": "道格-里弗斯","boss": "史蒂夫-鲍尔默"}, {"teamName": "洛杉矶湖人","coach": "卢克-沃顿","boss": "珍妮-巴斯"}, {"teamName": "萨克拉门托国王","coach": "戴夫-乔尔格","boss": "维维克-拉纳戴夫"}, {"teamName": "波特兰开拓者","coach": "特里-斯托茨","boss": "保罗-艾伦"}, {"teamName": "俄克拉荷马雷霆","coach": "比利-多诺万","boss": "克莱顿-本内特"}]
}
最后保存在excel表格中的样式是这样的:
下面开始说说实现这个小项目的代码。
#1.解析JSON文件中的数据。
这一步中,虽然说qt都有现成的API供大家调用,不过我在这一块还是花了不少时间,当然这只是对比第二三步来说,或许是因为我对JSON格式的数据不是很清楚吧,这块的API还是挺绕的。
bool MainWindow::analysisJson(QString FileName)
{//采用普通方式打开文件,并且存入allDada中,注意这是一种QByteArray格式QFile loadFile(FileName);if(!loadFile.open(QIODevice::ReadOnly)){qDebug() << "could't open projects json";return false;}QByteArray allData = loadFile.readAll();loadFile.close();//开始进行一系列JSON相关的处理QJsonParseError json_error;QJsonDocument jsonDoc(QJsonDocument::fromJson(allData, &json_error));if(json_error.error != QJsonParseError::NoError){qDebug() << "json error!";return false;}QJsonObject rootObj = jsonDoc.object();//最后数据存入了QJsonObject格式的rootObj中if (rootObj.contains("NBA")){QJsonValue value = rootObj.value("NBA");if (value.isArray()){QJsonArray array = value.toArray();int nSize = array.size();for (int i = 0; i < nSize; ++i){NBATeamData temp;temp.teamName = array.at(i).toObject().value("teamName").toString();temp.coachName = array.at(i).toObject().value("coach").toString();temp.BossName = array.at(i).toObject().value("boss").toString();teamData.append(temp);}}}
}
- 这部分的代码实现从开始到处理rootObj之前,这其实都是套路,大家只需要照搬过来就可以了。这部分也没有啥需要说的。
- 需要注意的就是我处理rootObj的思路。首先分析这个JSON文件,其实很简单,(大家都知道JSON文件说白了就是键值对),这个文件就是一个键值对嵌套了另外一个键值对,然后里边的键值对还用数组表示。这是一个比较难的一个点。
2.1 首先判断并且根据最外层的键值对的key值,来获取QJsonValue对象。这个对象是存储着值的。
2.2 然后根据判断2.1中获取到的QJsonValue对象是不是数组结构,是的话,转成QJsonArray.
2.3 这一步的思路是最重要的,2.2的做法就是为了遍历,然后因为数组中的每一个值,又是三个键值对。想要实现这三个键值对的获取,就必须将之在转化为Object对象,然后再按照处理Object的方法去处理。
2. 解析出来的数据保存在数据结构中
下面是我定义的用来储存数据结构的一个类。
class NBATeamData
{
public:QString teamName;QString coachName;QString BossName;
};
其实我是用QList teamData;来保存JSON的解析结果,也就是定义NBATeamData这个类来存单个数据,然后用QList将其封装起来,以方便操作数据。
3. 写入excel表格
先直接上代码
bool MainWindow::addToExcel(QList<NBATeamData> data)
{QString filepath = "D:\\NBA.xls";if(!filepath.isEmpty()){QAxObject *excel = new QAxObject(this);excel->setControl("Excel.Application");//连接Excel控件excel->dynamicCall("SetVisible (bool Visible)","false");//不显示窗体excel->setProperty("DisplayAlerts", false);//不显示任何警告信息。如果为true那么在关闭是会出现类似“文件已修改,是否保存”的提示QAxObject *workbooks = excel->querySubObject("WorkBooks");//获取工作簿集合workbooks->dynamicCall("Add");//新建一个工作簿QAxObject *workbook = excel->querySubObject("ActiveWorkBook");//获取当前工作簿QAxObject *worksheets = workbook->querySubObject("Sheets");//获取工作表集合QAxObject *worksheet = worksheets->querySubObject("Item(int)",1);//获取工作表集合的工作表1,即sheet1QAxObject *cellA,*cellB,*cellC;//设置标题int cellrow=1;QString A="A"+QString::number(cellrow);//设置要操作的单元格,如A1QString B="B"+QString::number(cellrow);QString C="C"+QString::number(cellrow);//获取单元格cellA = worksheet->querySubObject("Range(QVariant, QVariant)",A);cellB = worksheet->querySubObject("Range(QVariant, QVariant)",B);cellC=worksheet->querySubObject("Range(QVariant, QVariant)",C);//设置单元格的值cellA->dynamicCall("SetValue(const QVariant&)",QVariant("队名"));cellB->dynamicCall("SetValue(const QVariant&)",QVariant("教练"));cellC->dynamicCall("SetValue(const QVariant&)",QVariant("老板"));cellrow++;int rows=data.size();for(int i=0;i<rows;i++){QString A="A"+QString::number(cellrow);//设置要操作的单元格,如A1QString B="B"+QString::number(cellrow);QString C="C"+QString::number(cellrow);cellA = worksheet->querySubObject("Range(QVariant, QVariant)",A);//获取单元格cellB = worksheet->querySubObject("Range(QVariant, QVariant)",B);cellC = worksheet->querySubObject("Range(QVariant, QVariant)",C);cellA->dynamicCall("SetValue(const QVariant&)",QVariant(data.at(i).teamName));//设置单元格的值cellB->dynamicCall("SetValue(const QVariant&)",QVariant(data.at(i).coachName));cellC->dynamicCall("SetValue(const QVariant&)",QVariant(data.at(i).BossName));cellrow++;}workbook->dynamicCall("SaveAs(const QString&)",QDir::toNativeSeparators(filepath));//保存至filepath,注意一定要用QDir::toNativeSeparators将路径中的"/"转换为"\",不然一定保存不了。workbook->dynamicCall("Close()");//关闭工作簿excel->dynamicCall("Quit()");//关闭exceldelete excel;excel=NULL;}return true;
}
- 首先说明一下在QT环境下运行这段代码,要加入如下:其中第一行为头文件,直接加入该文件即可。第二行需要加入.pro文件,加上axcontainer
#include<QAxObject>QT += core gui axcontainer
2.之后的话就是一些流水线的代码,相信你对它是不在话下的
代码下载地址:https://download.csdn.net/download/qq130106486/10725543
点击下载代码
Qt处理JSON数据(含数组)并保存至excel表格相关推荐
- c 将mysql表数据打印,c 中数据库数据如何导出至excel表格-用sql语句把一个数据库内的表保存成excel表格??...
如何用JAVA将数据库中的数据导入到excel表格 1.C语言产生ASCII数据文件,使用空格做作为数据分隔符. 2入Excel,选择数据选项卡 / 获部数据工具组 / 自文本按钮 3.进入数据导入框 ...
- labview将产生数据存入数组 并保存成Excel
很久没有用labview了,最近一个项目需要把仪器传来的数据保存下来,找了一个简单的方法.记录如下. 当数据是一个一个传进来的时候,可以把数据先存入一个数组,最后保存成excel文档. 实现方法如图. ...
- vue接收json数据_Vue之使用ajax获取json数据,并用v-for循环显示在表格中
运行的时候,出现了php跨域问题,解决办法是在php的头文件中添加了如下代码: header('Content-Type: application/json'); header('Content-Ty ...
- (1)今有2018年1月1日—15日的猪肉价格和牛肉价格的数据,它们存在于一个Excel表格中,如下表所示。将其读入Python中并用一个数据框变量df保存......
目录 (1)今有2018年1月1日-15日的猪肉价格和牛肉价格的数据,它们存在于一个Excel表格中,如下表所示.将其读入Python中并用一个数据框变量df保存. (2)分别绘制1月1日-10日的猪 ...
- python串口数据采集 保存_python 中Arduino串口传输数据到电脑并保存至excel表格
起因:学校运河杯报了个项目,制作一个天气预测的装置.我用arduino跑了BME280模块,用蓝牙模块实现两块arduino主从机透传.但是为了分析,还需要提取出数据.因此我用python写了个上位机 ...
- excel表格导入matlab并画等高线,#如何将excel表格中大量数据导入matlab中并作图#excel表格里的自由画笔...
怎样在已经制好的excel图表中插入新的数据制图 1,在excel里面你直接选中数据然击插入图表就可以啦~ 2要是想实时更新数据源可以尝试下用BDP版,只需要导入一次数据,选择并保存你想要的模板就可以 ...
- matlab中根据表格数据画图,excel 表格数据画图-如何利用matlab根据excel表格里面的数据画图...
在matlab上如何导入excel表格然后画图 "在excel中由数据画图,且显示图线的函数"的操作步骤是: 1.以Excel 2016为例,打开Excel工作表: 2.选择数据区 ...
- 网页中的表格保存为EXCEL表格,打印网页中的表格
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- qt解析json数据
qt解析json的数据,需要使用的类有qjsonobject,qjsonarray,qjsondocument. qjsondocument是用于读取或者写入json文件 qjsonarray是封装一 ...
最新文章
- eBPF内核探测中将任意系统调用转换成事件
- Ansible初始连接被控端配置
- 天河机场RFID技术应用浅析
- iptables: Resource temporarily unavailable.问题
- 微软全球执行副总裁沈向洋:人工智能的机遇和挑战
- 手把手教你利用微软的Bot Framework,LUIS,QnA Maker做一个简单的对话机器人
- POJ3155 Hard Life
- fabric 1.3.1 ,全手动部署到5台机器上.支持 kafka 模式的共识机制和 couchdb 存储,以及 fabric ca , fabric explorer的使用
- Unity游戏热更新
- javaweb_util_excel模板横向纵向循环
- Fragment already added解决
- HTML的基本结构及基本标签
- 【附源码】Python计算机毕业设计社区志愿者管理系统
- python弧度制转换 三角函数 反三角函数 双曲 反双曲 sin cos tan asin acos atan asinh acosh atanh atanh2
- 【Android 系统】--- 下载 Android源码
- 电路中滤波电容和退耦电容_怎么分清滤波电容、去耦电容、旁路电容
- 用开源系统来组件数据中心
- HCIP第十七天笔记
- 程序员与女朋友相处之道
- UG数控编程应该具备的知识在这里