将excel中的数据导入到数据库中进行存储
/** * excel表中的数据添加进sql中的工具类 */ public List<Object> getPage(MultipartFile multipartFile, int num) throws IOException { List<Object> listPage = new ArrayList<>(); InputStream in = null; try { //将file转InputStream in = multipartFile.getInputStream(); } catch (IOException e) { e.printStackTrace(); } //从给定文件创建相应的HSSFWorkbook/XSSF工作簿 Workbook workbook = WorkbookFactory.create(in); //返回一个对象用来实例化Workbook的工具类,创建FormulaEvaluator-计算公式单元格的对象 FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator(); //获取表格的第num页 Sheet sheetAt = workbook.getSheetAt(num); //获取该页表格有多少的数据(通过统计最后一行的行数来计算有多少的数据) int lastRowNum = sheetAt.getLastRowNum(); listPage.add(sheetAt); listPage.add(lastRowNum); in.close(); workbook.close(); return listPage; }
在将excel中的数据导入到数据库的过程中,最重要的一点就是数据转换,需要将excel中拿出来的表转换为合适的数据格式,否则在导入的过程中会报数据格式转换异常。
例如
/** * 将表中的字符串类型的数据转换为string类型进行存储 * * @param cell * @return */ public String stringValue(Cell cell) { cell.setCellType(CellType.STRING); String stringCellValue = cell.getStringCellValue(); return stringCellValue; } /** * 将表中的数值类型的数据转换为字符串类型进行存储 * * @param cell * @return */ public String bigdecimalStringValue(Cell cell) { BigDecimal bigDecimal = new BigDecimal(cell.getNumericCellValue()).setScale(4, BigDecimal.ROUND_HALF_UP); String string = bigDecimal.toString(); return string; } /** * 将表中的数字类型转换为整型进行存储 * * @param cell * @return */ public Long longValue(Cell cell) { double numericCellValue = cell.getNumericCellValue(); Long value = Math.round(numericCellValue); return value; }
/** * 拿取数据,循环遍历,开始insert到数据库中 */
@Override public List<OrganizationSummary> getExcelPageData(MultipartFile multipartFile) throws IOException { num = 0; List<Object> listPage = iSysExcelToSqlUtil.getPage(multipartFile, num); //获取表格的第1页 sheetAt = (Sheet) listPage.get(0); //获取该页表格有多少的数据(通过统计最后一行的行数来计算有多少的数据) lastRowNum = (int) listPage.get(1); List<OrganizationSummary> list = new ArrayList<>(); //从第6行开始遍历循环,获取所有的数据 for (int i = 5; i <= lastRowNum; i++) { Row row = sheetAt.getRow(i); if (row != null) { //获取单元格最后一个单元格 short lastCellNum = row.getLastCellNum(); //循环遍历单元格,获取单元格的数据 cell = row.getCell(0); //拿出来表格的第1个,判断内容,如果匹配则跳出本次循环 if (cell.getStringCellValue().equals("长春城区") || cell.getStringCellValue().equals("长春外县") || cell.getStringCellValue().equals("二级分行")) { value = cell.getStringCellValue(); continue; } else { OrganizationSummary os = new OrganizationSummary(); for (int j = 0; j < lastCellNum; j++) { cell = row.getCell(j); cell.setCellType(CellType.STRING); String stringCellValue = cell.getStringCellValue(); switch (j) { case 0: os.setOrganizationSummaryName(stringCellValue); break; case 1: os.setEquipmentNum(Long.valueOf(stringCellValue)); break; case 2: BigDecimal bigDecimal; try { bigDecimal = new BigDecimal(stringCellValue); } catch (Exception e) { bigDecimal = BigDecimal.ZERO; } os.setDailyAverage(bigDecimal.setScale(0, BigDecimal.ROUND_HALF_UP).toString()); break; } os.setOrganizationCityProper(value); } list.add(os); } } } return list; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!