当前位置: 首页 > news >正文

java解析excel文件,返回json

我这里用的是springboot项目,配合Maven使用的。首先需要引入依赖:

        <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.76</version></dependency>

接下来写一个ExcelUtils工具类,用于读取和解析单元格内的数据

    
public class ExcelUtils {// sheet页下标private static final int SHEET_INDEX = 0;// 开始读取的行private static final int STARTER_EAD_LINE = 4;// 去除最后读取的行private static final int TAIL_LINE = 2;上面的三个参数值根据自己要解析的excel定。private static final String[] PARAM_ARR = new String[] {"", ""};数组内容自己定....public static void main(String[] args) {//读取excel数据ExcelUtils excelUtil = new ExcelUtils();List<Map<String, String>> result = excelUtil.readExcelToObj("文件路径");JSONArray jsonArray = new JSONArray();for (Map<String, String> map : result) {JSONObject jsonObject = new JSONObject();for (Map.Entry<String, String> entry : map.entrySet()) {jsonObject.put(entry.getKey(), entry.getValue());}jsonArray.add(jsonObject);}System.out.println(jsonArray.toJSONString());}private List<Map<String, String>> readExcelToObj(String path) {Workbook wb = null;List<Map<String, String>> result = null;try {wb = WorkbookFactory.create(new File(path));result = readExcel(wb, SHEET_INDEX, STARTER_EAD_LINE, TAIL_LINE);} catch (InvalidFormatException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return result;}public String getCellValue(Cell cell) {if (cell == null) {return "";}if (cell.getCellType() == CellType.STRING) {return cell.getStringCellValue();} else if (cell.getCellType() == CellType.BOOLEAN) {return String.valueOf(cell.getBooleanCellValue());} else if (cell.getCellType() == CellType.FORMULA) {return String.valueOf((int) cell.getNumericCellValue());} else if (cell.getCellType() == CellType.NUMERIC) {return String.valueOf((int) cell.getNumericCellValue());}return "";}private boolean isMergedRegion(Sheet sheet, int row, int column) {int sheetMergeCount = sheet.getNumMergedRegions();for (int i = 0; i < sheetMergeCount; i++) {CellRangeAddress range = 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 true;}}}return false;}public String getMergedRegionValue(Sheet sheet, int row, int column) {int sheetMergeCount = sheet.getNumMergedRegions();for (int i = 0; i < sheetMergeCount; i++) {CellRangeAddress ca = sheet.getMergedRegion(i);int firstColumn = ca.getFirstColumn();int lastColumn = ca.getLastColumn();int firstRow = ca.getFirstRow();int lastRow = ca.getLastRow();if (row >= firstRow && row <= lastRow) {if (column >= firstColumn && column <= lastColumn) {Row fRow = sheet.getRow(firstRow);Cell fCell = fRow.getCell(firstColumn);return getCellValue(fCell);}}}return null;}private List<Map<String, String>> readExcel(Workbook wb, int sheetIndex, int startReadLine, int tailLine) {Sheet sheet = wb.getSheetAt(sheetIndex);Row row = null;List<Map<String, String>> result = new ArrayList<Map<String, String>>();for (int i = startReadLine; i < sheet.getLastRowNum() - tailLine + 1; i++) {row = sheet.getRow(i);Map<String, String> map = new HashMap<String, String>();// 开始循环填充数据for (Cell c : row) {String returnStr = "";boolean isMerge = isMergedRegion(sheet, i, c.getColumnIndex());//判断是否具有合并单元格if (isMerge) {String rs = getMergedRegionValue(sheet, row.getRowNum(), c.getColumnIndex());returnStr = rs;} else {//设置单元格类型c.setCellType(CellType.STRING);returnStr = c.getRichStringCellValue().getString();}int columnIndex = c.getColumnIndex();if (columnIndex < PARAM_ARR.length) {map.put(PARAM_ARR[columnIndex], returnStr);}}result.add(map);}return result;}}

执行main方法,填写正确的路径即可获取数据。

正常情况下后端接受的类型并非File类型,而是MultipartFile类型,因此需要转化

String originalFilename = file.getOriginalFilenam;
String fileType = "";   // 文件类型File tempFile = null;
try {tempFile = File.createTempFile(originalFilename, fileType);file.transferTo(tempFile);
} catch (IOException e) {log.error("文件转换失败!", e);
}List<Map<String, String>> maps = excelUtils.readExcelToObjByUpload(tempFile);

格式转换完后执行即可获得List<Map<String, String>>数据。

遍历数据,获得json返回

JSONArray jsonArray = new JSONArray();for (Map<String, String> map : maps) {boolean putFlag = true;JSONObject jsonObject = new JSONObject();for (Map.Entry<String, String> entry : map.entrySet()) {// 此行有一处数据为空则不加入,自己根据业务逻辑加判断if (StringUtils.isNull(entry.getValue())) {putFlag = false;break;}jsonObject.put(entry.getKey(), entry.getValue());}if (putFlag) {jsonArray.add(jsonObject);}
}log.info("excel解析完数据为:{}", jsonArray.toJSONString());

http://www.lryc.cn/news/359133.html

相关文章:

  • uniapp 添加字体ttf
  • Linux入门攻坚——24、BIND编译安装、Telnet和OpenSSH
  • 1.5.3 基于Java配置方式使用Spring MVC
  • Artifactory清理二进制文件丢失的制品
  • C#中的数组探索
  • 身份认证与口令攻击
  • 卷积网络迁移学习:实现思想与TensorFlow实践
  • Ansible04-Ansible Vars变量详解
  • Flutter 中的 SliverCrossAxisGroup 小部件:全面指南
  • 开源还是闭源这是一个问题
  • 数据结构与算法笔记:基础篇 - 栈:如何实现浏览器的前进和后退功能?
  • 【AIGC】大型语言模型在人工智能规划领域模型生成中的探索
  • 从零开始学习Slam-旋转矩阵旋转向量四元组(二)
  • 基于Spring Security添加流控
  • Python | Leetcode Python题解之第119题杨辉三角II
  • 物联网应用系统与网关
  • 系统稳定性概览
  • Redis-Cluster模式基操篇
  • Golang | Leetcode Golang题解之第113题路径总和II
  • 云计算与 openstack
  • golang语言的gofly快速开发框架如何设置多样的主题说明
  • lynis安全漏洞扫描工具
  • C++ 多重继承的内存布局和指针偏移
  • centos时间不对
  • 通过Redis实现防止接口重复提交功能
  • 如何构建最小堆?
  • 基于Netty实现安全认证的WebSocket(wss)客户端
  • 代码随想录算法训练营第四十四天 | 01背包问题 二维、 01背包问题 一维、416. 分割等和子集
  • redis常见使用场景
  • 模糊C均值(FCM)算法更新公式推导