基于Js和Java实现xlsx\xls文档的导入和下载

打印 上一主题 下一主题

主题 844|帖子 844|积分 2532

基于Js和Java+MyBatis实现xlsx\xls文档的导入下载、导出

配景:

​                实现xlsx\xls文档的导入、导出
​                导入效果:


​                导出效果:

导出效果图
1、导入、下载

1.1、前台
  1.     <input type="file" id="selectFile" name="selectFile" />
  2.     <button id="search" onclick="getData()" type="button" >
  3.         查询
  4.     </button>
  5.     <button type="button" onclick="Import();return false;">导入</button>
  6.     <a id="dcexcel" target="_blank" href="https://www.cnblogs.com/javascript:__doPostBack(&#39;dcexcel&#39;,&#39;&#39;)"></a>
  7.     <input type="hidden" name="hfQueryString" id="hfQueryString" />
  8.     <button onclick="downTemplate()" type="button">模板下载</button>
复制代码
1.2、后台

1.2.1、实体类
  1. import java.io.Serializable;
  2. public class TbXXXXXXEntity implements Serializable {
  3.         private static final long serialVersionUID = 1L;
  4.         /**
  5.          * 主键
  6.          */
  7.         private Integer id;
  8.         /**
  9.          * 第一列数据编码
  10.          */
  11.         private String columnDataCode1;
  12.         /**
  13.          * 第一列数据
  14.          */
  15.         private String columnData1;
  16.         /**
  17.          * 第二列数据
  18.          */
  19.         private String columnData2;
  20.         /**
  21.          * 第三列数据
  22.          */
  23.         private String columnData3;
  24.         /**
  25.          * 第四列数据
  26.          */
  27.         private String columnData4;
  28.         /**
  29.          * 第五列数据
  30.          */
  31.         private String columnData5;
  32.         /**
  33.          * 年份
  34.          */
  35.         private Integer year;
  36.         /**
  37.          * 单位
  38.          */
  39.         private String dw;
  40.         public Integer getId() {
  41.                 return id;
  42.         }
  43.         public void setId(Integer id) {
  44.                 this.id = id;
  45.         }
  46.         public Integer getYear() {
  47.                 return year;
  48.         }
  49.         public void setYear(Integer year) {
  50.                 this.year = year;
  51.         }
  52.         public String getColumnDataCode1() {
  53.                 return columnDataCode1;
  54.         }
  55.         public void setColumnDataCode1(String columnDataCode1) {
  56.                 this.columnDataCode1 = columnDataCode1;
  57.         }
  58.         public String getColumnData1() {
  59.                 return columnData1;
  60.         }
  61.         public void setColumnData1(String columnData1) {
  62.                 this.columnData1 = columnData1;
  63.         }
  64.         public String getColumnData2() {
  65.                 return columnData2;
  66.         }
  67.         public void setColumnData2(String columnData2) {
  68.                 this.columnData2 = columnData2;
  69.         }
  70.         public String getColumnData3() {
  71.                 return columnData3;
  72.         }
  73.         public void setColumnData3(String columnData3) {
  74.                 this.columnData3 = columnData3;
  75.         }
  76.         public String getColumnData4() {
  77.                 return columnData4;
  78.         }
  79.         public void setColumnData4(String columnData4) {
  80.                 this.columnData4 = columnData4;
  81.         }
  82.         public String getColumnData5() {
  83.                 return columnData5;
  84.         }
  85.         public void setColumnData5(String columnData5) {
  86.                 this.columnData5 = columnData5;
  87.         }
  88.         public String getDw() {
  89.                 return dw;
  90.         }
  91.         public void setDw(String dw) {
  92.                 this.dw = dw;
  93.         }
  94. }
复制代码
1.2.2、导入实体类
  1. import cn.afterturn.easypoi.excel.annotation.Excel;
  2. import cn.afterturn.easypoi.excel.annotation.ExcelIgnore;
  3. import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
  4. import java.io.Serializable;
  5. @ExcelTarget("TbXXXXXXExcelDto")
  6. public class TbXXXXXXExcelDto implements Serializable {
  7.         private static final long serialVersionUID = 121871957378211533L;
  8.         /**
  9.          * 第一列数据
  10.          */
  11.         @Excel(name = "第一列数据")
  12.         private String columnData1;
  13.         /**
  14.          * 第二列数据
  15.          */
  16.         @Excel(name = "第二列数据")
  17.         private String columnData2;
  18.         /**
  19.          * 第三列数据
  20.          */
  21.         @Excel(name = "第三列数据")
  22.         private String columnData3;
  23.         /**
  24.          * 第四列数据
  25.          */
  26.         @Excel(name = "第四列数据")
  27.         private String columnData4;
  28.         /**
  29.          * 第五列数据
  30.          */
  31.         @Excel(name = "第五列数据")
  32.         private String columnData5;
  33.    
  34.         /**
  35.          *  主键
  36.          */
  37.         @ExcelIgnore
  38.         private Integer id;
  39.         /**
  40.          * 第一列数据编码
  41.          */
  42.         @ExcelIgnore
  43.         private String columnDataCode1;
  44.         /**
  45.          * 单位
  46.          */
  47.         @ExcelIgnore
  48.         private String dw;
  49.         /**
  50.          * 年限
  51.          */
  52.         @Excel(name = "年限")
  53.         private Integer year;
  54.         public Integer getId() {
  55.                 return id;
  56.         }
  57.         public void setId(Integer id) {
  58.                 this.id = id;
  59.         }
  60.         public Integer getYear() {
  61.                 return year;
  62.         }
  63.         public void setYear(Integer year) {
  64.                 this.year = year;
  65.         }
  66.         public String getColumnData1() {
  67.                 return columnData1;
  68.         }
  69.         public void setColumnData1(String columnData1) {
  70.                 this.columnData1 = columnData1;
  71.         }
  72.         public String getColumnData2() {
  73.                 return columnData2;
  74.         }
  75.         public void setColumnData2(String columnData2) {
  76.                 this.columnData2 = columnData2;
  77.         }
  78.         public String getColumnData3() {
  79.                 return columnData3;
  80.         }
  81.         public void setColumnData3(String columnData3) {
  82.                 this.columnData3 = columnData3;
  83.         }
  84.         public String getColumnData4() {
  85.                 return columnData4;
  86.         }
  87.         public void setColumnData4(String columnData4) {
  88.                 this.columnData4 = columnData4;
  89.         }
  90.         public String getColumnData5() {
  91.                 return columnData5;
  92.         }
  93.         public void setColumnData5(String columnData5) {
  94.                 this.columnData5 = columnData5;
  95.         }
  96.         public String getDw() {
  97.                 return dw;
  98.         }
  99.         public void setDw(String dw) {
  100.                 this.dw = dw;
  101.         }
  102. }
复制代码
1.2.3、控制层
  1.     /**
  2.      * 模板下载
  3.      *
  4.      * @param response response对象
  5.      */
  6.     @GetMapping("/download")
  7.     public void download(HttpServletResponse response) {
  8.         TbXXXXXXService.download(response);
  9.     }
  10.     /**
  11.      * 导入
  12.      *
  13.      * @param file 文件对象
  14.      * @return 返回状态
  15.      */
  16.     @PostMapping("/importExcel")
  17.     public Map<String, Object> importExcel(@RequestParam("myFile") MultipartFile file) {
  18.         return tbXXXXXXService.importExcel(file);
  19.     }
复制代码
1.2.4、服务层
  1.     Map<String, Object> importExcel(MultipartFile file);
  2.     List<TbXXXXXXEntity> getList(Map<String, Object> params);
复制代码
1.2.5、服务实现层

1、表格样式:

基本情况单位:测试单位2024年第一列数据第二列数据第三列数据第四列数据第五列数据实现代码
  1.     /**
  2.      * 模板下载
  3.      *
  4.      * @param response response对象
  5.      */
  6.     @Override
  7.     public void download(HttpServletResponse response) {
  8.         response.setContentType("application/octet-stream");
  9.         try {
  10.             response.setHeader("Content-disposition", "attachment;filename=" + new String("XXXXXX模板.xlsx".getBytes("utf-8"), "ISO8859-1"));
  11.             response.setCharacterEncoding("UTF-8");
  12.             ClassPathResource classPathResource = new ClassPathResource("./static/template/XXXXXX.xlsx");
  13.             FileInputStream fileInputStream = new FileInputStream(classPathResource.getFile());
  14.             OutputStream outputStream = response.getOutputStream();
  15.             BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
  16.             BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);
  17.             XSSFWorkbook workBook = new XSSFWorkbook(bufferedInputStream);
  18.             workBook.write(bufferedOutputStream);
  19.             fileInputStream.close();
  20.             outputStream.close();
  21.             bufferedInputStream.close();
  22.             bufferedOutputStream.close();
  23.         } catch (Exception e) {
  24.             e.printStackTrace();
  25.         }
  26.     }
  27.     /**
  28.      * Excel表格导入
  29.      *
  30.      * @param file 文件对象
  31.      * @return 返回状态
  32.      */
  33.     @Transactional
  34.     @Override
  35.     public Map<String, Object> importExcel(MultipartFile file) {
  36.         Map<String, Object> resultMap = new HashMap<>();
  37.         String originalFilename = file.getOriginalFilename();
  38.         String substring = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
  39.         if (!"xls".equals(substring) && !"xlsx".equals(substring)) {
  40.             resultMap.put("success", false);
  41.             resultMap.put("msg", "文件格式错误,请上传xls、xlsx文件!");
  42.             return resultMap;
  43.         }
  44.         try (InputStream inputStream = file.getInputStream();
  45.              Workbook workbook = new XSSFWorkbook(inputStream)) {
  46.             Sheet sheet = workbook.getSheetAt(0); // 获取第一个工作表
  47.             Iterator<Row> rowIterator = sheet.iterator();
  48.             String dw = null;
  49.             String year = null;
  50.             // 跳过标题行
  51.             if (rowIterator.hasNext()) {
  52.                 // 跳过第一行
  53.                 rowIterator.next();
  54.                 // 跳过第二行,并获取第二行数据
  55.                 Row next = rowIterator.next();
  56.                 // 查看第二行数据
  57.                 dw = next.getCell(0).getStringCellValue();
  58.                 year = next.getCell(2).getStringCellValue();
  59.                 // 跳过第三行
  60.                 rowIterator.next();
  61.             }
  62.                        
  63.             // 单独获取第二行数据
  64.             if (StringUtils.isNotBlank(dw)){
  65.                 dw = dw.replace("单位:", "");
  66.             }
  67.             if (StringUtils.isNotBlank(year)){
  68.                 year = year.replace("年", "");
  69.             }
  70.             // 获取列标题
  71.             Map<Integer, String> headerMap = new HashMap<>();
  72.             Row headerRow = sheet.getRow(2);
  73.             for (int i = 0; i < headerRow.getLastCellNum(); i++) {
  74.                 Cell headerCell = headerRow.getCell(i);
  75.                 headerMap.put(i, headerCell.getStringCellValue());
  76.             }
  77.             List<TbXXXXXXExcelDto> list = new LinkedList<>();
  78.             // 解析数据行
  79.             while (rowIterator.hasNext()) {
  80.                 Row next = rowIterator.next();
  81.                 // 获取第一列数据
  82.                 String columnData1 = next.getCell(0).getStringCellValue();
  83.                 // 获取第二列数据
  84.                 String columnData2 = next.getCell(1).getStringCellValue();
  85.                 // 获取第三列数据
  86.                 String columnData3 = next.getCell(2).getStringCellValue();
  87.                 String columnData4 = next.getCell(3).getStringCellValue();
  88.                 String columnData5 = next.getCell(4).getStringCellValue();
  89.                 TbXXXXXXExcelDto dto = new TbXXXXXXExcelDto();
  90.                 dto.setcolumnData1(columnData1);
  91.                 dto.setColumnData2(columnData2);
  92.                 dto.setColumnData3(columnData3);
  93.                 dto.setColumnData4(columnData4);
  94.                 dto.setColumnData5(columnData5);
  95.                 dto.setDw(dw);
  96.                 if (StringUtils.isNotBlank(year)){
  97.                     dto.setYear(Integer.valueOf(year));
  98.                 }
  99.                 list.add(dto);
  100.                 if (list.size() % 10 == 0){
  101.                     tbXXXXXXDao.insertBatch(list);
  102.                     list.clear();
  103.                 }
  104.             }
  105.             if (!list.isEmpty()){
  106.                 tbXXXXXXDao.insertBatch(list);
  107.             }
  108.             list.clear();
  109.             resultMap.put("success", true);
  110.             resultMap.put("msg", "导入成功!");
  111.             return resultMap;
  112.         } catch (IOException e) {
  113.             // 处理文件读取异常
  114.             e.printStackTrace();
  115.             resultMap.put("success", false);
  116.             resultMap.put("msg", "解析失败!请检查字段格式后重新导入!");
  117.         }
  118.         return resultMap;
  119.     }
复制代码
2、表格样式:

人员信息记录导出姓名学历政治面目性别民族在岗状态隶属部门职业入职日期测试人员本科群众女汉族在岗综合部保管人员2023-10-12实现代码:
  1.     /**
  2.      * Excel表格导入
  3.      *
  4.      * @param file 文件对象
  5.      * @return 返回状态
  6.      */
  7.     @Transactional
  8.     @Override
  9.     public Map<String, Object> importExcel(MultipartFile file) {
  10.         Map<String, Object> resultMap = new HashMap<>();
  11.         String originalFilename = file.getOriginalFilename();
  12.         String substring = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
  13.         if (!"xls".equals(substring) && !"xlsx".equals(substring)) {
  14.             resultMap.put("success", false);
  15.             resultMap.put("msg", "文件格式错误,请上传xls、xlsx文件!");
  16.             return resultMap;
  17.         }
  18.         try {
  19.             InputStream inputStream = file.getInputStream();
  20.             File tempFile = File.createTempFile(file.getOriginalFilename(), ".tmp");
  21.             FileOutputStream fileOutputStream = new FileOutputStream(tempFile);
  22.             byte[] buffer = new byte[1024];
  23.             int bytesRead = 0;
  24.             while ((bytesRead = inputStream.read(buffer)) != -1) {
  25.                 fileOutputStream.write(buffer, 0, bytesRead);
  26.             }
  27.             fileOutputStream.close();
  28.             inputStream.close();
  29.             tempFile.deleteOnExit();
  30.             // 解析Excel数据
  31.             ImportParams params = new ImportParams();
  32.             params.setTitleRows(1);
  33.             params.setHeadRows(1);
  34.             List<TbXxxExcelDto> excelList = ExcelImportUtil.importExcel(tempFile, TbXxxExcelDto.class, params);
  35.                
  36.             // 查询身份证信息
  37.             List<String> sfzhmList = xxxMapper.getSfzhm();
  38.             // 检查重复数据
  39.             if (!CollectionUtils.isEmpty(excelList) && !CollectionUtils.isEmpty(sfzhmList)) {
  40.                 for (TbXxxExcelDto excelDto : excelList) {
  41.                     int repeat = 0;
  42.                     // 遍历身份证信息
  43.                     for (String sfzhm : sfzhmList) {
  44.                         if (sfzhm.equals(excelDto.getSfzhm())) {
  45.                             repeat = 1;
  46.                             resultMap.put("success", false);
  47.                             resultMap.put("msg", "导入失败!系统中已存在相同的人员信息,请检查后重新导入!");
  48.                             break;
  49.                         }
  50.                     }
  51.                     if (repeat == 1) {
  52.                         return resultMap;
  53.                     }
  54.                 }
  55.             }
  56.             // 查询民族数据
  57.             List<Xxx> mzList = xxxMapper.findByCatalogCode("A1xx");
  58.             // 匹配数据
  59.             if (!CollectionUtils.isEmpty(excelList)) {
  60.                 excelList.forEach(excelDto -> {
  61.                     if (StringUtils.isNotBlank(excelDto.getMz())) {
  62.                         for (Xxx mz : mzList) {
  63.                             if (mz.getKeyName().equals(excelDto.getMz())) {
  64.                                 excelDto.setMz(mz.getKeyValue());
  65.                             }
  66.                         }
  67.                     }
  68.                                        
  69.                     // 获取城市信息
  70.                     if (StringUtils.isNotBlank(excelDto.getCounty())) {
  71.                         TbSysArea area = xxxMapper.findAreaByName(excelDto.getCounty());
  72.                         if (area != null) {
  73.                             excelDto.setXzqhdm(area.getAreaCode());
  74.                         }
  75.                     }
  76.                     Timestamp timestamp = new Timestamp(LocalDateTime.now().toInstant(ZoneOffset.UTC).toEpochMilli());
  77.                     // 插入时间
  78.                     excelDto.setSyntime(timestamp);
  79.                 });
  80.                 // sql Server 一次最多支持2100个参数,需要分批插入,按每80条插入,每条25个参数, subList包括首部不包括尾部
  81.                 // 商
  82.                 int quotient = excelList.size() / 80;
  83.                 // 余数
  84.                 int remainder = excelList.size() % 80;
  85.                 int row = 0;
  86.                 for (int i = 0; i < quotient; i++) {
  87.                     if (row == 0) {
  88.                         // 批量插入
  89.                         xxxMapper.insertBatch(excelList.subList(0, 80));
  90.                         row = row + 80;
  91.                     } else {
  92.                         xxxMapper.insertBatch(excelList.subList(row, row + 80));
  93.                         row = row + 80;
  94.                     }
  95.                 }
  96.                 if (remainder != 0) {
  97.                     xxxMapper.insertBatch(excelList.subList(quotient * 80, quotient * 80 + remainder));
  98.                 }
  99.                 resultMap.put("success", true);
  100.                 resultMap.put("msg", "导入成功!");
  101.                 return resultMap;
  102.             }
  103.             resultMap.put("success", true);
  104.             resultMap.put("msg", "空文件,无须解析!");
  105.         } catch (Exception e) {
  106.             e.printStackTrace();
  107.             resultMap.put("success", false);
  108.             resultMap.put("msg", "解析失败!请检查字段格式后重新导入!");
  109.         }
  110.         return resultMap;
  111.     }
复制代码
1.2.6、Dao层
  1.     /**
  2.      * 批量插入信息
  3.      *
  4.      * @param list 信息
  5.      * @return 受影响的行数
  6.      */
  7.     Integer insertBatch(@Param("list") List<TbXXXXXXExcelDto> list);
复制代码
1.2.7、mapper层
  1. <select id="insertBatch" parameterType="java.util.List" resultType="java.lang.Integer">
  2.     INSERT INTO tb_ex_xxxxxx
  3.         ( year,columnDataCode1,columnData1,columnData2,columnData3,columnData4,columnData5,dw ) VALUES
  4.     <foreach collection="list" item="item" separator="," index="item">
  5.         ( #{item.year}, #{item.columnDataCode1}, #{item.columnData1},  #{item.columnData2},
  6.         #{item.columnData3},#{item.columnData4}, #{item.columnData5},#{item.dw} )
  7.     </foreach>
  8. </select>
复制代码
2、导出

2.1、前台
  1. <button id="exportButton" onclick="exportDate();return false;">导出</button>
  2.    
复制代码
2.2、后台

1.2.1、实体类
  1. import cn.afterturn.easypoi.excel.annotation.Excel;
  2. import java.io.Serializable;
  3. import java.util.Date;
  4. public class TbXxxEntity implements Serializable {
  5.         private static final long serialVersionUID = 1L;
  6.         /**
  7.          *
  8.          */
  9.         private String id;
  10.         /**
  11.          *
  12.          */
  13.         private String name;
  14.         /**
  15.          *
  16.          */
  17.         private String content;
  18.         public String getId() {
  19.                 return id;
  20.         }
  21.         public void setId(String id) {
  22.                 this.id = id;
  23.         }
  24.         public String getName() {
  25.                 return name;
  26.         }
  27.         public void setName(String name) {
  28.                 this.name = name;
  29.         }
  30.         public String getContent() {
  31.                 return content;
  32.         }
  33.         public void setContent(String content) {
  34.                 this.content = content;
  35.         }
  36. }
复制代码
1.2.2、导出实体类
  1. import cn.afterturn.easypoi.excel.annotation.Excel;
  2. import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
  3. import java.io.Serializable;
  4. /**
  5. *
  6. *
  7. */
  8. @ExcelTarget("TbXxxreportVo")
  9. public class TbXxxreportVo implements Serializable {
  10.         private static final long serialVersionUID = 121871957378211532L;
  11.         private String id;
  12.         /**
  13.          * 名称
  14.          */
  15.         @Excel(name = "名称", width = 18)
  16.         private String name;
  17.         /**
  18.          * 描述
  19.          */
  20.         @Excel(name = "描述", width = 18)
  21.         private String content;
  22.         public String getId() {
  23.                 return id;
  24.         }
  25.         public void setId(String id) {
  26.                 this.id = id;
  27.         }
  28.         public String getName() {
  29.                 return name;
  30.         }
  31.         public void setName(String name) {
  32.                 this.name = name;
  33.         }
  34.         public String getContent() {
  35.                 return content;
  36.         }
  37.         public void setContent(String content) {
  38.                 this.content = content;
  39.         }
  40. }
复制代码
1.2.3、控制层
  1.     @GetMapping("/export")
  2.     public void export(HttpServletResponse response, @RequestParam String OrgCode) throws IOException {
  3.         tbxxxreportService.export(response, OrgCode);
  4.     }
复制代码
1.2.4、服务层
  1.     void export(HttpServletResponse response, String OrgCode) throws IOException;
复制代码
1.2.5、服务实现层
  1.     @Override
  2.     public void export(HttpServletResponse response, String OrgCode) throws IOException {
  3.         HashMap<String, Object> map = new HashMap<>();
  4.         map.put("OrgCode", OrgCode);
  5.         List<TbXxxreportVo> list = tbXxxreportDao.getExport(map);
  6.         ExportParams exportParams = new ExportParams("XXX导出", "XXX导出");
  7.         exportParams.setStyle(ExcelStyleType.BORDER.getClazz());
  8.         Workbook workbook = ExcelExportUtil.exportExcel(exportParams, TbXxxreportVo.class, list);
  9.         String fileName = "XXX.xls";
  10.         response.reset();
  11.         response.setContentType("application/octet-stream");
  12.         response.setHeader("Content-disposition", "attachment;filename=" + new String(fileName.getBytes("utf-8"), "ISO8859-1"));
  13.         response.flushBuffer();
  14.         workbook.write(response.getOutputStream());
  15.     }
复制代码
1.2.6、Dao层
  1.    List<TbXxxreportVo> getExport(Map<String, Object> params);
复制代码
1.2.7、mapper层
  1.    
  2.     <select id="getExport"  resultType="com.XX.XX.vo.TbXxxreportVo" parameterType="java.util.Map">
  3.         select name, content from Tb_Xxx
  4.         <where>
  5.             1 = 1
  6.             <if test="OrgCode!= null and OrgCode != ''">
  7.                 and OrgCode = #{OrgCode}
  8.             </if>
  9.         </where>
  10.     </select>
复制代码
3、末了

如果这篇文章帮助到您的话,可以请作者喝杯咖啡,以便更有动力的分享。感谢。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

写过一篇

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表