精华内容
下载资源
问答
  • EasyExcel导出动态合并单元格策略

    千次阅读 2020-12-22 15:49:06
    EasyExcel导出动态合并单元格策略 1.导入依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.6</version> </...

    EasyExcel导出动态合并单元格策略

    1.导入依赖

       <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.6</version>
        </dependency>
    

    2.合并单元格工具类

    import com.alibaba.excel.metadata.CellData;
    import com.alibaba.excel.metadata.Head;
    import com.alibaba.excel.write.handler.CellWriteHandler;
    import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
    import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.CellType;
    import org.apache.poi.ss.usermodel.Row;
    import org.apache.poi.ss.usermodel.Sheet;
    import org.apache.poi.ss.util.CellRangeAddress;
    import java.util.List;
    
    public class ExcelMergeUtil implements CellWriteHandler {
    private int[] mergeColumnIndex;
    private int mergeRowIndex;
    
    public ExcelMergeUtil() {
    }
    
    public ExcelMergeUtil(int mergeRowIndex, int[] mergeColumnIndex) {
        this.mergeRowIndex = mergeRowIndex;
        this.mergeColumnIndex = mergeColumnIndex;
    }
    
    @Override
    public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) {
    
    }
    
    @Override
    public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
    
    }
    
    @Override
    public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, CellData cellData, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
    
    }
    
    @Override
    public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
    
        //当前行
        int curRowIndex = cell.getRowIndex();
        //当前列
        int curColIndex = cell.getColumnIndex();
    
        if (curRowIndex > mergeRowIndex) {
            for (int i = 0; i < mergeColumnIndex.length; i++) {
                if (curColIndex == mergeColumnIndex[i]) {
                    mergeWithPrevRow(writeSheetHolder, cell, curRowIndex, curColIndex);
                    break;
                }
            }
        }
    }
    
    
    /**
     * 当前单元格向上合并
     *
     * @param writeSheetHolder
     * @param cell             当前单元格
     * @param curRowIndex      当前行
     * @param curColIndex      当前列
     */
    private void mergeWithPrevRow(WriteSheetHolder writeSheetHolder, Cell cell, int curRowIndex, int curColIndex) {
        Object curData = cell.getCellTypeEnum() == CellType.STRING ? cell.getStringCellValue() : cell.getNumericCellValue();
        Cell preCell = cell.getSheet().getRow(curRowIndex - 1).getCell(curColIndex);
        Object preData = preCell.getCellTypeEnum() == CellType.STRING ? preCell.getStringCellValue() : preCell.getNumericCellValue();
        // 将当前单元格数据与上一个单元格数据比较
        Boolean dataBool = preData.equals(curData);
        //此处需要注意:因为我是按照订单号确定是否需要合并的,所以获取每一行第二列数据和上一行第一列数据进行比较,如果相等合并
        Boolean bool = cell.getRow().getCell(0).getStringCellValue().equals(cell.getSheet().getRow(curRowIndex - 1).getCell(0).getStringCellValue());
        if (dataBool && bool) {
            Sheet sheet = writeSheetHolder.getSheet();
            List<CellRangeAddress> mergeRegions = sheet.getMergedRegions();
            boolean isMerged = false;
            for (int i = 0; i < mergeRegions.size() && !isMerged; i++) {
                CellRangeAddress cellRangeAddr = mergeRegions.get(i);
                // 若上一个单元格已经被合并,则先移出原有的合并单元,再重新添加合并单元
                if (cellRangeAddr.isInRange(curRowIndex - 1, curColIndex)) {
                    sheet.removeMergedRegion(i);
                    cellRangeAddr.setLastRow(curRowIndex);
                    sheet.addMergedRegion(cellRangeAddr);
                    isMerged = true;
                }
            }
            // 若上一个单元格未被合并,则新增合并单元
            if (!isMerged) {
                CellRangeAddress cellRangeAddress = new CellRangeAddress(curRowIndex - 1, curRowIndex, curColIndex, curColIndex);
                sheet.addMergedRegion(cellRangeAddress);
            }
        }
    }
    

    }

    3、导出方法(公司导出的工具类)

    public static ExcelWriter getExcelWriterMerge(HttpServletResponse response, String excelName,int mergeRowIndex,int[] mergeColumeIndex) throws Exception{
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        // 这里URLEncoder.encode可以防止中文乱码
        excelName = URLEncoder.encode(excelName, "UTF-8");
        response.setHeader("Content-disposition", "attachment;filename=" + excelName + ExcelTypeEnum.XLSX.getValue());
    
        ExcelWriter build = EasyExcel.write(response.getOutputStream()).registerWriteHandler(new ExcelMergeUtil(mergeRowIndex, mergeColumeIndex)).build();
    
        return build;
    }
    

    4、业务代码

       try {
                //需要合并的列
                int[] mergeColumeIndex = {0,4,5,6,7,8,9,10};
                // 从那一行开始合并
                int mergeRowIndex = 1;
                //先执行合并策略
                excelWriter = ExcelUtil.getExcelWriterMerge(response, fileName, mergeRowIndex, mergeColumeIndex);
                //业务代码
                for (int i = 0 ; i < totalPage;i++){
                    selectOrderDto.setPageNum(i);
                    selectOrderDto.setPageSize(10000);
                    String sheetName = "sheet"+i;
                    PageInfo<ShowOrderByKitchen> page = selectOrderByKitchenId(selectOrderDto);
                    List<ShowOrderByKitchen> list = page.getList();
                    if (!list.isEmpty()){
                    //进行写入操作
                        WriteSheet sheetWriter = EasyExcel.writerSheet(i,sheetName).head(ShowOrderByKitchen.class).build();
                        excelWriter.write(list,sheetWriter);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
                log.error("导出订单失败,{}",e);
            }finally {
                // 千万别忘记finish 会帮忙关闭流
                if (excelWriter != null) {
                    excelWriter.finish();
                }
            }
        }
    

    5、实体

    public class ShowOrderByKitchen implements Serializable {
    
    @ExcelProperty(value = "编码",index = 0)
    private String orderId;
    
    @ExcelProperty(value = "名称",index = 1)
    private String dishName;
    
    @ExcelProperty(value = "价格",index = 2)
    private BigDecimal dishPrice;
    
    @ExcelProperty(value = "数量",index = 3)
    private Integer dishNumber;
    

    }

    6、测试结果

    嗯呐
    这是根据订单号进行合并,工具类里进行两次判断,合并后就会呈现正确的格式,建议根据哪一列数据合并,就将这列数据放在excel的第一列,否则会出现空指针异常。

    展开全文
  • EasyExcel 动态导出指定

    万次阅读 2021-07-21 15:32:15
    指定列动态导出导出的基础上,添加导出字段,可实现动态导出数据 根据官方文档,有两种导出方式,一种需要手动关闭文件流,一种自动关闭文件流,在此我选择自动关闭文件流的方式。 ExcelWriterBuild

    EasyExcel使用

    EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。

    官方文档写的非常详细:EasyExcel · 语雀

    GitHub:https://github.com/alibaba/easyexcel


    指定列动态导出

    在导出的基础上,添加导出字段,可实现动态导出数据

    根据官方文档,有两种导出方式,一种需要手动关闭文件流,一种自动关闭文件流,在此我选择自动关闭文件流的方式。

        ExcelWriterBuilder excelBuilder = EasyExcel.write(response.getOutputStream(), ExcelUserDTO.class);
        excelBuilder = includeColumnFiledName(includeColumnFiledNames, excelBuilder);
        excelBuilder.sheet("sheet").doWrite(data());
    

    指定列动态导出关键代码:

    
        private ExcelWriterBuilder includeColumnFiledName(Set<String> includeColumnFiledNames, ExcelWriterBuilder excelBuilder) {
            excelBuilder = excelBuilder.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy());
            if (includeColumnFiledNames.size() > 0) {
                excelBuilder = excelBuilder.includeColumnFiledNames(includeColumnFiledNames);
            }
            excelBuilder = excelBuilder.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy());
            return excelBuilder;
        }
    

    复杂表头制作

    EasyExcel复杂表制作也非常简单,使用@ExcelProperty注解

    展开全文
  • 教你用EasyExcel导出包含图片的excel 前情概要 众所周知,导入及导出功能在后台服务中很常见,博主目前参与的这个项目就有多Excel的导入和导出,但是在我昨天完成需求的时候,突然发现项目里目前的Excel工具类...

    教你用EasyExcel导出包含图片列的excel

    在这里插入图片描述

    前情概要

    众所周知,导入及导出功能在后台服务中很常见,博主目前参与的这个项目就有多Excel的导入和导出,但是在我昨天完成需求的时候,突然发现项目里目前的Excel工具类无法满足的我的业务需求。
    所以在参考EasyExcel官方文档的情况下,昨天经历千辛万苦完成了Excel中某几列是图片的导出(原谅我是个菜b)。

    正文来啦

    首先需要导入EasyExcel的maven依赖:

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>easyexcel</artifactId>
        <version>${easyexcel.version}</version>
    </dependency>
    

    版本选最新的即可,我这里添加了版本的集中控制。

    然后打开www.baidu.com搜索EasyExcel官方文档,找到快速开始写Excel那一栏:

    这就是官方给我的demo,已经很详细了,然后我们找到图片导出这个功能:

    根据文档提示,我们需要编写Excel对应的实体类:

    @Data
    @ContentRowHeight(15)
    @HeadRowHeight(25)
    @ColumnWidth(25)
    @Accessors(chain = true)
    public class ExportInspectionModel {
    
        /**
         * 检测名称
         */
        @ExcelProperty(value = "检验名称")
        private String inspectionName;
    
        /**
         * 施工单位
         */
        @ExcelProperty(value = "检验名称")
        private String constructionOrganization;
        /**
         * 见证人id
         */
        @ExcelProperty(value = "见证人")
        private String userName;
    
    
        /**
         * 检验类型:1:平行检验;2:见证检验。
         */
        @ExcelProperty(value = "检验类型")
        private String inspectionType;
        /**
         * 项目id
         */
        @ExcelProperty(value = "项目名称")
        private String projectName;
        /**
         * 检验报告url
         */
        @ExcelProperty(value = "报告",converter = UrlImageConverter.class)
        @ColumnWidth(60)
        private URL inspectionReportUrl;
        /**
         * 创建时间
         */
        @ExcelProperty(value = "创建时间",converter = LocalDateTimeConverterUtil.class)
        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
        private LocalDateTime createTime;
    
    
    

    然后就需要我们编写自己的业务数据查询逻辑了,如果只是普通的数据导出,可以不用像我这么复杂,直接把查询到的数据转换为ExcelModelList集合即可。然后调用:

    ServletOutputStream outputStream = response.getOutputStream();
    EasyExcel.write(outputStream, ExportInspectionModel.class).sheet().doWrite(excelModelList);
    

    但是由于我这个需求导出数据列表包含图片,就不能这么操作了。
    这是官方文档给出的5种数据格式的图片导出类型:

    @Data
    @ContentRowHeight(100)
    @ColumnWidth(100 / 8)
    public class ImageData {
        private File file;
        private InputStream inputStream;
        /**
         * 如果string类型 必须指定转换器,string默认转换成string
         */
        @ExcelProperty(converter = StringImageConverter.class)
        private String string;
        private byte[] byteArray;
        /**
         * 根据url导出
         *
         * @since 2.1.1
         */
        private URL url;
    }
    

    由于我们项目数据库保存的是图片的url,所以我选择了最后一种方式进行图片的导出,也就是根据URL导出。
    在这里有一个注意点:实体类的图片url是String类型,需要转换为URL类型。

    setInspectionReportUrl(new URL(experimentalInspection.getInspectionReportUrl()))
    

    完成这些以后,就可以进行导出的测试了。这里是我进行测试的结果,就是图片宽高有点不合适,稍微调试即可。

    展开全文
  • EasyExcel导出

    2020-07-29 14:29:57
    导入依赖 <dependency>...easyexcel</artifactId> <version>2.1.6</version> </dependency> 导出 Controller import javax.servlet.http.HttpServletResponse; /** * 导出

    导入依赖

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>easyexcel</artifactId>
        <version>2.1.6</version>
    </dependency>
    

    导出

    Controller

    import javax.servlet.http.HttpServletResponse;
    
    /**
     * 导出数据
     * @param response response
     * @return result
     * @author liu
     */
    @GetMapping("exportExcelData")
    public Result exportExcelData(HttpServletResponse response) {
        service.exportExcelData(response);  
        return Result.ok();
    }
    

    Service

    import javax.servlet.http.HttpServletResponse;
    
    /**
     * 导出数据
     * @param response response
     * @author liu
     */
     void exportExcelData(HttpServletResponse response);
    

    ServiceImpl

    import javax.servlet.http.HttpServletResponse;
    
    @Override
    public void exportExcelData(HttpServletResponse response) {
        String fileName = "数据信息";
    	String sheetName = "数据信息";
    	/**  数据库查询数据并处理 */
    	List<ExcelData> dataList = mapper.exportExcelData(); //返回数据信息
    	
    	List<ExcelData> list = new ArrayList<>();
        
        for (ExcelData excelData : dataList) {
    		ExcelData excelPlanData = ExcelData.builder()
    		        .id(excelData.getId)
    		        .name(excelData.getName)
    		        .age(excelData.getAge)
    		        .sex(excelData.getSex).build();
    		list.add(excelPlanData);
        }
        try {
        	ExcelUtil.writeExcel(response,list,fileName,sheetName,ExcelData.class);	
        } catch (Exception e) {
        	e.printStackTrace();	
        }
    	
    }
    

    Model

    import com.alibaba.excel.annotation.ExcelProperty;
    import lombok.Builder;
    import lombok.Data;
    
    /**
     * 数据导出实体类
     * @author liu
     */
    @Data
    @Builder
    public class ExcelData {
    	
    	/**
    	 * id
    	 */
    	//导出的Excel标头信息,以及所在第几列
    	@ExcelProperty(value = "id", index = 0)  
    	private Integer id;
    
    	/**
    	 * 姓名
    	 */
    	@ExcelProperty(value = "姓名", index = 1) 
    	private String name;
    
    	/**
    	 * 年龄
    	 */
    	@ExcelProperty(value = "年龄", index = 2) 
    	private Integer age;
    
    	/**
    	 * 性别
    	 */
        @ExcelProperty(value = "性别", index = 3) 
    	private String sex;
    }
    

    ExcelUtil

    import com.alibaba.excel.EasyExcel;
    import com.alibaba.excel.support.ExcelTypeEnum;
    import com.alibaba.excel.write.metadata.style.WriteCellStyleStrategy;
    
    import java.io.OutputStream;
    import java.net.URLEncoder;
    import java.util.List;
    
    import javax.servlet.http.HttpServletResponse;
    import org.apache.poi.ss.usermodel.HorizontalAlignment;
    
    /**
     * 导出工具类
     * @author liu
     */
    public class ExcelUtil {
    	
        /**
    	 * 导出
    	 * @param response response
    	 * @param data data
    	 * @param fileName fileName
    	 * @param sheetName sheetName
    	 * @param clazz clazz
         */
        public static void writeExcel(HttpServletResponse response,List<? extends Object> data, 
                String fileName,String sheetName,Class clazz) {
            //表头样式
            WriteCellStyle headWriteCellStyle = new WriteCellStyle();
     		//设置表头居中对齐
     		headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
     		//内容样式
     		WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
     		//设置内容靠左对齐
     		contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.LEFT);
     		HorizontalCellStyleStrategy horizontalCellStyleStrategy = 
     		        new HorizontalCellStyleStrategy(headWriteCellStyle,contentWriteCellStyle);
     		try {
    		    EasyExcel.write(getOutputStream(fileName,response),clazz)
    		 	        .excelType(ExcelTypeEnum.XLSX)
    		 	        .sheet(sheetName)
    		 	        .registerWriteHandler(horizontalCellStyleStrategy)
    		 	        .doWrite(data);
    		} catch (Exception e) {
    		    e.printStackTrace();
    		}
        }
        
        /**
         * 格式
         * @param fileName fileName
         * @param response response
         * @throws Exception exception
         * @author liu
         * @return java.io.OutputStream 
         */ 
        private static OutputStream getOutputStream(String fileName,HttpServletResponse response) throws Exception {
            fileName = URLEncoder.encode(fileName,"UTF-8");
            response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding("utf8");
            response.setHeader("Content-Disposition", "attachment;filename=" + ".xlsx");
            return response.getOutputStream();
        }
    }
    
    展开全文
  • easyexcel</artifactId> <version>1.1.2-beta5</version> </dependency> 2、 1、动态头,实时生成头写入 2、先创建List头格式的sheet仅仅写入头,然后通过table 不写
  • EasyExcel导出excel

    2020-06-27 18:43:23
    EasyExcel导出excel 1.首先建立一个实体类 public class ExcelMode extends BaseRowModel { @ExcelIgnore //excel中不导出字段 private Integer id; @ExcelProperty(value = "姓名" ,index = 0) private String ...
  • easyExcel导出excel时指定样式

    千次阅读 2020-12-01 20:55:09
    java POI生成excel设置格式并写入文件 SpringBoot项目 easyexcel 给单元格设置格式,通过自定义注解方式实现对每一格式的精确控制 java使用poi自定义excel标题头并导出(springmvc+poi) springboot+poi导出指定...
  • 在业务开发过程中,出现如下需求:在一条记录中,存在多条内容数据,此时导出excel表格时,则需要对同一条记录中的数据进行处理。如下图 easyexcel的引入 <dependency> <groupId>com.alibaba</...
  • java easyexcel 导出 excel

    2020-10-31 14:45:49
    java easyexcel 导出 excel 1 简介 EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。 2 环境 springboot + idea 3 引入pom文件 <dependency> <...
  • easyexcel 动态导出复杂表头 例子 带cellRange
  • EasyExcel导出并下载

    2021-01-02 16:57:53
    第一步:添加依赖 <dependency> <groupId>.../groupId>...说明:阿里easyexcel导出excel文件的思路: 和管理后台普通的查询列表一样,设计Api需要具备按条件查询的功能特性 按条件查询
  • EasyExcel 动态表头 导出 ,非注解,后台导出, 可分页,可限制每页显示行数,依赖 com.alibaba easyexcel
  • 使用easyExcel导出

    2020-09-13 10:34:19
    参考博文 https://www.yuque.com/easyexcel/doc/fill ...1、常规导出(不合并表头的) public void exportExcel(HttpServletRequest request, HttpServletResponse response, Map<String, Ob
  • EasyExcel导出某列为空解决方法

    千次阅读 2020-09-07 18:26:53
    EasyExcel导出某列为空easyExcel对数据进行导出,导出某列为空 easyExcel对数据进行导出,导出某列为空 easyExcel中对于属性命名为强制驼峰模式,当具有明确意义时可以识别 winRoomId 获胜房间号 当具有模糊意义时...
  • 使用EasyExcel导出的数据做合并表格 前面的引用以及导出就不过多的复写了,不会的不清楚的可以自行百度,这里主要说一下对数据进行数据合并。 首先, 需要得到要合并列的下标数组。 //需要做合并单元格,对应的...
  • EasyExcel 动态合并

    千次阅读 2020-09-16 10:06:59
    package com.ksec.eicp.crmc.listener.easyexcel; import cn.hutool.core.util.StrUtil; import com.alibaba.excel.write.handler.AbstractRowWriteHandler; import ...
  • easyExcel 导出 excel 自定义表头 效果图: 代码: @RequestMapping(value = "export",method = RequestMethod.GET) public void export(HttpServletResponse response,Integer yds,Integer sds,String type) throws...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,344
精华内容 537
关键字:

easyexcel导出动态列