手写JAVA实现个性化业务的Excel转JSON,效率提高99.99%

简介: 由JSON数据的格式可以看出,每读取一个目录数据,都可以看成一个JSONObject,JSONObject有两个键值对,text代表目录的名字、children代表子目录。一个父目录可以有多个子目录,所以children用的JSONArray去表示。

手写JAVA实现个性化业务的Excel转JSON,效率提高99.99%




一、前言


先看效果:左图的excel表中的五级目录的数据,转成了右边的JSON格式。

表格总共有739行,转成JSON后,足足有3461行,之前采用人工逐个录入,花了整整一天时间,眼睛都看花了,准确率也需要多次核对才放心。

表格中数据这次有了较大改动,想到之前手工录入的痛苦,搜了几个转换工具也未能满足需求,只能自己撸代码实现了


20190226092751348.png


二、技术准备


2.1、操作表格的API,用的是apche的 POI


2.2、数据类型 JSONArray和JSONObject,需导入相应的jar包。


三、实现思路


3.1、如何表示每个单元格数据?


{
“text”: “二级目录”,
“children”: [
{
“text”: “三级目录”,
}
]
}


由JSON数据的格式可以看出,每读取一个目录数据,都可以看成一个JSONObject,JSONObject有两个键值对,text代表目录的名字、children代表子目录。

一个父目录可以有多个子目录,所以children用的JSONArray去表示。


3.2、如果处理单元格之间的关系?


在我们的场景中,合并单元格,是一个父目录,代表还有子目录。而POI读取表格的顺序是:先读行、再读每行中的每一列。

所以遇到合并单元格,要判断出来,并且计算出合并单元格的起始行、结束行的行号,这样,只要在起始行、结束行之间的读出的数据都是从属于该父目录的子目录,并且这些数据要缓存起来。


3.3、如何包装“卫龙”辣条?


20190226092810297.png


就好比流水线上包装的卫龙辣条,如何规定一个包装袋只装一根辣条,那么流水上的机器工作起来就很简单,只要读取一根辣条,将这根辣条加入包装袋里封口进行了。这就是对应没有合并单元格的情况。依次读取就行了。

如果规定一个包装袋里要装4根辣条,那么包装袋读取了一根辣条时不会封口,会停在流水线上等待并且计数,等到第4跟读取完成(即读到第4行),才封口完成包装(完成JSONArray的组装)。


四、实现代码的核心部分


4.1、处理一级目录的代码示例:


// 第1列 -- 一级目录
HSSFCell cell1 = row.getCell(0);
if (cell1 != null && !"".equals(cell1)) {
String cellValue1 = row.getCell(0).getStringCellValue();
Result mergedRegion1 = isMergedRegion(sheet, i, 0);
if (mergedRegion1.merged == false) {
  // 不是合并的
  if (!"".equals(cellValue1)) {
    rowobj1.put("text", cellValue1);
    if (jsonArray2.size() > 0) {
      rowobj1.put("children", jsonArray2);
    }
    jsonArray.add(rowobj1);
    rowobj2.clear();
    jsonArray2.clear();
    rowobj1.clear();
  }
} else {
  if (i == mergedRegion1.startRow - 1) {
    rowobj1.put("text", cellValue1);
  }
  if (i == mergedRegion1.endRow - 1) {
    rowobj1.put("children", jsonArray2);
    jsonArray.add(rowobj1);
    rowobj2.clear();
    jsonArray2.clear();
    rowobj1.clear();
  }
}
}


4.2、判断是否是合并单元格:


// 判断是否是合并单元格  
private static Result isMergedRegion(HSSFSheet sheet, int row, int column) {
int sheetMergeCount = ((org.apache.poi.ss.usermodel.Sheet) sheet).getNumMergedRegions();
for (int i = 0; i < sheetMergeCount; i++) {
  CellRangeAddress range = ((org.apache.poi.ss.usermodel.Sheet) sheet).getMergedRegion(i);
  int firstColumn = range.getFirstColumn();
  int lastColumn = range.getLastColumn();
  int firstRow = range.getFirstRow();
  int lastRow = range.getLastRow();
  if (row >= firstRow && row <= lastRow) {
    if (column >= firstColumn && column <= lastColumn) {
      return new Result(true, firstRow + 1, lastRow + 1, firstColumn + 1, lastColumn + 1);
    }
  }
}
return new Result(false, 0, 0, 0, 0);
}


详细代码见github:

https://github.com/pluscai/excelToJson


五、注意


5.1、本意是直接转成json文件,实际情况时在控制台打印出来了,黏贴到json文件里,格式化下就行了。


5.2、如果excel文件是xlsx后缀的,可以打开后另存为xls格式,再转换。


目录
相关文章
|
3月前
|
Java API Apache
Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
【10月更文挑战第29天】Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
190 5
|
2月前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
135 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
2月前
|
JSON Java 数据格式
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
98 25
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
|
3月前
|
JSON Java 关系型数据库
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
在Java中,使用mybatis-plus更新实体类对象到mysql,其中一个字段对应数据库中json数据类型,更新时报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
275 4
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
|
3月前
|
Java BI API
Java Excel报表生成:JXLS库的高效应用
在Java应用开发中,经常需要将数据导出到Excel文件中,以便于数据的分析和共享。JXLS库是一个强大的工具,它基于Apache POI,提供了一种简单而高效的方式来生成Excel报表。本文将详细介绍JXLS库的使用方法和技巧,帮助你快速掌握Java中的Excel导出功能。
96 6
|
3月前
|
Java API Apache
|
3月前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
142 4
|
4月前
|
JSON JavaScript Java
在Java中处理JSON数据:Jackson与Gson库比较
本文介绍了JSON数据交换格式及其在Java中的应用,重点探讨了两个强大的JSON处理库——Jackson和Gson。文章详细讲解了Jackson库的核心功能,包括数据绑定、流式API和树模型,并通过示例演示了如何使用Jackson进行JSON解析和生成。最后,作者分享了一些实用的代码片段和使用技巧,帮助读者更好地理解和应用这些工具。
302 0
在Java中处理JSON数据:Jackson与Gson库比较
|
4月前
|
JSON 数据格式
LangChain-20 Document Loader 文件加载 加载MD DOCX EXCEL PPT PDF HTML JSON 等多种文件格式 后续可通过FAISS向量化 增强检索
LangChain-20 Document Loader 文件加载 加载MD DOCX EXCEL PPT PDF HTML JSON 等多种文件格式 后续可通过FAISS向量化 增强检索
236 2
|
4月前
|
JSON Java 数据格式
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
168 1