最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

天天新消息丨easy excel 导入导出

来源:博客园


【资料图】

随笔记录通过easy excel实现导入导出

第一步:导入依赖

    com.alibaba    easyexcel    3.1.0第二步:创建导入导出工具类
public class ExcelUtil {    /**     * 导出数据为excel文件     *     * @param filename       文件名称     * @param sheetName      sheet名称     * @param dataResult     集合内的bean对象类型要与clazz参数一致     * @param clazz          集合内的bean对象类型要与clazz参数一致     * @param response       HttpServlet响应对象     *///有实体对象的导出方式    public static void export(String filename,String sheetName, List dataResult, Class clazz, HttpServletResponse response) {        response.setStatus(200);        response.setContentType("application/vnd.ms-excel");        response.setCharacterEncoding("utf-8");        OutputStream outputStream = null;        ExcelWriter excelWriter = null;        try {            if (StringUtil.isEmpty(filename)) {                throw new RuntimeException(""filename" 不能为空");            }            String fileName = filename.concat(".xls");            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));            outputStream = response.getOutputStream();            // 根据不同的策略生成不同的ExcelWriter对象            if (dataResult == null){                excelWriter = getTemplateExcelWriter(outputStream);            } else {                excelWriter = getExportExcelWriter(outputStream);            }            //获取表头个数            int last = clazz.getDeclaredFields().length;            WriteSheet writeSheet = EasyExcel.writerSheet(sheetName).head(clazz)                    .relativeHeadRowIndex(1)                    .registerWriteHandler(new MonthSheetWriteHandler(sheetName,last))//设置大标题名称及其单元格合并                    .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())//自适应列宽                    .build();            // 写出数据            excelWriter.write(dataResult,writeSheet);        } catch (Exception e) {            log.error("导出excel数据异常:", e);            throw new RuntimeException(e);        } finally {            if (excelWriter != null) {                excelWriter.finish();            }            if (outputStream != null) {                try {                    outputStream.flush();                    outputStream.close();                } catch (IOException e) {                    log.error("导出数据关闭流异常", e);                }            }        }    }//没有实体对象的导出方式    public static void export(String filename,String sheetName,String headName, List dataResult, List> head, HttpServletResponse response) {        response.setStatus(200);        response.setContentType("application/vnd.ms-excel");        response.setCharacterEncoding("utf-8");        OutputStream outputStream = null;        ExcelWriter excelWriter = null;        try {            if (StringUtil.isEmpty(filename)) {                throw new RuntimeException(""filename" 不能为空");            }            String fileName = filename.concat(".xls");            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));            outputStream = response.getOutputStream();            // 根据不同的策略生成不同的ExcelWriter对象            if (dataResult == null){                excelWriter = getTemplateExcelWriter(outputStream);            } else {                excelWriter = getExportExcelWriter(outputStream);            }            WriteSheet writeSheet = EasyExcel.writerSheet(sheetName).head(head)                    .relativeHeadRowIndex(1)                    .registerWriteHandler(new MonthSheetWriteHandler(headName,head.size()))//设置大标题名称及其单元格合并                    .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())//自适应列宽                    .build();            // 写出数据            excelWriter.write(dataResult,writeSheet);        } catch (Exception e) {            log.error("导出excel数据异常:", e);            throw new RuntimeException(e);        } finally {            if (excelWriter != null) {                excelWriter.finish();            }            if (outputStream != null) {                try {                    outputStream.flush();                    outputStream.close();                } catch (IOException e) {                    log.error("导出数据关闭流异常", e);                }            }        }    }    /**     * 根据不同策略生成不同的ExcelWriter对象, 可根据实际情况修改     * @param outputStream  数据输出流     * @return  模板下载ExcelWriter对象     */    private static ExcelWriter getTemplateExcelWriter(OutputStream outputStream){        return EasyExcel.write(outputStream)                //.registerWriteHandler(new CommentWriteHandler())        //增加批注策略                //.registerWriteHandler(new CustomSheetWriteHandler())    //增加下拉框策略                .registerWriteHandler(getStyleStrategy())               //字体居中策略                .build();    }    /**     * 根据不同策略生成不同的ExcelWriter对象, 可根据实际情况修改     * @param outputStream  数据输出流     * @return  数据导出ExcelWriter对象     */    private static ExcelWriter getExportExcelWriter(OutputStream outputStream){        return EasyExcel.write(outputStream)                .registerWriteHandler(getStyleStrategy())   //字体居中策略                .build();    }    /**     *  设置表格内容居中显示策略     * @return     */    private static HorizontalCellStyleStrategy getStyleStrategy(){        WriteCellStyle headWriteCellStyle = new WriteCellStyle();        headWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.index);        //设置头字体        WriteFont headWriteFont = new WriteFont();        headWriteFont.setFontHeightInPoints((short)10);        headWriteFont.setBold(true);        headWriteCellStyle.setWriteFont(headWriteFont);        headWriteFont.setFontName("宋体");        //设置头居中        headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);        // 内容策略        WriteCellStyle writeCellStyle = new WriteCellStyle();        // 设置内容水平居中        writeCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);        //垂直居中,水平居中        writeCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);        writeCellStyle.setBorderLeft(BorderStyle.THIN);        writeCellStyle.setBorderTop(BorderStyle.THIN);        writeCellStyle.setBorderRight(BorderStyle.THIN);        writeCellStyle.setBorderBottom(BorderStyle.THIN);        writeCellStyle.setWriteFont(headWriteFont);        //设置 自动换行        //contentWriteCellStyle.setWrapped(true);        return new HorizontalCellStyleStrategy(headWriteCellStyle, writeCellStyle);    }    /**     * 根据Excel模板,批量导入数据     * @param file  导入的Excel     * @param clazz 解析的类型     * @return  解析完成的数据     */    public static List importExcel(MultipartFile file, Class clazz){        if (file == null || file.isEmpty()){            throw new RuntimeException("没有文件或者文件内容为空!");        }        List dataList = null;        BufferedInputStream ipt = null;        try {            InputStream is = file.getInputStream();            // 用缓冲流对数据流进行包装            ipt = new BufferedInputStream(is);            // 数据解析监听器            ExcelListener listener = new ExcelListener();            // 读取数据            EasyExcel.read(ipt, clazz,listener).headRowNumber(2).sheet().doRead();            // 获取去读完成之后的数据            dataList = listener.getDatas();        } catch (Exception e){            log.error(String.valueOf(e));            throw new RuntimeException("数据导入失败!" + e);        }        return dataList;    }}第三步:表格头部设置
public class MonthSheetWriteHandler implements SheetWriteHandler {    private String titleName="";    private int last=0;    public MonthSheetWriteHandler(String titleName,int last){        this.titleName=titleName;        this.last=last;    }    @Override    public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {        Workbook workbook = writeWorkbookHolder.getWorkbook();        Sheet sheet = workbook.getSheetAt(0);        Row row1 = sheet.createRow(0);        row1.setHeight((short) 800);        Cell cell = row1.createCell(0);        //设置标题        cell.setCellValue(titleName+"表");        CellStyle cellStyle = workbook.createCellStyle();        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);        cellStyle.setAlignment(HorizontalAlignment.CENTER);        Font font = workbook.createFont();        font.setBold(true);        font.setFontHeight((short) 400);        font.setFontName("宋体");        cellStyle.setFont(font);        cell.setCellStyle(cellStyle);        sheet.addMergedRegionUnsafe(new CellRangeAddress(0, 0, 0, last));    }}第四步:创建导入的监听器
public class ExcelListener extends AnalysisEventListener {    //可以通过实例获取该值    private List datas = new ArrayList<>();    @Override    public void invoke(Object o, AnalysisContext analysisContext) {        datas.add(o);//数据存储到list,供批量处理,或后续自己业务逻辑处理。        doSomething(o);//根据自己业务做处理    }    private void doSomething(Object object) {        //1、入库调用接口    }    public List getDatas() {        return datas;    }    public void setDatas(List datas) {        this.datas = datas;    }    public void doAfterAllAnalysed(AnalysisContext analysisContext) {        // datas.clear();//解析结束销毁不用的资源    }}第五步:service层调用导入导出方法//导出/**
fileName:文件名称
sheetName:sheet名称
exportList:数据源HouseExportVO.class:实体类对象,与数据源对应response:HttpServlet响应对象
*/
//ExcelUtil.export(fileName,sheetName,exportList, HouseExportVO.class, response); 有实体类对象的调用方式/**
fileName:文件名称
sheetName:sheet名称
headName:头部标题名称
dataList:数据源组装
headList:动态头部列组装
response:HttpServlet响应对象
*/
//ExcelUtil.export(fileName,sheetName,headName,dataList, headList, response);动态列调用方式//导入
//读取文件,获取数据/**
multipartFile:导入的文件,由前端传入
HouseImportExcelDTO.class:接受数据所对应的实体对象
读取到的数据源:excelData
*///List excelData = ExcelUtil.importExcel(multipartFile, HouseImportExcelDTO.class);自此通用的easyExcel导入导出就完成了,具体导出的表格样式自行设置!

关键词: 根据不同 文件名称 数据输出