今天主要是说一下,今天在项目中解决掉得一个项目需求,需求大概是这样的:qt后台需要处理一份JSON文件,当然了这个是一份标准的JSON文件,然后处理转换存入excel表格。其实这个需求可以分解为三步:

  1. 解析JSON文件中的数据
  2. 将第一步中解析出来的数据保存在数据结构中。
  3. 将第二部中的保存的数据写入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);}}}
}
  1. 这部分的代码实现从开始到处理rootObj之前,这其实都是套路,大家只需要照搬过来就可以了。这部分也没有啥需要说的。
  2. 需要注意的就是我处理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;
}
  1. 首先说明一下在QT环境下运行这段代码,要加入如下:其中第一行为头文件,直接加入该文件即可。第二行需要加入.pro文件,加上axcontainer
#include<QAxObject>QT       += core gui axcontainer

2.之后的话就是一些流水线的代码,相信你对它是不在话下的

代码下载地址:https://download.csdn.net/download/qq130106486/10725543
点击下载代码

Qt处理JSON数据(含数组)并保存至excel表格相关推荐

  1. c 将mysql表数据打印,c 中数据库数据如何导出至excel表格-用sql语句把一个数据库内的表保存成excel表格??...

    如何用JAVA将数据库中的数据导入到excel表格 1.C语言产生ASCII数据文件,使用空格做作为数据分隔符. 2入Excel,选择数据选项卡 / 获部数据工具组 / 自文本按钮 3.进入数据导入框 ...

  2. labview将产生数据存入数组 并保存成Excel

    很久没有用labview了,最近一个项目需要把仪器传来的数据保存下来,找了一个简单的方法.记录如下. 当数据是一个一个传进来的时候,可以把数据先存入一个数组,最后保存成excel文档. 实现方法如图. ...

  3. vue接收json数据_Vue之使用ajax获取json数据,并用v-for循环显示在表格中

    运行的时候,出现了php跨域问题,解决办法是在php的头文件中添加了如下代码: header('Content-Type: application/json'); header('Content-Ty ...

  4. (1)今有2018年1月1日—15日的猪肉价格和牛肉价格的数据,它们存在于一个Excel表格中,如下表所示。将其读入Python中并用一个数据框变量df保存......

    目录 (1)今有2018年1月1日-15日的猪肉价格和牛肉价格的数据,它们存在于一个Excel表格中,如下表所示.将其读入Python中并用一个数据框变量df保存. (2)分别绘制1月1日-10日的猪 ...

  5. python串口数据采集 保存_python 中Arduino串口传输数据到电脑并保存至excel表格

    起因:学校运河杯报了个项目,制作一个天气预测的装置.我用arduino跑了BME280模块,用蓝牙模块实现两块arduino主从机透传.但是为了分析,还需要提取出数据.因此我用python写了个上位机 ...

  6. excel表格导入matlab并画等高线,#如何将excel表格中大量数据导入matlab中并作图#excel表格里的自由画笔...

    怎样在已经制好的excel图表中插入新的数据制图 1,在excel里面你直接选中数据然击插入图表就可以啦~ 2要是想实时更新数据源可以尝试下用BDP版,只需要导入一次数据,选择并保存你想要的模板就可以 ...

  7. matlab中根据表格数据画图,excel 表格数据画图-如何利用matlab根据excel表格里面的数据画图...

    在matlab上如何导入excel表格然后画图 "在excel中由数据画图,且显示图线的函数"的操作步骤是: 1.以Excel 2016为例,打开Excel工作表: 2.选择数据区 ...

  8. 网页中的表格保存为EXCEL表格,打印网页中的表格

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  9. qt解析json数据

    qt解析json的数据,需要使用的类有qjsonobject,qjsonarray,qjsondocument. qjsondocument是用于读取或者写入json文件 qjsonarray是封装一 ...

最新文章

  1. eBPF内核探测中将任意系统调用转换成事件
  2. Ansible初始连接被控端配置
  3. 天河机场RFID技术应用浅析
  4. iptables: Resource temporarily unavailable.问题
  5. 微软全球执行副总裁沈向洋:人工智能的机遇和挑战
  6. 手把手教你利用微软的Bot Framework,LUIS,QnA Maker做一个简单的对话机器人
  7. POJ3155 Hard Life
  8. fabric 1.3.1 ,全手动部署到5台机器上.支持 kafka 模式的共识机制和 couchdb 存储,以及 fabric ca , fabric explorer的使用
  9. Unity游戏热更新
  10. javaweb_util_excel模板横向纵向循环
  11. Fragment already added解决
  12. HTML的基本结构及基本标签
  13. 【附源码】Python计算机毕业设计社区志愿者管理系统
  14. python弧度制转换 三角函数 反三角函数 双曲 反双曲 sin cos tan asin acos atan asinh acosh atanh atanh2
  15. 【Android 系统】--- 下载 Android源码
  16. 电路中滤波电容和退耦电容_怎么分清滤波电容、去耦电容、旁路电容
  17. 用开源系统来组件数据中心
  18. HCIP第十七天笔记
  19. 程序员与女朋友相处之道
  20. UG数控编程应该具备的知识在这里

热门文章

  1. 情人节献礼:来自码农的12个爱情添加剂
  2. 专为云原生、微服务架构而设计的链路追踪工具 【SkyWalking介绍及搭建】
  3. 5月24 文件操作
  4. 英语学习打卡day7
  5. oracle翻译甲骨文,甲骨文
  6. flex 查查你的号码归属地
  7. 兔子生小兔子的简单java实现
  8. android自定义伸缩框(展开效果)
  9. 禅医睡觉5戒律赶走春困
  10. 为让代码注释更和谐,有人提议用拥抱替换 Fu*k