SpringBoot2:web开辟常勤奋能实现及原理解析-整合EasyExcel实现Excel导入 ...

打印 上一主题 下一主题

主题 1046|帖子 1046|积分 3138

1、工程包结构

主要是这5个Java类

2、导入EasyExcel包

这里同时贴出其他相关springboot的底子包
  1.         <dependency>
  2.             <groupId>org.springframework.boot</groupId>
  3.             <artifactId>spring-boot-starter-web</artifactId>
  4.         </dependency>
  5.         <dependency>
  6.             <groupId>org.springframework.boot</groupId>
  7.             <artifactId>spring-boot-devtools</artifactId>
  8.             <scope>runtime</scope>
  9.             <optional>true</optional>
  10.         </dependency>
  11.         <dependency>
  12.             <groupId>org.springframework.boot</groupId>
  13.             <artifactId>spring-boot-configuration-processor</artifactId>
  14.             <optional>true</optional>
  15.         </dependency>
  16.         <dependency>
  17.             <groupId>org.projectlombok</groupId>
  18.             <artifactId>lombok</artifactId>
  19.             <optional>true</optional>
  20.         </dependency>
  21.         <dependency>
  22.             <groupId>org.springframework.boot</groupId>
  23.             <artifactId>spring-boot-starter-test</artifactId>
  24.             <scope>test</scope>
  25.         </dependency>
  26.         <!-- 引入easyExcel依赖 -->
  27.         <dependency>
  28.             <groupId>com.alibaba</groupId>
  29.             <artifactId>easyexcel</artifactId>
  30.             <version>2.2.6</version>
  31.         </dependency>
复制代码
3、Java代码

ExcelSysUser
  1. import com.alibaba.excel.annotation.ExcelProperty;
  2. import com.alibaba.excel.annotation.write.style.ColumnWidth;
  3. import com.alibaba.excel.annotation.write.style.ContentRowHeight;
  4. import com.alibaba.excel.annotation.write.style.ContentStyle;
  5. import com.alibaba.excel.annotation.write.style.HeadFontStyle;
  6. import com.alibaba.excel.annotation.write.style.HeadRowHeight;
  7. import lombok.Data;
  8. import lombok.ToString;
  9. import org.apache.poi.ss.usermodel.HorizontalAlignment;
  10. @ContentRowHeight(25)
  11. @HeadRowHeight(15)
  12. @ColumnWidth(25)
  13. @HeadFontStyle(fontHeightInPoints=9)
  14. @ContentStyle(horizontalAlignment= HorizontalAlignment.CENTER)
  15. @Data
  16. @ToString
  17. public class ExcelSysUser {
  18.         public ExcelSysUser(){
  19.         }
  20.         public ExcelSysUser(String loginName, String userName, String userPwd){
  21.                 this.loginName = loginName;
  22.                 this.userName = userName;
  23.                 this.userPwd = userPwd;
  24.         }
  25.         @ExcelProperty(value = "登录名",index = 0)
  26.         private String loginName;
  27.         @ExcelProperty(value = "用户名",index = 1)
  28.         private String userName;
  29.         @ExcelProperty(value = "密码",index = 2)
  30.         private String userPwd;
  31. }
复制代码
ExcelFillCellMergeHandler
  1. import com.alibaba.excel.metadata.CellData;
  2. import com.alibaba.excel.metadata.Head;
  3. import com.alibaba.excel.write.handler.CellWriteHandler;
  4. import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
  5. import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
  6. import org.apache.poi.ss.usermodel.Cell;
  7. import org.apache.poi.ss.usermodel.CellType;
  8. import org.apache.poi.ss.usermodel.Row;
  9. import org.apache.poi.ss.usermodel.Sheet;
  10. import org.apache.poi.ss.util.CellRangeAddress;
  11. import java.util.List;
  12. /**
  13. * 合并单元格处理类
  14. */
  15. public class ExcelFillCellMergeHandler implements CellWriteHandler {
  16.         //需要合并的列
  17.         private int[] mergeColumnIndex;
  18.         //从哪一列开始合并
  19.         private int mergeRowIndex;
  20.         public ExcelFillCellMergeHandler() {
  21.         }
  22.         public ExcelFillCellMergeHandler(int mergeRowIndex, int[] mergeColumnIndex) {
  23.                 this.mergeRowIndex = mergeRowIndex;
  24.                 this.mergeColumnIndex = mergeColumnIndex;
  25.         }
  26.         @Override
  27.         public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer integer, Integer integer1, Boolean aBoolean) {
  28.         }
  29.         @Override
  30.         public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer integer, Boolean aBoolean) {
  31.         }
  32.         @Override
  33.         public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, CellData cellData, Cell cell, Head head, Integer integer, Boolean aBoolean) {
  34.         }
  35.         @Override
  36.         public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> list, Cell cell, Head head, Integer integer, Boolean aBoolean) {
  37.                 int curRowIndex = cell.getRowIndex();
  38.                 int curColIndex = cell.getColumnIndex();
  39.                 if (curRowIndex > mergeRowIndex) {
  40.                         for (int i = 0; i < mergeColumnIndex.length; i++) {
  41.                                 if (curColIndex == mergeColumnIndex[i]) {
  42.                                         mergeWithPrevRow(writeSheetHolder, cell, curRowIndex, curColIndex);
  43.                                         break;
  44.                                 }
  45.                         }
  46.                 }
  47.         }
  48.         /**
  49.          * 当前单元格向上合并
  50.          *
  51.          * @param writeSheetHolder
  52.          * @param cell             当前单元格
  53.          * @param curRowIndex      当前行
  54.          * @param curColIndex      当前列
  55.          */
  56.         private void mergeWithPrevRow(WriteSheetHolder writeSheetHolder, Cell cell, int curRowIndex, int curColIndex) {
  57.                 Object curData = cell.getCellTypeEnum() == CellType.STRING ? cell.getStringCellValue() : cell.getNumericCellValue();
  58.                 Cell preCell = cell.getSheet().getRow(curRowIndex - 1).getCell(curColIndex);
  59.                 Object preData = preCell.getCellTypeEnum() == CellType.STRING ? preCell.getStringCellValue() : preCell.getNumericCellValue();
  60.                 // 将当前单元格数据与上一个单元格数据比较
  61.                 Boolean dataBool = preData.equals(curData);
  62.                 Boolean bool = cell.getRow().getCell(0).getStringCellValue().equals(cell.getSheet().getRow(curRowIndex - 1).getCell(0).getStringCellValue());
  63.                 if (dataBool && bool) {
  64.                         Sheet sheet = writeSheetHolder.getSheet();
  65.                         List<CellRangeAddress> mergeRegions = sheet.getMergedRegions();
  66.                         boolean isMerged = false;
  67.                         for (int i = 0; i < mergeRegions.size() && !isMerged; i++) {
  68.                                 CellRangeAddress cellRangeAddr = mergeRegions.get(i);
  69.                                 // 若上一个单元格已经被合并,则先移出原有的合并单元,再重新添加合并单元
  70.                                 if (cellRangeAddr.isInRange(curRowIndex - 1, curColIndex)) {
  71.                                         sheet.removeMergedRegion(i);
  72.                                         cellRangeAddr.setLastRow(curRowIndex);
  73.                                         sheet.addMergedRegion(cellRangeAddr);
  74.                                         isMerged = true;
  75.                                 }
  76.                         }
  77.                         // 若上一个单元格未被合并,则新增合并单元
  78.                         if (!isMerged) {
  79.                                 CellRangeAddress cellRangeAddress = new CellRangeAddress(curRowIndex - 1, curRowIndex, curColIndex, curColIndex);
  80.                                 sheet.addMergedRegion(cellRangeAddress);
  81.                         }
  82.                 }
  83.         }
  84. }
复制代码
ExcelListener
  1. import com.alibaba.excel.context.AnalysisContext;
  2. import com.alibaba.excel.event.AnalysisEventListener;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. /**
  6. * 解析监听器,
  7. * 每解析一行会回调invoke()方法。
  8. * 整个excel解析结束会执行doAfterAllAnalysed()方法
  9. */
  10. public class ExcelListener extends AnalysisEventListener {
  11.         private List<Object> datas = new ArrayList<>();
  12.         public List<Object> getDatas() {
  13.                 return datas;
  14.         }
  15.         public void setDatas(List<Object> datas) {
  16.                 this.datas = datas;
  17.         }
  18.         /**
  19.          * 逐行解析
  20.          * object : 当前行的数据
  21.          */
  22.         @Override
  23.         public void invoke(Object object, AnalysisContext context) {
  24.                 //当前行
  25.                 // context.getCurrentRowNum()
  26.                 if (object != null) {
  27.                         datas.add(object);
  28.                 }
  29.         }
  30.         /**
  31.          * 解析完所有数据后会调用该方法
  32.          */
  33.         @Override
  34.         public void doAfterAllAnalysed(AnalysisContext context) {
  35.                 //解析结束销毁不用的资源
  36.         }
  37. }
复制代码
EasyExcelUtil
  1. import com.alibaba.excel.EasyExcel;
  2. import com.alibaba.excel.support.ExcelTypeEnum;
  3. import com.atguigu.boot.handler.ExcelFillCellMergeHandler;
  4. import com.atguigu.boot.listener.ExcelListener;
  5. import org.springframework.web.multipart.MultipartFile;
  6. import javax.servlet.http.HttpServletResponse;
  7. import java.io.IOException;
  8. import java.io.OutputStream;
  9. import java.util.List;
  10. /**
  11. * EasyExcel工具类
  12. */
  13. public class EasyExcelUtil {
  14.         /**
  15.          * 读取 Excel(多个 sheet)
  16.          *
  17.          * @param excel 文件
  18.          * @param rowModel 实体类映射
  19.          * @return Excel 数据 list
  20.          */
  21.         public static List<Object> readExcel(MultipartFile excel, Object rowModel) throws IOException {
  22.                 String filename = excel.getOriginalFilename();
  23.                 if (filename == null || (!filename.toLowerCase().endsWith(".xls") && !filename.toLowerCase().endsWith(".xlsx"))) {
  24.                         throw new RuntimeException("文件格式错误!");
  25.                 }
  26.                 ExcelListener excelListener = new ExcelListener();
  27.                 EasyExcel.read(excel.getInputStream(),rowModel.getClass(),excelListener).doReadAll();
  28.                 return excelListener.getDatas();
  29.         }
  30.         /**
  31.          * 导出 Excel :一个 sheet,带表头
  32.          *
  33.          * @param response HttpServletResponse
  34.          * @param list 数据 list
  35.          * @param fileName 导出的文件名
  36.          * @param sheetName 导入文件的 sheet 名
  37.          * @param object 映射实体类,Excel 模型
  38.          */
  39.         public static void writeExcel(HttpServletResponse response, List<?> list, String fileName,
  40.                                                                   String sheetName, Object object) {
  41.                 EasyExcel.write(getOutputStream(fileName, response),object.getClass())
  42.                                 .excelType(ExcelTypeEnum.XLSX)
  43.                                 .autoCloseStream(Boolean.TRUE)
  44.                                 .sheet(sheetName)
  45.                                 .doWrite(list);
  46.         }
  47.         /**
  48.          * 导出 Excel 自动合并单元格
  49.          * @param response HttpServletResponse
  50.          * @param list 数据 list
  51.          * @param fileName 导出的文件名
  52.          * @param sheetName 导入文件的 sheet 名
  53.          * @param object 映射实体类,Excel 模型
  54.          * @param mergeColumnIndex 需要合并的列
  55.          * @param mergeRowIndex 从哪一列开始合并
  56.          */
  57.         public static void writeMergeExcel(HttpServletResponse response, List<?> list, String fileName,
  58.                                                                            String sheetName, Object object, int[] mergeColumnIndex, int mergeRowIndex) {
  59.                 EasyExcel.write(getOutputStream(fileName, response),object.getClass())
  60.                                 .excelType(ExcelTypeEnum.XLSX)
  61.                                 .autoCloseStream(Boolean.TRUE)
  62.                                 .registerWriteHandler(new ExcelFillCellMergeHandler(mergeRowIndex,mergeColumnIndex))
  63.                                 .sheet(sheetName)
  64.                                 .doWrite(list);
  65.         }
  66.         /**
  67.          * 导出文件时为Writer生成OutputStream
  68.          */
  69.         private static OutputStream getOutputStream(String fileName, HttpServletResponse response) {
  70.                 //创建本地文件
  71.                 fileName = fileName + ".xls";
  72.                 try {
  73.                         fileName = new String(fileName.getBytes(), "ISO-8859-1");
  74.                         response.addHeader("Content-Disposition", "attachment;filename=" + fileName);
  75.                         return response.getOutputStream();
  76.                 } catch (Exception e) {
  77.                         throw new RuntimeException("导出异常!");
  78.                 }
  79.         }
  80. }
复制代码
EasyExcelLoadsController
  1. import com.atguigu.boot.bean.ExcelSysUser;
  2. import com.atguigu.boot.utils.EasyExcelUtil;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.RequestMethod;
  5. import org.springframework.web.bind.annotation.RestController;
  6. import org.springframework.web.multipart.MultipartFile;
  7. import javax.servlet.http.HttpServletResponse;
  8. import java.io.IOException;
  9. import java.util.ArrayList;
  10. import java.util.List;
  11. @RestController
  12. @RequestMapping("/excel")
  13. public class EasyExcelLoadsController {
  14.         /**
  15.          * 用户信息导出Excel
  16.          */
  17.         @RequestMapping(value = "/exportSysUser",method = RequestMethod.GET)
  18.         public void exportSysUser(HttpServletResponse response){
  19.                 List<ExcelSysUser> excelSysUsers = new ArrayList<>();
  20.                 ExcelSysUser excelSysUser1 = new ExcelSysUser("张三", "zhangsan002", "zsmm123");
  21.                 ExcelSysUser excelSysUser2 = new ExcelSysUser("张三", "zhangsan003", "zsmm456");
  22.                 ExcelSysUser excelSysUser3 = new ExcelSysUser("张三", "zhangsan001", "zsmm789");
  23.                 ExcelSysUser excelSysUser4 = new ExcelSysUser("李四", "zhangsan001", "zsmm123");
  24.                 ExcelSysUser excelSysUser5 = new ExcelSysUser("李四", "zhangsan001", "zsmm456");
  25.                 excelSysUsers.add(excelSysUser1);
  26.                 excelSysUsers.add(excelSysUser2);
  27.                 excelSysUsers.add(excelSysUser3);
  28.                 excelSysUsers.add(excelSysUser4);
  29.                 excelSysUsers.add(excelSysUser5);
  30.                 EasyExcelUtil.writeExcel(response, excelSysUsers,"用户信息","用户信息", new ExcelSysUser());
  31.         }
  32.         /**
  33.          * 用户信息导出Excel(合并单元格)
  34.          */
  35.         @RequestMapping(value = "/exportMergeSysUser",method = RequestMethod.GET)
  36.         public void exportMergeSysUser(HttpServletResponse response){
  37.                 List<ExcelSysUser> excelSysUsers = new ArrayList<>();
  38.                 ExcelSysUser excelSysUser1 = new ExcelSysUser("张三", "zhangsan002", "zsmm123");
  39.                 ExcelSysUser excelSysUser2 = new ExcelSysUser("张三", "zhangsan003", "zsmm456");
  40.                 ExcelSysUser excelSysUser3 = new ExcelSysUser("张三", "zhangsan001", "zsmm789");
  41.                 ExcelSysUser excelSysUser4 = new ExcelSysUser("李四", "zhangsan001", "zsmm123");
  42.                 ExcelSysUser excelSysUser5 = new ExcelSysUser("李四", "zhangsan001", "zsmm456");
  43.                 excelSysUsers.add(excelSysUser1);
  44.                 excelSysUsers.add(excelSysUser2);
  45.                 excelSysUsers.add(excelSysUser3);
  46.                 excelSysUsers.add(excelSysUser4);
  47.                 excelSysUsers.add(excelSysUser5);
  48.                 int[] mergeColumnIndex = {0,1};
  49.                 int mergeRowIndex = 0;
  50.                 EasyExcelUtil.writeMergeExcel(response, excelSysUsers,"用户信息","用户信息", new ExcelSysUser(), mergeColumnIndex, mergeRowIndex);
  51.         }
  52.         @RequestMapping(value = "/importSysUser",method = RequestMethod.POST)
  53.         public void importSysUser(MultipartFile excel){
  54.                 List<Object> dataList = null;
  55.                 try {
  56.                         dataList = EasyExcelUtil.readExcel(excel, new ExcelSysUser());
  57.                 } catch (IOException e) {
  58.                         e.printStackTrace();
  59.                 }
  60.                 dataList.forEach(o -> System.out.println(o.toString()));
  61.         }
  62. }
复制代码
4、测试Excel

导入需要预备下图中的数据,导出直接浏览器访问接口即可。


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

本帖子中包含更多资源

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

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

美食家大橙子

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表