导出

service

流程:

生成文件名->创立工作簿->设置表头信息(在两行定义上表的属性信息)->写入数据(与表头信息一一对应)->返回响应流

public void exportApparatus(boolean allExport, HttpServletResponse response) {    String fileName =        "仪器设备模板-" + LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE) + ".xlsx";    fileName = new String(fileName.getBytes(), StandardCharsets.ISO_8859_1);    // 创立工作簿    try (Workbook workbook = WorkbookFactory.create(true)) {      Sheet sheet = workbook.createSheet();      CellStyle cellStyle = workbook.createCellStyle();      cellStyle.setWrapText(true);      cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);      cellStyle.setAlignment(HorizontalAlignment.CENTER);      // 设置表头      // 1.1创立合并单元格对象      CellRangeAddress callRangeAddress = new CellRangeAddress(0, 0, 1, 6);      // 2.1加载合并单元格对象      sheet.addMergedRegion(callRangeAddress);      for (int i = 0; i < 1; i++) {        Row row = sheet.createRow(i);        Cell cell0 = row.createCell(0);        cell0.setCellValue("xxxxx");        Cell cell1 = row.createCell(1);        cell1.setCellValue("请将单元格格局设置为文本模式");      }      createTitleRow(sheet);      createTitleKeyRow(sheet);      // 须要导出的数据,若为false则导出空模板      List<Apparatus> entities = new ArrayList<>();      if (BooleanUtils.isTrue(allExport)) {      //获取数据源中的数据        entities = xxx.findAll();      }      createDataRow(sheet, entities);      // 响应给浏览器      BufferedOutputStream outputStream = new BufferedOutputStream(response.getOutputStream());      response.setContentType("application/octet-stream;charset=ISO_8859_1");      response.setHeader("Content-disposition", "attachment; filename=" + fileName);      workbook.write(response.getOutputStream());      outputStream.flush();      response.getOutputStream().close();    } catch (IOException e) {      throw new RuntimeException("导出仪器设备失败", e.getCause());    }  }
//创建表格的第一行数据  private void createTitleRow(Sheet sheet) {    Row row = sheet.createRow(1);    Cell cell0 = row.createCell(0);    cell0.setCellValue("属性名称");    Cell cell1 = row.createCell(1);    cell1.setCellValue("*仪器设备名称");    Cell cell2 = row.createCell(2);    cell2.setCellValue("*型号规格");    Cell cell3 = row.createCell(3);    cell3.setCellValue("*生产厂家");    Cell cell4 = row.createCell(4);    cell4.setCellValue("分类");    Cell cell5 = row.createCell(5);    cell5.setCellValue("计量编号");    Cell cell6 = row.createCell(6);    cell6.setCellValue("出厂编号");    Cell cell7 = row.createCell(7);    cell7.setCellValue("溯源形式");    Cell cell8 = row.createCell(8);    cell8.setCellValue("所属实验室");    Cell cell9 = row.createCell(9);    cell9.setCellValue("性能参数");    Cell cell10 = row.createCell(10);    cell10.setCellValue("所属单位");    Cell cell11 = row.createCell(11);    cell11.setCellValue("性能形容");    Cell cell12 = row.createCell(12);    cell12.setCellValue("适合的检测办法");    Cell cell13 = row.createCell(13);    cell13.setCellValue("校准周期");    Cell cell14 = row.createCell(14);    cell14.setCellValue("计量证书编号");    Cell cell15 = row.createCell(15);    cell15.setCellValue("有效期");    Cell cell16 = row.createCell(16);    cell16.setCellValue("状态");    Cell cell17 = row.createCell(17);    cell17.setCellValue("是否是关键性设施");    Cell cell18 = row.createCell(18);    cell18.setCellValue("责任人");    Cell cell19 = row.createCell(19);    cell19.setCellValue("购入工夫");    Cell cell20 = row.createCell(20);    cell20.setCellValue("购入原值");    Cell cell21 = row.createCell(21);    cell21.setCellValue("租户id");  }//创建表格的第二行数据  private void createTitleKeyRow(Sheet sheet) {    Row row = sheet.createRow(2);    Cell cell0 = row.createCell(0);    cell0.setCellValue("属性代号");    Cell cell1 = row.createCell(1);    cell1.setCellValue("name");    Cell cell2 = row.createCell(2);    cell2.setCellValue("specification");    Cell cell3 = row.createCell(3);    cell3.setCellValue("manufacturer");    Cell cell4 = row.createCell(4);    cell4.setCellValue("apparatusGroup");    Cell cell5 = row.createCell(5);    cell5.setCellValue("measurementCode");    Cell cell6 = row.createCell(6);    cell6.setCellValue("factoryCode");    Cell cell7 = row.createCell(7);    cell7.setCellValue("backWay");    Cell cell8 = row.createCell(8);    cell8.setCellValue("ownLab");    Cell cell9 = row.createCell(9);    cell9.setCellValue("functionParam");    Cell cell10 = row.createCell(10);    cell10.setCellValue("ownTenant");    Cell cell11 = row.createCell(11);    cell11.setCellValue("description");    Cell cell12 = row.createCell(12);    cell12.setCellValue("detectionWay");    Cell cell13 = row.createCell(13);    cell13.setCellValue("calibrationCycle");    Cell cell14 = row.createCell(14);    cell14.setCellValue("measurementCertificateCode");    Cell cell15 = row.createCell(15);    cell15.setCellValue("periodValidity");    Cell cell16 = row.createCell(16);    cell16.setCellValue("state");    Cell cell17 = row.createCell(17);    cell17.setCellValue("isKeyApparatus");    Cell cell18 = row.createCell(18);    cell18.setCellValue("principalName");    Cell cell19 = row.createCell(19);    cell19.setCellValue("buyTime");    Cell cell20 = row.createCell(20);    cell20.setCellValue("buyPrice");    Cell cell21 = row.createCell(21);    cell21.setCellValue("tenantId");  }//把在数据源中查到的数据,写到表格中,从第三行开始  private void createDataRow(Sheet sheet, List<Apparatus> entities) {    for (int i = 0; i < entities.size(); i++) {      Row row = sheet.createRow(i + 3);      Cell cell0 = row.createCell(0);      cell0.setCellValue(i + 1);      Cell cell1 = row.createCell(1);      cell1.setCellValue(entities.get(i).getName());      Cell cell2 = row.createCell(2);      cell2.setCellValue(entities.get(i).getSpecification());      Cell cell3 = row.createCell(3);      cell3.setCellValue(entities.get(i).getManufacturer());      Cell cell4 = row.createCell(4);      cell4.setCellValue(entities.get(i).getApparatusGroup());      Cell cell5 = row.createCell(5);      cell5.setCellValue(entities.get(i).getMeasurementCode());      Cell cell6 = row.createCell(6);      cell6.setCellValue(entities.get(i).getFactoryCode());      Cell cell7 = row.createCell(7);      cell7.setCellValue(entities.get(i).getBackWay());      Cell cell8 = row.createCell(8);      cell8.setCellValue(entities.get(i).getOwnLab());      Cell cell9 = row.createCell(9);      cell9.setCellValue(entities.get(i).getFunctionParam());      Cell cell10 = row.createCell(10);      cell10.setCellValue(entities.get(i).getOwnTenant());      Cell cell11 = row.createCell(11);      cell11.setCellValue(entities.get(i).getDescription());      Cell cell12 = row.createCell(12);      cell12.setCellValue(entities.get(i).getDetectionWay());      Cell cell13 = row.createCell(13);      cell13.setCellValue(entities.get(i).getCalibrationCycle());      Cell cell14 = row.createCell(14);      cell14.setCellValue(entities.get(i).getMeasurementCertificateCode());      Cell cell15 = row.createCell(15);      String periodValidity =          new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")              .format(Date.from(entities.get(i).getPeriodValidity()));      cell15.setCellValue(periodValidity);      Cell cell16 = row.createCell(16);      cell16.setCellValue(entities.get(i).getState());      Cell cell17 = row.createCell(17);      cell17.setCellValue(BooleanUtils.isTrue(entities.get(i).getIsKeyApparatus()) ? "是" : "否");      Cell cell18 = row.createCell(18);      cell18.setCellValue(entities.get(i).getPrincipalName());      Cell cell19 = row.createCell(19);      cell19.setCellValue(entities.get(i).getBuyTime());      Cell cell20 = row.createCell(20);      cell20.setCellValue(entities.get(i).getBuyPrice());      Cell cell21 = row.createCell(21);      cell21.setCellValue(String.valueOf(entities.get(i).getTenantId()));    }  }

controller

  @GetMapping(value = "/xxx/export", name = "导出或下载空模版")  ResponseEntity<Void> exportApparatus(      @Parameter(description = "是否全副导出") @RequestParam(required = false) Boolean allExport,      @Parameter(description = "响应流") HttpServletResponse response) {    apparatusExpImpService.exportApparatus(allExport, response);    return ResponseEntity.ok().build();

导入

service

流程:

获取文件->解析文件->封装form->创立数据

public void importApparatus(InputStream stream) {    ImportParams importParams = new ImportParams();    importParams.setHeadRows(2);    try (Workbook wb = WorkbookFactory.create(stream)) {      // 获取sheet页数      int numberOfSheets = wb.getNumberOfSheets();      for (int i = 0; i < numberOfSheets; i++) {        // 获取sheet页        Sheet sheet = wb.getSheetAt(i);        // 解析数据        List<ApparatusDto> list = resolveExcelData(sheet);        if (list != null) {          for (ApparatusDto importDTO : list) {            apparatusService.createApparatus(importDTO);          }        }      }    } catch (IOException e) {      throw new RuntimeException("导入租户失败", e.getCause());    }  }
public List<ApparatusDto> resolveExcelData(Sheet sheet) {    // 寄存后果    List<ApparatusDto> list = new ArrayList<>();    // 获取最大行    int lastRowNum = sheet.getLastRowNum();    // 从第四行开始    for (int j = 3; j <= lastRowNum; j++) {      // 获取每一行      Row row = sheet.getRow(j);      ApparatusDto apparatusDto = new ApparatusDto();      if (row != null) {        apparatusDto.setName(getCellStringValue(row, 1));        apparatusDto.setSpecification(getCellStringValue(row, 2));        apparatusDto.setManufacturer(getCellStringValue(row, 3));        apparatusDto.setApparatusGroup(getCellStringValue(row, 4));        apparatusDto.setMeasurementCode(getCellStringValue(row, 5));        apparatusDto.setFactoryCode(getCellStringValue(row, 6));        apparatusDto.setBackWay(getCellStringValue(row, 7));        apparatusDto.setOwnLab(getCellStringValue(row, 8));        apparatusDto.setFunctionParam(getCellStringValue(row, 9));        apparatusDto.setOwnTenant(getCellStringValue(row, 10));        apparatusDto.setDescription(getCellStringValue(row, 11));        apparatusDto.setDetectionWay(getCellStringValue(row, 12));        apparatusDto.setCalibrationCycle(getCellStringValue(row, 13));        apparatusDto.setMeasurementCertificateCode(getCellStringValue(row, 14));        String periodValidity = getCellStringValue(row, 15);        if (StringUtils.isNotBlank(periodValidity)) {          try {            Instant period =                new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")                    .parse(getCellStringValue(row, 15))                    .toInstant();            apparatusDto.setPeriodValidity(period);          } catch (Exception e) {            throw new RuntimeException(e.getMessage());          }        }        apparatusDto.setState(getCellStringValue(row, 16));        apparatusDto.setIsKeyApparatus(StringUtils.equals(getCellStringValue(row, 17), "是"));        apparatusDto.setPrincipalName(getCellStringValue(row, 18));        apparatusDto.setBuyTime(getCellStringValue(row, 19));        apparatusDto.setBuyPrice(getCellStringValue(row, 20));        apparatusDto.setTenantId(getCellStringValue(row, 21));        list.add(apparatusDto);      }    }    return list;  }  private String getCellStringValue(Row row, int colIndex) {    Cell cell = row.getCell(colIndex);    if (cell == null) {      return null;    }    return getCellValue(cell);  }  /** 判断类型 */  private String getCellValue(Cell cell) {    String flag = ".0";    String value = null;    CellType cellCode = cell.getCellType();    if (CellType.NUMERIC == cellCode) {      long round = Math.round(cell.getNumericCellValue());      if (Double.parseDouble(round + flag) == cell.getNumericCellValue()) {        value = String.valueOf(round);      } else {        DecimalFormat df = new DecimalFormat("#.###########");        value = df.format(cell.getNumericCellValue());      }    } else if (CellType.STRING == cellCode) {      value = cell.getStringCellValue();    } else if (CellType.FORMULA == cellCode) {      value = cell.getStringCellValue();    }    return value;  }

controller

@PostMapping(      value = "/xxx/import",      consumes = MediaType.MULTIPART_FORM_DATA_VALUE,      name = "Excel导入")  ResponseEntity<Void> importApparatus(      @Parameter(description = "文件") @RequestPart(value = "file") MultipartFile file) {    try (InputStream stream = file.getInputStream()) {      apparatusExpImpService.importApparatus(stream);    } catch (IOException e) {      throw new RuntimeException("导入失败", e);    }    return ResponseEntity.ok().build();  }