# EasyExcelDemo **Repository Path**: java_7758520/EasyExcelDemo ## Basic Information - **Project Name**: EasyExcelDemo - **Description**: No description available - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2020-11-24 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # easyExcel文档 ## 一、EasyExcel ### 写操作 #### 1、实体类 ```java // @ExcelProperty("主键") 定义行名 @Data public class LitemallRegion implements Serializable { private static final long serialVersionUID = 1L; @ExcelProperty("主键") private Integer id; @ExcelProperty("行政区域父编号") private Integer pid; @ExcelProperty("行政区域名称") private String name; @ExcelProperty("行政区域类型") private Integer type; @ExcelProperty("行政区域编码") private Integer code; } ``` #### 2、操作写 ```java @GetMapping("/write") @ApiOperation(value = "写入Excel", notes = "实现数据库写入Excel") public R write(@RequestParam(defaultValue = "E:\\V\\EasyExcelDemo2\\") String path) { String fileName = path + "EasyExcel.xlsx"; List list = litemallRegionDao.selectList(null); EasyExcel.write(fileName, LitemallRegion.class).sheet("模板").doWrite(list); return R.ok().put("msg", "从数据库拿出数据写入Excel成功"); } ``` #### 3、web中写 ```java /** * 访问路径——下载Excel文件(从数据库写入) * 文件下载(失败了会返回一个有部分数据的Excel) *

* 1. 创建excel对应的实体对象 参照{ DownloadData} *

* 2. 设置返回的 参数 *

* 3. 直接写,这里注意,finish的时候会自动关闭OutputStream,当然你外面再关闭流问题不大 */ @GetMapping("download") public void download(HttpServletResponse response) throws IOException { // 从数据库中拿出数据 List list = litemallRegionDao.selectList(null); // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系 String fileName = URLEncoder.encode("测试", "UTF-8"); response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx"); EasyExcel.write(response.getOutputStream(), LitemallRegion.class).sheet("模板").doWrite(list); } ``` 如果错了返回一定json信息 ```java /** * 访问路径——下载Excel文件(从数据库写入) * 文件下载并且失败的时候返回json(默认失败了会返回一个有部分数据的Excel) * * @since 2.1.1 */ @GetMapping("downloadFailedUsingJson") public void downloadFailedUsingJson(HttpServletResponse response) throws IOException { // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman try { response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系 String fileName = URLEncoder.encode("文件名字", "UTF-8"); response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx"); // 这里需要设置不关闭流 EasyExcel.write(response.getOutputStream(), LitemallRegion.class).autoCloseStream(Boolean.FALSE).sheet("模板") .doWrite(litemallRegionDao.selectList(null)); } catch (Exception e) { // 重置response response.reset(); response.setContentType("application/json"); response.setCharacterEncoding("utf-8"); Map map = new HashMap(); map.put("status", "failure"); map.put("message", "下载文件失败" + e.getMessage()); response.getWriter().println(JSON.toJSONString(map)); } } ``` ### 读操作 #### 1、监听器 ```java public class ExcelDemoListener extends AnalysisEventListener { // 继承 AnalysisEventListener private static final Logger LOGGER = LoggerFactory.getLogger(ExcelDemoListener.class); /** * 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收 */ private static final int BATCH_COUNT = 1000; List list = new ArrayList(); private LitemallRegionDao litemallRegionDao; /** * 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。 */ /* public ExcelDemoListener() { // 这里是demo,所以随便new一个。实际使用如果到了spring,请使用下面的有参构造函数 demoDAO = new LitemallRegionDao(); }*/ /** * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来 * * @param */ public ExcelDemoListener(LitemallRegionDao litemallRegionDao) { this.litemallRegionDao = litemallRegionDao; } @Override public void invoke(LitemallRegion litemallRegion, AnalysisContext analysisContext) { LOGGER.info("解析到一条数据:{}", JSON.toJSONString(litemallRegion)); list.add(litemallRegion); // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM if (list.size() >= BATCH_COUNT) { saveData(); // 存储完成清理 list list.clear(); } } @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) { // 这里也要保存数据,确保最后遗留的数据也存储到数据库 saveData(); LOGGER.info("所有数据解析完成!"); } /** * 加上存储数据库 */ private void saveData() { LOGGER.info("{}条数据,开始存储数据库!", list.size()); litemallRegionDao.saveList(list); LOGGER.info("存储数据库成功!"); } } ``` #### 2、操作读 ```java /** * 从Excel中拿出数据写入数据库 * 可以在监听器中对数据进行处理 * @param path * @return */ @PostMapping("/read") @ApiOperation(value = "写入Excel", notes = "EasyExcel实现Excel写入数据库") public R read(@RequestParam(defaultValue = "E:\\V\\EasyExcelDemo2\\") String path) { // 写法1: String fileName =path+"EasyExcel.xlsx"; // 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭 EasyExcel.read(fileName, LitemallRegion.class, new ExcelDemoListener()).sheet().doRead(); return R.ok().put("msg","从Excel中拿出数据存入数据库成功"); } ``` #### 3、web中读(传一个Excel,log出数据,并且存入数据库) ```java /** * web上传——从Excel中拿出数据写入数据库 * 文件上传 *

* 1. 创建excel对应的实体对象 参照{ UploadData} *

* 2. 由于默认一行行的读取excel,所以需要创建excel一行一行的回调监听器,参照{ UploadDataListener} *

* 3. 直接读即可 */ @PostMapping("upload") @ResponseBody public String upload(MultipartFile file) throws IOException { EasyExcel.read(file.getInputStream(), LitemallRegion.class, new ExcelDemoListener(litemallRegionDao)).sheet().doRead(); return "success"; } ```