本节将分享给大家,实现Excel表格的导出和导入,简单好用的插件。
package com.sf.vsolution.hb.sfce.util.excel; import com.alibaba.excel.EasyExcelFactory; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import com.alibaba.excel.metadata.BaseRowModel; import com.alibaba.excel.metadata.Sheet; import com.alibaba.excel.support.ExcelTypeEnum; import com.alibaba.excel.util.CollectionUtils; import lombok.Data; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.StringUtils; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; /** * @description: 阿里巴巴EasyExcel工具 * @author: zhucj * @date: 2019-11-05 13:22 */ public class EasyExcelUtils { private static final Logger logger = LoggerFactory.getLogger(EasyExcelUtils.class); private static Sheet initSheet; static { initSheet = new Sheet(1, 0); initSheet.setSheetName("sheet"); // 设置自适应宽度 initSheet.setAutoWidth(Boolean.TRUE); } /** * 导入 * 少于1000行数据 默认样式 * @param filePath 文件绝对路径 * @return */ public static List<Object> readLessThan1000Row(String filePath) { return readLessThan1000RowBySheet(filePath, null); } /** * 导入 * 少于1000行数据,带样式的 * @param filePath 文件绝对路径 * @param sheet * @return */ public static List<Object> readLessThan1000RowBySheet(String filePath, Sheet sheet) { if (!StringUtils.hasText(filePath)) { return null; } sheet = sheet != null ? sheet : initSheet; InputStream inputStream = null; try { inputStream = new FileInputStream(filePath); return EasyExcelFactory.read(inputStream, sheet); } catch (FileNotFoundException e) { logger.error("找不到文件或者文件路径错误", e); } finally { try { if (inputStream != null) { inputStream.close(); } } catch (IOException e) { logger.error("excel文件读取失败,失败原因:{}", e); } } return null; } /** * 导入 * 大于1000行数据 默认样式 * @param filePath * @return */ public static List<Object> readMoreThan1000Row(String filePath) { return readMoreThan1000RowBySheet(filePath, null); } /** * 导入 * 大于1000行数据 自定义样式 * @param filePath * @param sheet * @return */ public static List<Object> readMoreThan1000RowBySheet(String filePath, Sheet sheet) { if (!StringUtils.hasText(filePath)) { return null; } sheet = sheet != null ? sheet : initSheet; InputStream inputStream = null; try { inputStream = new FileInputStream(filePath); ExcelListener excelListener = new ExcelListener(); EasyExcelFactory.readBySax(inputStream, sheet, excelListener); return excelListener.getDatas(); } catch (FileNotFoundException e) { logger.error("找不到文件或者文件路径错误"); } finally { try { if (inputStream != null) { inputStream.close(); } } catch (IOException e) { logger.error("excel文件读取失败,失败原因:{}", e); } } return null; } /** * 导出单个sheet * @param response * @param dataList * @param sheet * @param fileName * @throws UnsupportedEncodingException */ public static void writeExcelOneSheet(HttpServletResponse response, List<? extends BaseRowModel> dataList, Sheet sheet, String fileName) { if (CollectionUtils.isEmpty(dataList)) { throw new RuntimeException("导出的表格数据为空!"); } // 如果sheet为空,则使用默认的 if (null == sheet) { sheet = initSheet; } try { String value = "attachment; filename=" + new String( (fileName + new SimpleDateFormat("yyyyMMdd").format(new Date()) + ExcelTypeEnum.XLSX.getValue()).getBytes("gb2312"), "ISO8859-1"); response.setContentType("multipart/form-data"); response.setCharacterEncoding("utf-8"); response.setContentType("application/vnd.ms-excel;charset=utf-8"); response.setHeader("Content-disposition", value); ServletOutputStream out = response.getOutputStream(); ExcelWriter writer = EasyExcelFactory.getWriter(out, ExcelTypeEnum.XLSX, true); // 设置属性类 sheet.setClazz(dataList.get(0).getClass()); writer.write(dataList, sheet); writer.finish(); out.flush(); } catch (IOException e) { logger.error("导出失败,失败原因:{}", e); } } /** * @Author lockie * @Description 导出excel 支持一张表导出多个sheet * @Param OutputStream 输出流 * Map<String, List> sheetName和每个sheet的数据 * ExcelTypeEnum 要导出的excel的类型 有ExcelTypeEnum.xls 和有ExcelTypeEnum.xlsx * @Date 上午12:16 2019/1/31 */ public static void writeExcelMutilSheet(HttpServletResponse response, Map<String, List<? extends BaseRowModel>> dataList, String fileName) throws UnsupportedEncodingException { if (CollectionUtils.isEmpty(dataList)) { throw new RuntimeException("导出的表格数据为空!"); } try { String value = "attachment; filename=" + new String( (fileName + new SimpleDateFormat("yyyyMMdd").format(new Date()) + ExcelTypeEnum.XLSX.getValue()).getBytes("gb2312"), "ISO8859-1"); response.setContentType("multipart/form-data"); response.setCharacterEncoding("utf-8"); response.setContentType("application/vnd.ms-excel;charset=utf-8"); response.setHeader("Content-disposition", value); ServletOutputStream out = response.getOutputStream(); ExcelWriter writer = new ExcelWriter(out, ExcelTypeEnum.XLSX, true); // 设置多个sheet setMutilSheet(dataList, writer); writer.finish(); out.flush(); } catch (IOException e) { logger.error("导出异常", e); } } /** * @Author lockie * @Description //setSheet数据 * @Date 上午12:39 2019/1/31 */ private static void setMutilSheet(Map<String, List<? extends BaseRowModel>> dataList, ExcelWriter writer) { int sheetNum = 1; for (Map.Entry<String, List<? extends BaseRowModel>> stringListEntry : dataList.entrySet()) { Sheet sheet = new Sheet(sheetNum, 0, stringListEntry.getValue().get(0).getClass()); sheet.setSheetName(stringListEntry.getKey()); writer.write(stringListEntry.getValue(), sheet); sheetNum++; } } /** * 导出监听 */ @Data public static class ExcelListener extends AnalysisEventListener { private List<Object> datas = new ArrayList<>(); /** * 逐行解析 * @param object 当前行的数据 * @param analysisContext */ @Override public void invoke(Object object, AnalysisContext analysisContext) { if (object != null) { datas.add(object); } } /** * 解析完所有数据后会调用该方法 * @param analysisContext */ @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) { } } }
package com.sf.detectprocess.controller.param.export; import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.metadata.BaseRowModel; import com.sf.detectprocess.core.constant.SystemConstants; import lombok.*; import java.math.BigDecimal; import java.util.Date; /** * @description: 导出订单信息 * @author: zhucj * @date: 2019-11-05 15:48 */ @Data @Builder @NoArgsConstructor @AllArgsConstructor @ToString public class ExportComeInsureInfo extends BaseRowModel { @ExcelProperty(value = "订单号",index = 0) private String orderNo; @ExcelProperty(value = "订单生成时间",index = 1,format = SystemConstants.DEFAULT_DATETIME_FORMAT) private Date createTime; @ExcelProperty(value = "起运日期",index = 2) private String comeTime; @ExcelProperty(value = "物品名称",index = 3) private String goodsInfo; @ExcelProperty(value = "包装件数",index = 4) private Integer countPack; @ExcelProperty(value = "起点",index = 5) private String comeSendAddress; @ExcelProperty(value = "终点",index = 6) private String comeConsignAddress; @ExcelProperty(value = "单号",index = 7) private String waybillNo; @ExcelProperty(value = "声明价值",index = 8) private BigDecimal sumInsureValue; }
<!--alibaba导出 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>1.1.2-beta5</version> </dependency>