POI读取Execl表格 应用层数据传递

    技术2022-07-21  87

    POI读取Execl表格 应用层数据传递

    POI读取Execl依赖代码Controller层的数据传递

    POI读取Execl

    POI是一款 读写 Execl表格的第三方插件 这里主要是读取Execl表格数据 xls03版 xlsx 07版。

    没有什么难点 就两点需要注意下一个数据转换 一个单元格的定位,代码我会填写注释。 还有一个就是刚才说的Execl版本问题。Execl03版是有行数限制的 65535行 而07版以后的没有限制。他们的调用方式也不一样。

    依赖

    <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.9</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.9</version> </dependency> <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>2.10.5</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.15</version> </dependency>

    代码

    03版 Workbook workbook = new HSSFWorkbook(fileInputStream); 07版 Workbook workbook = new XSSFWorkbook(fileInputStream); @PostMapping("/Cell03") public String Cell03Controlller(@RequestBody String file, RedirectAttributes attr) throws IOException { JSONObject jsonObject = JSON.parseObject(file); List<String> list = new LinkedList<>(); FileInputStream fileInputStream = new FileInputStream(jsonObject.getString("file")+"templ.xls"); jsonObject.remove("file"); Workbook workbook = new HSSFWorkbook(fileInputStream); Sheet sheet = workbook.getSheetAt(0); //工作区 Row row = sheet.getRow(0); //行 //获取多少行多少列 int a = row.getPhysicalNumberOfCells(); int b = sheet.getPhysicalNumberOfRows(); /* * 获取execl全部数据 * * 这个双重循环的大概逻辑就是定位到单元格获取数据 * * 第一重循环多少行 * 第二重循环多少列 * int i = 1 是因为0行是Execl表头数据,所以从1开始读取 * 这样可以定位到每个单元格了。 * * */ for (int i = 1; i < b; i++) { Row row1 = sheet.getRow(i); for (int k = 0; k < a; k++) { Cell cell = row.getCell(k); //列 Cell cell1 = row1.getCell(k); /* * POI提供了一些获取数据方法 * 但在你不清楚表中数据格式的情况下 就需要做些数据转 * * */ if (cell1 != null) { String cellvalue = ""; switch (cell1.getCellType()) { case HSSFCell.CELL_TYPE_STRING: cellvalue = cell1.getStringCellValue(); break; case HSSFCell.CELL_TYPE_NUMERIC: if (HSSFDateUtil.isCellDateFormatted(cell1)) { Date date = cell1.getDateCellValue(); cellvalue = new DateTime(date).toString("yyyy-MM-dd"); } else { cell1.setCellType(HSSFCell.CELL_TYPE_STRING); cellvalue = cell1.toString(); } break; case HSSFCell.CELL_TYPE_BOOLEAN: cellvalue = String.valueOf(cell1.getBooleanCellValue()); break; case HSSFCell.CELL_TYPE_BLANK: break; case HSSFCell.CELL_TYPE_ERROR: cellvalue = String.valueOf(cell1.getErrorCellValue()); break; } jsonObject.put(String.valueOf(cell.getStringCellValue()) ,cellvalue); } } list.add(jsonObject.toJSONString()); } attr.addFlashAttribute("jsonObject",list); fileInputStream.close(); return "redirect:/test" ; } @PostMapping("/Cell07") public String Cell07Controlller(@RequestBody String file, RedirectAttributes attr) throws IOException { JSONObject jsonObject = JSON.parseObject(file); List<String> list = new LinkedList<>(); FileInputStream fileInputStream = new FileInputStream(jsonObject.getString("file") + "templ.xlsx"); jsonObject.remove("file"); Workbook workbook = new XSSFWorkbook(fileInputStream); Sheet sheet = workbook.getSheetAt(0); Row row = sheet.getRow(0); //获取行列 int a = row.getPhysicalNumberOfCells(); int b = sheet.getPhysicalNumberOfRows(); //获取execl全部数据 for (int i = 1; i < b; i++) { Row row1 = sheet.getRow(i); for (int k = 0; k < a; k++) { Cell cell = row.getCell(k); Cell cell1 = row1.getCell(k); if (cell1 != null) { String cellvalue = ""; switch (cell1.getCellType()) { case HSSFCell.CELL_TYPE_STRING: cellvalue = cell1.getStringCellValue(); break; case HSSFCell.CELL_TYPE_NUMERIC: if (HSSFDateUtil.isCellDateFormatted(cell1)) { Date date = cell1.getDateCellValue(); cellvalue = new DateTime(date).toString("yyyy-MM-dd"); } else { cell1.setCellType(HSSFCell.CELL_TYPE_STRING); cellvalue = cell1.toString(); } break; case HSSFCell.CELL_TYPE_BOOLEAN: cellvalue = String.valueOf(cell1.getBooleanCellValue()); break; case HSSFCell.CELL_TYPE_BLANK: break; case HSSFCell.CELL_TYPE_ERROR: cellvalue = String.valueOf(cell1.getErrorCellValue()); break; } jsonObject.put(String.valueOf(cell.getStringCellValue()) ,cellvalue); } } list.add(jsonObject.toJSONString()); } attr.addFlashAttribute("jsonObject",list); fileInputStream.close(); return "redirect:/test" ; }

    Controller层的数据传递

    @ResponseBody @RequestMapping (value = "/test") public Map<String,Object> test(@ModelAttribute("jsonObject")List<String> list){ Map<String,Object> map = new HashMap<>(); String ret = "0"; if (!list.isEmpty()) { ret = "1"; System.out.println(list.toString()); } map.put("ret",ret); return map; } }

    代码本身没有任何难度 可以将我的Cell03Controlller/Cell07Controlller封装成一个工具类 只需传递一个FileInputStream 就可以使用

    Processed: 0.012, SQL: 9