JSON与EXL文件互转

打印 上一主题 下一主题

主题 518|帖子 518|积分 1554

功能:实现json到excel文件的相互转换(支持json多选版)
目的:编码与语言对应,方便大家利用
页面计划:

介绍:
1.选择文件栏目选择想要转换的文件
2.天生路径是转换后文件地点目次
3.小方框勾选与不勾选分别代表exl到json和json到exl两种类型的转换
利用方法:
1.点击选择按钮,选择要剖析的文件(json转exl支持多选文件,按ctrl或shift键)




  • 同样选择一个天生的路径,点击转换按钮。不选路径则会弹出错误提示。


3.点击exl转json复选框,则会清除之前所选的json文件,切换可以或许所选的文件类型

4.选好所需转换的文件和和天生路径,点击转换按钮。转换完成后会弹出提示框。


5.找到目次下转换好的文件并打开检察。
(1)单个json转exl,天生文件为json文件的原名字。多选转换名字为JsonToExl。
(2)转换后第一行第一列固定为key,第一行其他列标题对应的各个json文件名字。
(3)多转情况下,有的文件中没有key其对应内容,则填充为Null值。(下图1)
(4)若转换的json文件中包罗多层json对象,每层添加标识符“#¥&”(下图3)




6.excel转json也是同理,勾上对钩,选择要转换的excel文件,点击转换。根据exl中的首行标题名,天生的json文件名

 原代码:
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include "qfiledialog.h"
  4. #include <QDebug>
  5. #include <QtWidgets/QMessageBox>
  6. #include <QCoreApplication>
  7. #include <qprogressbar.h>
  8. #include <QProgressDialog.h>
  9. #include <QMetaType>
  10. MainWindow::MainWindow(QWidget *parent) :
  11.     QMainWindow(parent),
  12.     ui(new Ui::MainWindow)
  13. {
  14.     ui->setupUi(this);
  15.     ui->progressBar->hide();
  16.     ui->version->setText(APP_VERSION);
  17.     workThread = new QThread;
  18.     ConvertWork = new ConvertThread;
  19.     ConvertWork->moveToThread(workThread);
  20.     qRegisterMetaType<eConvertType>("eConvertType");//需注册 参数含有枚举类型,否则将无法进入槽函数
  21.     connect(ConvertWork, &ConvertThread::Sig_Result, this, &MainWindow::on_Progress);
  22.     connect(this, &MainWindow::Sig_SetConvert, ConvertWork, &ConvertThread::setConvert);
  23. }
  24. MainWindow::~MainWindow()
  25. {
  26.     workThread->quit();
  27.     ConvertWork->deleteLater();
  28.     workThread->deleteLater();
  29.     delete ui;
  30. }
  31. //转换按钮点击
  32. void MainWindow::on_ConvertButton_clicked()
  33. {
  34.     if(ui->FileNameText->toPlainText().isEmpty())
  35.     {
  36.         QMessageBox *msgBox;
  37.         msgBox = new QMessageBox("","请选择转换目标文件",QMessageBox::NoIcon,QMessageBox::Ok | QMessageBox::Default,NULL,0);
  38.         msgBox->setWindowFlags(Qt::WindowStaysOnTopHint);
  39.         msgBox->show();
  40.         return;
  41.     }
  42.     if(ui->GeneratePathText->toPlainText().isEmpty())
  43.     {
  44.         QMessageBox *msgBox;
  45.         msgBox = new QMessageBox("","请选择生成路径",QMessageBox::NoIcon,QMessageBox::Ok | QMessageBox::Default,NULL,0);
  46.         msgBox->setWindowFlags(Qt::WindowStaysOnTopHint);
  47.         msgBox->show();
  48.         return;
  49.     }
  50.     if(!workThread->isRunning())
  51.     {
  52.         workThread->start();
  53.     }
  54.     if(ui->checkBox->isChecked())
  55.     {
  56.         emit Sig_SetConvert(emConvert_ExcelToJson, m_SelectFile, m_GeneratePath);
  57.     }
  58.     else
  59.     {
  60.         emit Sig_SetConvert(emConvert_JsonToExcel, m_SelectFile, m_GeneratePath);
  61.     }
  62. }
  63. //选择生成目录按钮点击
  64. void MainWindow::on_GenerateButton_clicked()
  65. {
  66.     //选择文件路径
  67.     m_GeneratePath = QFileDialog::getExistingDirectory();
  68.     if(!m_GeneratePath.isEmpty())
  69.     {
  70.         //填入文本框
  71.         ui->GeneratePathText->setText(m_GeneratePath);
  72.     }
  73. }
  74. //选择解析文件按钮点击
  75. void MainWindow::on_SelectButton_clicked()
  76. {
  77.     m_SelectFile.clear();
  78.     //选择要解析的文件
  79.     if(ui->checkBox->isChecked())
  80.     {
  81.         //exl文件只做单选
  82.         m_SelectFile.append(QFileDialog::getOpenFileName(this, tr("选择转码文件"), "/", "xls (*.xls)"));        
  83.     }
  84.     else
  85.     {
  86.         m_SelectFile = QFileDialog::getOpenFileNames(this, tr("选择转码文件"), "/", "json (*.json);;txt(*.txt)");
  87.     }
  88.     ui->FileNameText->clear();
  89.     foreach (QString SelectFile, m_SelectFile)
  90.     {
  91.         //填入文本框
  92.         ui->FileNameText->append(SelectFile);
  93.     }
  94. }
  95. //复选框响应
  96. void MainWindow::on_checkBox_clicked()
  97. {
  98.     if(ui->checkBox->isChecked())
  99.     {
  100.         if((ui->FileNameText->toPlainText().contains(".json")||ui->FileNameText->toPlainText().contains(".txt")))
  101.             ui->FileNameText->clear();
  102.     }
  103.     else
  104.     {
  105.         if(ui->FileNameText->toPlainText().contains(".xls"))
  106.             ui->FileNameText->clear();
  107.     }
  108. }
  109. void MainWindow::on_Progress(eConvertType ConvertType, int nProgress, const QString &strMsg)
  110. {
  111.     QString strConvertType = "";
  112.     if (emConvert_JsonToExcel == ConvertType)
  113.     {
  114.         strConvertType = "JsonToExcel";
  115.     }
  116.     else if (emConvert_ExcelToJson == ConvertType)
  117.     {
  118.         strConvertType = "ExcelToJson";
  119.     }
  120.     if(100 == nProgress)
  121.     {
  122.         ui->progressBar->hide();
  123.         QMessageBox *msgBox;
  124.         msgBox = new QMessageBox(strConvertType, strMsg, QMessageBox::NoIcon,QMessageBox::Ok|QMessageBox::Default, NULL, 0);
  125.         msgBox->setWindowFlags(Qt::WindowStaysOnTopHint);
  126.         msgBox->show();
  127.     }
  128.     else if(0 == nProgress)
  129.     {
  130.         ui->progressBar->show();
  131.         ui->progressBar->setOrientation(Qt::Horizontal);  // 水平方向
  132.         ui->progressBar->setMinimum(0);  // 最小值
  133.         ui->progressBar->setMaximum(0);  // 最大值
  134.     }
  135.     else
  136.     {
  137.         ui->progressBar->hide();
  138.         QMessageBox *msgBox;
  139.         msgBox = new QMessageBox(strConvertType, strMsg, QMessageBox::NoIcon,QMessageBox::Ok|QMessageBox::Default, NULL, 0);
  140.         msgBox->setWindowFlags(Qt::WindowStaysOnTopHint);
  141.         msgBox->show();
  142.     }
  143. }
复制代码
  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3. #include <QMainWindow>
  4. #include <QThread>
  5. #include "convertThread.h"
  6. namespace Ui {
  7. class MainWindow;
  8. }
  9. /**主页面**/
  10. class MainWindow : public QMainWindow
  11. {
  12.     Q_OBJECT
  13. public:
  14.     explicit MainWindow(QWidget *parent = 0);
  15.     ~MainWindow();
  16. private slots:
  17.     void on_ConvertButton_clicked();//生成
  18.     void on_SelectButton_clicked();//选择解析文件
  19.     void on_GenerateButton_clicked();//选择生成路径
  20.     void on_checkBox_clicked();//复选框
  21.     void on_Progress(eConvertType ConvertType, int nProgress, const QString &strMsg);//进度条信号槽
  22. private:
  23.     Ui::MainWindow *ui;
  24.     QStringList m_SelectFile;//选择解析文件
  25.     QString m_GeneratePath;//选择生成路径
  26.     QThread *workThread;
  27.     ConvertThread *ConvertWork;
  28. signals:
  29.     void Sig_SetConvert(eConvertType ConvertType, const QStringList SelectFile, const QString GeneratePath);
  30. };
  31. #endif // MAINWINDOW_H
复制代码
  1. #include "convertThread.h"
  2. #include "qfiledialog.h"
  3. #include <QDebug>
  4. #include <QJsonParseError>
  5. #include <ActiveQt/QAxObject>
  6. #include <qjsonobject.h>
  7. #include <qjsonarray.h>
  8. #include <QDateTime>
  9. ConvertThread::ConvertThread()
  10. {
  11.     m_eConvertType = emConvert_JsonToExcel;
  12.     m_SelectFileList.clear();
  13.     m_GeneratePath = "";
  14.     m_Identifier = "#$&";
  15.     m_BlankGrid = "";
  16.     m_GenerateFileList.clear();
  17.     m_NodeDataList.clear();
  18. }
  19. ConvertThread::~ConvertThread()
  20. {
  21. }
  22. void ConvertThread::setConvert(eConvertType ConvertType, const QStringList SelectFile, const QString GeneratePath)
  23. {
  24.     QMutexLocker locker(&lock);
  25.     m_eConvertType = ConvertType;
  26.     m_SelectFileList = SelectFile;
  27.     m_GeneratePath = GeneratePath;
  28.     m_NodeDataList.clear(); //清空
  29.     m_GenerateFileList.clear();
  30.     emit Sig_Result(m_eConvertType, 0, "start");
  31.     if(m_eConvertType == emConvert_JsonToExcel)
  32.     {
  33.         int FileOrder = 0;
  34.         foreach (QString SelectFile, m_SelectFileList)
  35.         {
  36.             //JSON转EXL
  37.             if(analysisJson(SelectFile, FileOrder)==true)
  38.             {
  39.                 for(stNodeData &NodeData : m_NodeDataList)
  40.                 {
  41.                     while(NodeData.m_value.size() <= FileOrder)
  42.                     {
  43.                         NodeData.m_value.append(m_BlankGrid);
  44.                     }
  45.                 }
  46.                 FileOrder++;
  47.             }
  48.             else
  49.             {
  50.                 return;
  51.             }
  52.         }
  53.         addToExcel();
  54.     }
  55.     else if(m_eConvertType == emConvert_ExcelToJson)
  56.     {
  57.         foreach (QString SelectFile, m_SelectFileList)
  58.         {
  59.             //EXL转JSON
  60.             bool result=analysisExcel(SelectFile);
  61.             if(!result)
  62.             {
  63.                 return;
  64.             }
  65.         }
  66.         addToJson();
  67.     }
  68. }
  69. //解析json字符
  70. bool ConvertThread::analysisJson(QString FileName, int FileOrder)
  71. {
  72.     //采用普通方式打开文件,并且存入allDada中,注意这是一种QByteArray格式
  73.     QFile loadFile(FileName);
  74.     if(loadFile.open(QIODevice::ReadOnly))
  75.     {
  76.         //开始进行一系列JSON相关的处理        
  77.         QByteArray allData = loadFile.readAll();//读取文件所有数据
  78.         loadFile.close();//关闭文件
  79.         QJsonParseError json_error;
  80.         QJsonDocument::fromJson(allData, &json_error);//根据读取的数据检查json文件是否出错
  81.         if(json_error.error != QJsonParseError::NoError)
  82.         {
  83.             emit Sig_Result(m_eConvertType, -1, FileName + "文件解析出错");
  84.             return false;
  85.         }
  86.         //顺序获取key值
  87.         QString jsonString(allData);//将数据转为QString
  88.         bool ok;
  89.         QVariantJsonList QVariantJsonList = QtJson::parse(jsonString, ok);
  90.         if(QVariantJsonList.isEmpty())
  91.         {
  92.             emit Sig_Result(m_eConvertType, -1, FileName + "文件为空");
  93.             return false;
  94.         }
  95.         foreach (stJsonNodeData JsonNodeData, QVariantJsonList)
  96.         {
  97.             QList<stNodeData> NodeDataList = analysisValue(JsonNodeData.m_value, JsonNodeData.m_key, FileOrder);
  98.             if(!NodeDataList.isEmpty())
  99.                 m_NodeDataList.append(NodeDataList);
  100.         }
  101.         /* key值自动排序 */
  102. //        QJsonParseError json_error;
  103.     }
  104.     else
  105.     {
  106.         emit Sig_Result(m_eConvertType, -1, "Json文件打开失败");
  107.         return false;
  108.     }
  109.     return true;
  110. }
  111. //解析json节点
  112. QList<stNodeData> ConvertThread::analysisValue(const QJsonValue OneValue, QString Key, int FileOrder)
  113. {
  114.     stNodeData team = {};
  115.     QList<stNodeData> teamList = {};
  116.     if(!OneValue.isObject())
  117.     {
  118.         for(stNodeData &NodeData : m_NodeDataList)
  119.         {
  120.             if(NodeData.m_key == Key)
  121.             {
  122.                  while(NodeData.m_value.size() < FileOrder)
  123.                  {
  124.                      NodeData.m_value.append(m_BlankGrid);
  125.                  }
  126.                  NodeData.m_value.append(OneValue.toString());
  127.                  return teamList;
  128.             }
  129.         }
  130.         //里面没有再包一层直接添加数据
  131.         team.m_key.append(Key);
  132.         while(FileOrder > 0)
  133.         {
  134.             team.m_value.append(m_BlankGrid);
  135.             FileOrder--;
  136.         }
  137.         team.m_value.append(OneValue.toString());
  138.         teamList.append(team);
  139.     }
  140.     else
  141.     {
  142.         // 转换成对象类型
  143.         QJsonObject serialOneObj = OneValue.toObject();
  144.         for(QJsonObject::iterator it = serialOneObj.begin(); it != serialOneObj.end(); ++it)
  145.         {
  146.             team = {};
  147.             //用#$&标识符区分每一层节点
  148.             team.m_key = Key + m_Identifier +it.key();
  149.             //根据value是否对象类型判断是否继续递归调研
  150.             if(it.value().isObject())
  151.             {
  152.                 QList<stNodeData> NodeDataList = analysisValue(it.value(), team.m_key, FileOrder);
  153.                 if(!NodeDataList.isEmpty())
  154.                     teamList.append(NodeDataList);
  155.             }
  156.             else
  157.             {
  158.                 bool exist = false;
  159.                 for(stNodeData &NodeData : m_NodeDataList)
  160.                 {
  161.                     if(NodeData.m_key == team.m_key)
  162.                     {
  163.                         while(NodeData.m_value.size() < FileOrder)
  164.                         {
  165.                             NodeData.m_value.append(m_BlankGrid);
  166.                         }
  167.                         NodeData.m_value.append(it.value().toString());
  168.                         exist = true;
  169.                         break;
  170.                     }
  171.                 }
  172.                 if(exist)
  173.                     continue;
  174.                 while(FileOrder > 0)
  175.                 {
  176.                     team.m_value.append(m_BlankGrid);
  177.                     FileOrder--;
  178.                 }
  179.                 team.m_value.append(it.value().toString());
  180.                 teamList.append(team);
  181.             }
  182.         }
  183.     }
  184.     return teamList;
  185. }
  186. QList<stNodeData> ConvertThread::analysisValue(const QVariant OneValue, QString Key, int FileOrder)
  187. {
  188.     stNodeData team = {};
  189.     QList<stNodeData> teamList = {};
  190.     QVariantJsonList JsonList = OneValue.value<QVariantJsonList>();
  191.     if(JsonList.isEmpty())
  192.     {
  193.         for(stNodeData &NodeData : m_NodeDataList)
  194.         {
  195.             if(NodeData.m_key == Key)
  196.             {
  197.                  while(NodeData.m_value.size() < FileOrder)
  198.                  {
  199.                      NodeData.m_value.append(m_BlankGrid);
  200.                  }
  201.                  NodeData.m_value.append(OneValue.toString());
  202.                  return teamList;
  203.             }
  204.         }
  205.         //里面没有再包一层直接添加数据
  206.         team.m_key.append(Key);
  207.         while(FileOrder > 0)
  208.         {
  209.             team.m_value.append(m_BlankGrid);
  210.             FileOrder--;
  211.         }
  212.         team.m_value.append(OneValue.toString());
  213.         teamList.append(team);
  214.     }
  215.     else
  216.     {
  217.         // 转换成对象类型
  218.         foreach (stJsonNodeData JsonNode, JsonList)
  219.         {
  220.             team = {};
  221.             //用#$&标识符区分每一层节点
  222.             team.m_key = Key + m_Identifier + JsonNode.m_key;
  223.             //根据value是否对象类型判断是否继续递归调研
  224.             if(JsonNode.m_value.value<QVariantJsonList>().isEmpty())
  225.             {
  226.                 bool exist = false;
  227.                 for(stNodeData &NodeData : m_NodeDataList)
  228.                 {
  229.                     if(NodeData.m_key == team.m_key)
  230.                     {
  231.                         while(NodeData.m_value.size() < FileOrder)
  232.                         {
  233.                             NodeData.m_value.append(m_BlankGrid);
  234.                         }
  235.                         NodeData.m_value.append(JsonNode.m_value.toString());
  236.                         exist = true;
  237.                         break;
  238.                     }
  239.                 }
  240.                 if(exist)
  241.                     continue;
  242.                 while(FileOrder > 0)
  243.                 {
  244.                     team.m_value.append(m_BlankGrid);
  245.                     FileOrder--;
  246.                 }
  247.                 team.m_value.append(JsonNode.m_value.toString());
  248.                 teamList.append(team);
  249.             }
  250.             else
  251.             {
  252.                 QList<stNodeData> NodeDataList = analysisValue(JsonNode.m_value, team.m_key, FileOrder);
  253.                 if(!NodeDataList.isEmpty())
  254.                     teamList.append(NodeDataList);
  255.             }
  256.         }
  257.     }
  258.     return teamList;
  259. }
  260. //添加到excel表格中
  261. bool ConvertThread::addToExcel()
  262. {  
  263.     QAxObject *excel = new QAxObject(this);
  264.     excel->setControl("Excel.Application");//连接Excel控件
  265.     excel->dynamicCall("SetVisible (bool Visible)","false");//不显示窗体
  266.     excel->setProperty("DisplayAlerts", false);//不显示任何警告信息。如果为true那么在关闭是会出现类似"文件已修改,是否保存"的提示
  267.     QAxObject *workbooks = excel->querySubObject("WorkBooks");//获取工作簿集合
  268.     workbooks->dynamicCall("Add");//新建一个工作簿
  269.     QAxObject *workbook = excel->querySubObject("ActiveWorkBook");//获取当前工作簿
  270.     QAxObject *worksheets = workbook->querySubObject("Sheets");//获取工作表集合
  271.     QAxObject *worksheet = worksheets->querySubObject("Item(int)",1);//获取工作表集合的工作表1,即sheet1
  272.     //宽度自适应
  273.     auto range = worksheet->querySubObject("UsedRange");
  274.     QAxObject * cells = range->querySubObject("Columns");
  275.     if (cells)
  276.     {
  277.        cells->dynamicCall("AutoFit");
  278.     }
  279.     //Json文件转换得到的列标题
  280.     QList<QVariant> oRowdata;
  281.     QList<QString> aline;
  282.     aline.append("key");
  283.     for (QString &SelectFile:m_SelectFileList)
  284.     {
  285.         QStringList list = SelectFile.split("/");
  286.         QString Title = list.last();
  287.         if(Title.contains(".json"))
  288.             Title.remove(".json");
  289.         else if(Title.contains(".txt"))
  290.             Title.remove(".txt");
  291.         aline.append(Title);
  292.     }
  293.     oRowdata.append(QVariant(aline));
  294.     char endCol = 'A' + m_SelectFileList.size();
  295.     QString strRange = "A"+ QString::number(1) + ":" + QString(endCol) + QString::number(1);//需写入数据的表格范围
  296.     QAxObject *oRange = worksheet->querySubObject("Range(QString)", strRange);
  297.     if (oRange)
  298.     {
  299.         oRange->setProperty("HorizontalAlignment", -4108);//设置单元格内容居中
  300.         oRange->setProperty("NumberFormatLocal", "@");//设置单元格格式(文本)
  301.         oRange->setProperty("Value2", oRowdata);//设置单元格值
  302.     }
  303.     //Key与对应内容
  304.     oRowdata.clear();
  305.     foreach (stNodeData NodeData, m_NodeDataList)
  306.     {
  307.         aline.clear();
  308.         aline.append(NodeData.m_key);
  309.         foreach (QString value, NodeData.m_value)
  310.         {
  311.             aline.append(value);
  312.         }
  313.         oRowdata.append(QVariant(aline));
  314.     }
  315.     QVariant oData(oRowdata);
  316.     strRange = "A"+ QString::number(2) + ":" + QString(endCol) + QString::number(m_NodeDataList.size() + 1);
  317.     oRange = worksheet->querySubObject("Range(QString)", strRange);
  318.     if (oRange)
  319.     {
  320.         oRange->setProperty("HorizontalAlignment", -4131);
  321.         oRange->setProperty("NumberFormatLocal", "@");
  322.         oRange->setProperty("Value2", oData);
  323.     }
  324.     QString filepath= m_SelectFileList.at(0);
  325.     //单个json文件转excel,文件命名为源文件名字,多转一命名为JsonToExl
  326.     if(m_SelectFileList.size()==1)
  327.     {
  328.         QStringList list = m_SelectFileList.at(0).split("/");
  329.         QString FileName =list.last();
  330.         if(FileName.contains(".txt"))
  331.         {
  332.             FileName=FileName.remove(".txt");
  333.         }
  334.         else if(FileName.contains(".json"))
  335.         {
  336.             FileName=FileName.remove(".json");
  337.         }
  338.         filepath = m_GeneratePath+"\" + FileName+".xls";
  339.     }
  340.     else if(m_SelectFileList.size()>1)
  341.     {
  342.         filepath = m_GeneratePath + "\\JsonToExl.xls";
  343.     }
  344.     workbook->dynamicCall("SaveAs(const QString&)",QDir::toNativeSeparators(filepath));//保存至filepath,注意一定要用QDir::toNativeSeparators将路径中的"/"转换为"",不然一定保存不了。
  345.     workbook->dynamicCall("Close()");//关闭工作簿
  346.     excel->dynamicCall("Quit()");//关闭excel
  347.     delete excel;
  348.     excel = NULL;
  349.     emit Sig_Result(m_eConvertType, 100, "转换完成");
  350.     return true;
  351. }
  352. //解析excel文件
  353. bool ConvertThread::analysisExcel(QString FileName)
  354. {
  355.     QAxObject* excel = new QAxObject("Excel.Application");
  356.     if (!excel) {
  357.         emit Sig_Result(m_eConvertType, -1, "无法创建 Excel 对象");
  358.         return false;
  359.     }
  360.     // 打开工作簿
  361.     QAxObject* workbooks = excel->querySubObject("Workbooks");
  362.     QAxObject* workbook = workbooks->querySubObject("Open(const QString&)", FileName);
  363.     // 获取第一个工作表
  364.     QAxObject* sheets = workbook->querySubObject("Worksheets");
  365.     QAxObject* sheet = sheets->querySubObject("Item(int)", 1);
  366.     QAxObject *rangeAx = sheet->querySubObject("UsedRange"); //直接读整个表
  367.     QVariant rangeData = rangeAx ->dynamicCall("Value2()");
  368.     QVariantList rangeDataList = rangeData.toList();
  369.     bool first = true;
  370.     foreach (QVariant rowData, rangeDataList)
  371.     {
  372.         QVariantList rowDataList =  rowData.toList() ;
  373.         stNodeData NodeData = {};
  374.         for(int i = 0; i < rowDataList.size(); i++)
  375.         {
  376.             QString cellValue = rowDataList[i].toString();
  377.             if(0 == i)
  378.                 NodeData.m_key = cellValue;
  379.             else
  380.                 NodeData.m_value.append(cellValue);
  381.         }
  382.         if(first)
  383.         {
  384.             first = false;
  385.             m_GenerateFileList = NodeData.m_value;
  386.         }
  387.         else
  388.         {
  389.             m_NodeDataList.append(NodeData);
  390.         }
  391.     }
  392.     // 关闭并释放资源
  393.     workbook->dynamicCall("Close()");
  394.     excel->dynamicCall("Quit()");
  395.     delete sheet;
  396.     delete sheets;
  397.     delete workbook;
  398.     delete workbooks;
  399.     delete excel;
  400.     excel = NULL;
  401.     return true;
  402. }
  403. //生成Json对象
  404. void ConvertThread::generateValue(QJsonObject &pageObject, stNodeData NodeData, int FileOrder)
  405. {
  406.     //正数是从左到右切的字符串,从0开始,负数从右到左切,从-1开始   注意:数字代表字符串位置,不是字符位置!
  407.     QString subStr1 = NodeData.m_key.section(m_Identifier, 0, 0);//取去除#$&后的第一段的字符内容
  408.     QString subStr2 = NodeData.m_key.section(m_Identifier, 1, -1);//取去除#$&后得第2段到最后一段的内容
  409.     if(!subStr1.isEmpty() && subStr2.isEmpty())//只有一层
  410.     {
  411.         if(NodeData.m_value.at(FileOrder) != m_BlankGrid)
  412.             pageObject.insert(NodeData.m_key, NodeData.m_value.at(FileOrder));//直接插入对应的key,value
  413.     }
  414.     else if(!subStr2.isEmpty())
  415.     {
  416.         //判断是不是第一次添加这个结点
  417.         stNodeData uNodeData = {subStr2, NodeData.m_value};//不含标识符的后半段结点数据
  418.         for (int k = 0; k < pageObject.keys().size(); k++)//循环子对象所含的key的数量
  419.         {
  420.             if(subStr1 == pageObject.keys().at(k))//曾添加过该结点
  421.             {
  422.                 QJsonObject uJsonObject = pageObject.value(subStr1).toObject();//根据字符找到对应的value值并将其转为object对象
  423.                 generateValue(uJsonObject, uNodeData, FileOrder);//递归
  424.                 pageObject[subStr1] = QJsonValue(uJsonObject);
  425.                 return;
  426.             }
  427.         }
  428.         //str2不为空进行深层递归
  429.         QJsonObject json;
  430.         generateValue(json, uNodeData, FileOrder);
  431.         pageObject.insert(subStr1, QJsonValue(json));
  432.     }
  433. }
  434. //生成Json串
  435. void ConvertThread::generateValue(stJsonNodeData &JsonNode, stNodeData NodeData, int FileOrder)
  436. {
  437.     //正数是从左到右切的字符串,从0开始,负数从右到左切,从-1开始   注意:数字代表字符串位置,不是字符位置!
  438.     QString subStr1 = NodeData.m_key.section(m_Identifier, 0, 0);//取去除#$&后的第一段的字符内容
  439.     QString subStr2 = NodeData.m_key.section(m_Identifier, 1, -1);//取去除#$&后得第2段到最后一段的内容
  440.     if(!subStr1.isEmpty() && subStr2.isEmpty())//只有一层
  441.     {
  442.         if(NodeData.m_value.at(FileOrder) != m_BlankGrid)
  443.         {
  444.             stJsonNodeData Node = {};
  445.             Node.m_key = NodeData.m_key;
  446.             Node.m_value = NodeData.m_value.at(FileOrder);
  447.             QVariantJsonList NodeList = JsonNode.m_value.value<QVariantJsonList>();
  448.             NodeList.append(Node);
  449.             JsonNode.m_value = QVariant::fromValue(NodeList);
  450.         }
  451.     }
  452.     else if(!subStr2.isEmpty())
  453.     {
  454.         stNodeData uNodeData = {subStr2, NodeData.m_value};//不含标识符的后半段结点数据
  455.         //判断是不是第一次添加这个结点
  456.         QVariantJsonList JsonList = JsonNode.m_value.value<QVariantJsonList>();
  457.         for(int i = 0; i < JsonList.size(); i++)
  458.         {
  459.             if(subStr1 == JsonList[i].m_key)
  460.             {
  461.                 generateValue(JsonList[i], uNodeData, FileOrder);
  462.                 JsonNode.m_value = QVariant::fromValue(JsonList);
  463.                 QVariantJsonList aaa = JsonNode.m_value.value<QVariantJsonList>().at(i).m_value.value<QVariantJsonList>();
  464.                 return;
  465.             }
  466.         }
  467.         stJsonNodeData Node = {};
  468.         Node.m_key = subStr1;
  469.         generateValue(Node, uNodeData, FileOrder);
  470.         QVariantJsonList NodeList = JsonNode.m_value.value<QVariantJsonList>();
  471.         NodeList.append(Node);
  472.         JsonNode.m_value = QVariant::fromValue(NodeList);
  473.     }
  474. }
  475. QString ConvertThread::jsonDatatoString(stJsonNodeData JsonData, int level, bool last)
  476. {
  477.     QString jsonString;
  478.     QString indentation;
  479.     int i = level;
  480.     while (i)
  481.     {
  482.          indentation += "    ";
  483.          i--;
  484.     }
  485.     jsonString += indentation;
  486.     if(!JsonData.m_key.isEmpty())
  487.     {
  488.         jsonString += """ + JsonData.m_key + "": ";
  489.     }
  490.     QVariantJsonList JsonNodeList = JsonData.m_value.value<QVariantJsonList>();
  491.     if(JsonNodeList.isEmpty())
  492.     {
  493.         if(last)
  494.             jsonString += """ + JsonData.m_value.toString() + ""\n\n";
  495.         else
  496.             jsonString += """ + JsonData.m_value.toString() + "",\n";
  497.     }
  498.     else
  499.     {
  500.         QString NodeString;
  501.         int count = 0;
  502.         for(stJsonNodeData &NodeData : JsonNodeList)
  503.         {
  504.             count++;
  505.             if(count == JsonNodeList.size())
  506.                 NodeString += jsonDatatoString(NodeData, level + 1, true);
  507.             else
  508.                 NodeString += jsonDatatoString(NodeData, level + 1, false);
  509.         }
  510.         NodeString.chop(1);
  511.         if(last)
  512.             jsonString += "{\n" + NodeString + indentation + "}\n\n";
  513.         else
  514.             jsonString += "{\n" + NodeString + indentation + "},\n";
  515.     }
  516.     return jsonString;
  517. }
  518. //添加到json文件中
  519. bool ConvertThread::addToJson()
  520. {
  521.     int FileOrder = 0;
  522.     foreach (QString GenerateFile, m_GenerateFileList)
  523.     {
  524.         /* 固定读取顺序 */
  525.         stJsonNodeData JsonData;
  526.         foreach (stNodeData NodeData, m_NodeDataList)
  527.         {
  528.             generateValue(JsonData, NodeData, FileOrder);
  529.         }
  530.         QString jsonString = jsonDatatoString(JsonData);
  531.         /* key值自动排序 */
  532. //        QJsonObject pageObject;
  533. //        foreach (stNodeData NodeData, m_NodeDataList)
  534. //        {
  535. //            generateValue(pageObject, NodeData, FileOrder);
  536. //        }
  537. //        QJsonDocument document;
  538. //        document.setObject(pageObject);
  539. //        QString jsonString = document.toJson(QJsonDocument::Indented);
  540.         // 打开文件准备写入
  541.         QString filePath = m_GeneratePath + "/" + GenerateFile + ".json";
  542.         QFile file(filePath);
  543.         if (!file.open(QIODevice::WriteOnly|QIODevice::Truncate))
  544.         {
  545.             emit Sig_Result(m_eConvertType, -1, "写入打开Json文件失败");
  546.             return false;
  547.         }
  548.         // 写入文件
  549.         file.write(jsonString.toUtf8());
  550.         file.close();
  551.         FileOrder++;
  552.     }
  553.     emit Sig_Result(m_eConvertType, 100, "转换完成");
  554.     return true;
  555. }
复制代码
  1. #ifndef CONVERTTHREAD_H
  2. #define CONVERTTHREAD_H
  3. #include <QObject>
  4. #include <QMutex>
  5. #include <QMutexLocker>
  6. #include "json.h"
  7. /**节点数据类型**/
  8. struct stNodeData
  9. {
  10.     QString m_key;
  11.     QList<QString> m_value;
  12. };
  13. /**文件转换类型**/
  14. enum eConvertType {
  15.     emConvert_JsonToExcel = 0,
  16.     emConvert_ExcelToJson =1
  17. };
  18. /**文件转换线程**/
  19. class ConvertThread : public QObject
  20. {
  21.     Q_OBJECT
  22. public:
  23.     ConvertThread();
  24.     ~ConvertThread();   
  25. public slots:
  26.     void setConvert(eConvertType ConvertType, const QStringList SelectFile, const QString GeneratePath);
  27. private:
  28.     bool analysisJson(QString FileName, int FileOrder);//解析json
  29.     QList<stNodeData> analysisValue(const QJsonValue OneValue, QString Key, int FileOrder);//解析数据节点
  30.     QList<stNodeData> analysisValue(const QVariant OneValue, QString Key, int FileOrder);//解析数据节点
  31.     bool addToExcel();//生成EXL文件
  32.     bool analysisExcel(QString FileName);//解析excel
  33.     void generateValue(QJsonObject &pageObject, stNodeData NodeDataList, int FileOrder);//生成Json对象
  34.     void generateValue(stJsonNodeData &JsonNodeList, stNodeData NodeDataList, int FileOrder);//生成Json串
  35.     QString jsonDatatoString(stJsonNodeData JsonData, int level = 0, bool last = true);
  36.     bool addToJson();//生成JSON文件
  37. private:
  38.     eConvertType m_eConvertType;//转换类型
  39.     QString m_BlankGrid;//空白格填充字符
  40.     QStringList m_SelectFileList;//选择解析文件列表
  41.     QString m_GeneratePath;//选择生成路径
  42.     QString m_Identifier;//结点连接标识符
  43.     QStringList m_GenerateFileList;//生成文件列表
  44.     QList<stNodeData>  m_NodeDataList;//对象类型存储列表
  45.     QMutex lock;
  46. signals:
  47.     void Sig_Result(eConvertType ConvertType, int nProgress, const QString &strMsg);
  48. };
  49. #endif // CONVERTTHREAD_H
复制代码
  1. #include <QDateTime>
  2. #include <QStringList>
  3. #include <QMetaType>
  4. #include <qjsonobject.h>
  5. #include "json.h"
  6. namespace QtJson {
  7.     static QVariant parseValue(const QString &json, int &index, bool &success);
  8.     static QVariant parseObject(const QString &json, int &index, bool &success);
  9.     static QVariant parseArray(const QString &json, int &index, bool &success);
  10.     static QVariant parseString(const QString &json, int &index, bool &success);
  11.     static void eatWhitespace(const QString &json, int &index);
  12.     static int lookAhead(const QString &json, int index);
  13.     static int nextToken(const QString &json, int &index);
  14.     /**
  15.      * parse
  16.      */
  17.     QVariantJsonList parse(const QString &json, bool &success) {
  18.         success = true;
  19.         QVariantJsonList JsonList;
  20.         if (!json.isNull() || !json.isEmpty()) {
  21.             QString data = json;
  22.             int index = 0;
  23.             QVariant Variant = parseValue(data, index, success);
  24.             JsonList = Variant.value<QVariantJsonList>();
  25.         }
  26.         return JsonList;
  27.     }
  28.     /**
  29.      * \enum JsonToken
  30.      */
  31.     enum JsonToken {
  32.         JsonTokenNone = 0,//
  33.         JsonTokenCurlyOpen = 1,//{
  34.         JsonTokenCurlyClose = 2,//}
  35.         JsonTokenSquaredOpen = 3,//[
  36.         JsonTokenSquaredClose = 4,//]
  37.         JsonTokenColon = 5,//:
  38.         JsonTokenComma = 6,//,
  39.         JsonTokenString = 7//"
  40.     };
  41.     /**
  42.      * parseValue
  43.      */
  44.     static QVariant parseValue(const QString &json, int &index, bool &success) {
  45.         switch(lookAhead(json, index)) {
  46.             case JsonTokenString:
  47.                 return parseString(json, index, success);
  48.             case JsonTokenCurlyOpen:
  49.                 return parseObject(json, index, success);
  50.             case JsonTokenSquaredOpen:
  51.                 return parseArray(json, index, success);
  52.             case JsonTokenNone:
  53.                 break;
  54.         }
  55.         success = false;
  56.         return QVariant();
  57.     }
  58.     /**
  59.      * parseObject解析 { 后的数据
  60.      */
  61.     static QVariant parseObject(const QString &json, int &index, bool &success) {
  62.         QVariantJsonList JsonList;
  63.         int token;
  64.         nextToken(json, index);
  65.         bool done = false;
  66.         while (!done) {
  67.             token = lookAhead(json, index);
  68.             if (token == JsonTokenNone) {
  69.                 success = false;
  70.                 return QVariant();
  71.             } else if (token == JsonTokenComma) {
  72.                 nextToken(json, index);
  73.             } else if (token == JsonTokenCurlyClose) {
  74.                 nextToken(json, index);
  75.                 return QVariant::fromValue(JsonList);
  76.             } else {
  77.                 QString key = parseString(json, index, success).toString();
  78.                 if (!success) {
  79.                     return QVariant();
  80.                 }
  81.                 token = nextToken(json, index);
  82.                 if (token != JsonTokenColon) {
  83.                     success = false;
  84.                     return QVariant::fromValue(JsonList);
  85.                 }
  86.                 QVariant value = parseValue(json, index, success);
  87.                 if (!success) {
  88.                     return QVariant();
  89.                 }
  90.                 stJsonNodeData JsonNode = {key, value};
  91.                 JsonList.append(JsonNode);
  92.             }
  93.         }
  94.         return QVariant::fromValue(JsonList);
  95.     }
  96.     /**
  97.      * parseArray
  98.      */
  99.     static QVariant parseArray(const QString &json, int &index, bool &success) {
  100.         QVariantList list;
  101.         nextToken(json, index);
  102.         bool done = false;
  103.         while(!done) {
  104.             int token = lookAhead(json, index);
  105.             if (token == JsonTokenNone) {
  106.                 success = false;
  107.                 return QVariantList();
  108.             } else if (token == JsonTokenComma) {
  109.                 nextToken(json, index);
  110.             } else if (token == JsonTokenSquaredClose) {
  111.                 nextToken(json, index);
  112.                 break;
  113.             } else {
  114.                 QVariant value = parseValue(json, index, success);
  115.                 if (!success) {
  116.                     return QVariantList();
  117.                 }
  118.                 list.push_back(value);
  119.             }
  120.         }
  121.         return QVariant(list);
  122.     }
  123.     /**
  124.      * parseString
  125.      */
  126.     static QVariant parseString(const QString &json, int &index, bool &success) {
  127.         QString s;
  128.         QChar c;
  129.         eatWhitespace(json, index);
  130.         c = json[index++];
  131.         bool complete = false;
  132.         while(!complete) {
  133.             if (index == json.size()) {
  134.                 break;
  135.             }
  136.             c = json[index++];
  137.             if (c == '"') {
  138.                 complete = true;
  139.                 break;
  140.             } else if (c == '\\') {
  141.                 if (index == json.size()) {
  142.                     break;
  143.                 }
  144.                 c = json[index++];
  145.                 if (c == '"') {
  146.                     s.append('"');
  147.                 } else if (c == '\\') {
  148.                     s.append('\\');
  149.                 } else if (c == '/') {
  150.                     s.append('/');
  151.                 } else if (c == 'b') {
  152.                     s.append('\b');
  153.                 } else if (c == 'f') {
  154.                     s.append('\f');
  155.                 } else if (c == 'n') {
  156.                     s.append('\n');
  157.                 } else if (c == 'r') {
  158.                     s.append('\r');
  159.                 } else if (c == 't') {
  160.                     s.append('\t');
  161.                 } else if (c == 'u') {
  162.                     int remainingLength = json.size() - index;
  163.                     if (remainingLength >= 4) {
  164.                         QString unicodeStr = json.mid(index, 4);
  165.                         int symbol = unicodeStr.toInt(0, 16);
  166.                         s.append(QChar(symbol));
  167.                         index += 4;
  168.                     } else {
  169.                         break;
  170.                     }
  171.                 }
  172.             } else {
  173.                 s.append(c);
  174.             }
  175.         }
  176.         if (!complete) {
  177.             success = false;
  178.             return QVariant();
  179.         }
  180.         return QVariant(s);
  181.     }
  182.     /**
  183.      * eatWhitespace
  184.      */
  185.     static void eatWhitespace(const QString &json, int &index) {
  186.         for(; index < json.size(); index++) {
  187.             if (QString(" \t\n\r").indexOf(json[index]) == -1) {
  188.                 break;
  189.             }
  190.         }
  191.     }
  192.     /**
  193.      * lookAhead
  194.      */
  195.     static int lookAhead(const QString &json, int index) {
  196.         int saveIndex = index;
  197.         return nextToken(json, saveIndex);
  198.     }
  199.     /**
  200.      * nextToken
  201.      */
  202.     static int nextToken(const QString &json, int &index) {
  203.         eatWhitespace(json, index);
  204.         if (index == json.size()) {
  205.             return JsonTokenNone;
  206.         }
  207.         QChar c = json[index];
  208.         index++;
  209.         switch(c.toLatin1()) {
  210.             case '{': return JsonTokenCurlyOpen;
  211.             case '}': return JsonTokenCurlyClose;
  212.             case '[': return JsonTokenSquaredOpen;
  213.             case ']': return JsonTokenSquaredClose;
  214.             case ',': return JsonTokenComma;
  215.             case '"': return JsonTokenString;
  216.             case ':': return JsonTokenColon;
  217.         }
  218.         index--;
  219.         return JsonTokenNone;
  220.     }
  221. } //end namespace
复制代码
  1. #ifndef JSON_H
  2. #define JSON_H
  3. #include <QVariant>
  4. #include <QString>
  5. #include <QQueue>
  6. #include <qjsonobject.h>
  7. struct stJsonNodeData
  8. {
  9.     QString m_key;
  10.     QVariant m_value;
  11. };
  12. typedef QList<stJsonNodeData> QVariantJsonList;
  13. Q_DECLARE_METATYPE(QVariantJsonList)//QVariant可以支持自定义的数据类型,使用Q_DECLARE_METATYPE()宏注册此类
  14. namespace QtJson {
  15.     QVariantJsonList parse(const QString &json, bool &success);
  16. }
  17. #endif //JSON_H
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

天津储鑫盛钢材现货供应商

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表