精华内容
下载资源
问答
  • 合并表头
    千次阅读
    2022-04-16 23:13:49

    maven依赖

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

    数据结构与element表格数据结构类似
    多级表头使用children渲染
    合并行或列通过cols和rows控制

    关键代码

    try (OutputStream out = new FileOutputStream(file)) {
    EasyExcel.write(out).head(excelHead(tableVO.getTableHead())).sheet("Sheet1")
                .registerWriteHandler(new MyMergeStrategy(tableVO))//自定义合并单元格
                .registerWriteHandler(new CustomCellWriteUtil())//表头宽度自适应
                .doWrite(excelData(tableVO));
    } catch (IOException e) {
        e.printStackTrace();
    }
    
    /**
    * 创建表头,这里会自动合并表头
     *
     * @return
     */
    private List<List<String>> excelHead(List<TableHeadVO> headVOS) {
        boolean needMerge = false;
        for (TableHeadVO headVO : headVOS) {
            if (CollectionUtils.isNotEmpty(headVO.getChildren())) {
                needMerge = true;
            }
        }
        List<List<String>> headList = new ArrayList<>();
        for (TableHeadVO headVO : headVOS) {
            if (CollectionUtils.isNotEmpty(headVO.getChildren())) {
                headVO.getChildren().forEach(child -> {
                    List<String> head = new ArrayList<>();
                    head.add(headVO.getLabel());
                    head.add(child.getLabel());
                    headList.add(head);
                });
            } else {
                List<String> head = new ArrayList<>();
                head.add(headVO.getLabel());
                if (needMerge) {
                    head.add(headVO.getLabel());
                }
                headList.add(head);
            }
        }
        return headList;
    }
    

    创建数据

    /**
     * 创建数据
     *
     * @return
     */
    private List<List<Object>> excelData(TableVO tableVO) {
        int maxExcel = 32767;
        List<List<Object>> list = new ArrayList<>();
        if (Objects.isNull(tableVO) || CollectionUtils.isEmpty(tableVO.getTableData())) {
            return list;
        }
        List<TableHeadVO> heads = tableVO.getTableHead();
        for (Map<String, Object> map : tableVO.getTableData()) {
            List<Object> data = new ArrayList<>();
            for (TableHeadVO head : heads) {
                if (CollectionUtils.isNotEmpty(head.getChildren())) {
                    head.getChildren().forEach(child -> {
                        Object value = map.get(child.getProp());
                        if ((value + "").length() >= maxExcel) {
                            data.add((value + "").substring(0, 255) + "字符过长");
                        } else {
                            data.add(value);
                        }
                    });
                } else {
                    Object value = map.get(head.getProp());
                    if ((value + "").length() >= maxExcel) {
                        data.add((value + "").substring(0, 255) + "字符过长");
                    } else {
                        data.add(value);
                    }
                }
            }
            list.add(data);
        }
        return list;
    }
    

    表格数据

    import io.swagger.annotations.ApiModelProperty;
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    import java.util.List;
    import java.util.Map;
    
    @NoArgsConstructor
    @AllArgsConstructor
    @Data
    public class TableVO {
        @ApiModelProperty("表头信息")
        private List<TableHeadVO> tableHead;
        @ApiModelProperty("表格数据信息")
        private List<Map<String, Object>> tableData;
        @ApiModelProperty("总数据")
        private long total;
        @ApiModelProperty("总页数")
        private long totalPage;
        @ApiModelProperty("当前页:从1开始")
        private long pageIndex;
        @ApiModelProperty("页大小")
        private long pageSize;
    
        public TableVO(List<TableHeadVO> tableHead, List<Map<String, Object>> tableData) {
            this.tableHead = tableHead;
            this.tableData = tableData;
        }
    
        public static TableVO of(PageResult result) {
            TableVO tableVO = new TableVO();
            tableVO.setPageIndex(result.getPageIndex());
            tableVO.setPageSize(result.getPageSize());
            tableVO.setTotal(result.getTotalCount());
            tableVO.setTotalPage(result.getTotalPage());
            return tableVO;
        }
    }
    

    表头对象

    
    import io.swagger.annotations.ApiModel;
    import io.swagger.annotations.ApiModelProperty;
    import lombok.AllArgsConstructor;
    import lombok.Builder;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    import java.util.List;
    
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    @ApiModel("表头")
    @Data
    public class TableHeadVO {
        @ApiModelProperty("是否合并")
        private boolean merge = true;
        @ApiModelProperty("表格的字段")
        private String prop;
        @ApiModelProperty("表格字段名称")
        private String label;
        @ApiModelProperty("字段类型:input,textarea,number,radio,checkbox,time,date,rate,color,select,switch,slider,text,link,imgupload,fileupload,table,grid,report,divider")
        private String type;
        @ApiModelProperty("是否为导出excel字段")
        private Boolean excel;
        @ApiModelProperty("宽度")
        private String width;
        @ApiModelProperty("后台自定义")
        private Boolean custom = false;
        @ApiModelProperty("子表单")
        private List<TableHeadVO> children;
    
        public TableHeadVO(String prop, String label) {
            this.prop = prop;
            this.label = label;
            this.type = "input";
            this.excel = true;
            this.width = "auto";
        }
    }
    
    

    最效果
    在这里插入图片描述

    数据合并

    
    import com.alibaba.excel.metadata.Head;
    import com.alibaba.excel.write.merge.AbstractMergeStrategy;
    import lombok.extern.slf4j.Slf4j;
    import org.apache.commons.collections4.CollectionUtils;
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.Sheet;
    import org.apache.poi.ss.util.CellRangeAddress;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    
    @Slf4j
    public class MyMergeStrategy extends AbstractMergeStrategy {
        //合并坐标集合
        private List<CellRangeAddress> cellRangeAddresses;
    
        public MyMergeStrategy(TableVO tableVO) {
            List<CellRangeAddress> list = new ArrayList<>();
    
            // 判断是否需要合并,需要合并的再构造合并的地址
            boolean needMerge = false;
            for (TableHeadVO headVO : tableVO.getTableHead()) {
                if (CollectionUtils.isNotEmpty(headVO.getChildren())) {
                    needMerge = true;
                }
            }
            if (needMerge) {
                // 重新定义head
                List<TableHeadVO> heads = new ArrayList<>();
                for (TableHeadVO headVO : tableVO.getTableHead()) {
                    if (CollectionUtils.isNotEmpty(headVO.getChildren())) {
                        for (TableHeadVO child : headVO.getChildren()) {
                            heads.add(child);
                        }
                    } else {
                        heads.add(headVO);
                    }
                }
                if (CollectionUtils.isNotEmpty(tableVO.getTableData())) {
                    for (int i = 0; i < tableVO.getTableData().size(); i++) {
                        Map<String, Object> data = tableVO.getTableData().get(i);
                        System.out.println("第" + i + "行数据" + data);
    
                        for (int j = 0; j < heads.size(); j++) {
                            TableHeadVO head = heads.get(j);
    
                            int cols = (int) data.getOrDefault("cols", 1);
                            int rows = (int) data.getOrDefault("rows", 1);
                            // 判断有没有孩子,有孩子的不用合并,没孩子的都要合并,根据所占列数合并
                            if (rows > 1 && head.isMerge()) {
                                System.out.print(head.getLabel());
                                log.info("{}, {} , {}, {}", i + 1 + 1, i + 1 + rows, j, j);
                                // row 行,col列
                                // int firstRow, int lastRow, int firstCol, int lastCol
                                CellRangeAddress item = new CellRangeAddress(i + 1 + 1, i + 1 + rows, j, j);
                                list.add(item);
                            }
                        }
                        System.out.println();
                    }
                }
            }
    
            this.cellRangeAddresses = list;
        }
    
        /**
         * 合并操作:对每个单元格执行!!!
         *
         * @param sheet            sheet对象
         * @param cell             当前单元格
         * @param head             表头对象
         * @param relativeRowIndex 相关行索引
         */
        @Override
        protected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) {
            /*
             * 合并单元格
             *
             * 由于merge()方法会在写每个单元格(cell)时执行,因此需要保证合并策略只被添加一次。否则如果每个单元格都添加一次
             * 合并策略,则会造成重复合并。例如合并A2:A3,当cell为A2时,合并A2:A3,但是当cell为A3时,又要合并A2:A3,而此时
             * 的A2已经是之前的A2和A3合并后的结果了。
             * 由于此处的表头占了两行,因此数据单元格是从(2, 0)开始的,所以就对这个单元格(cell.getRowIndex() == 2 && cell.getColumnIndex() == 0)
             * 添加一次合并策略就可以了。如果表头只有一行,则判断条件改为「cell.getRowIndex() == 1 && cell.getColumnIndex() == 0」就可以了。
             */
            if (cell.getRowIndex() == 2 && cell.getColumnIndex() == 0) {
                for (CellRangeAddress item : cellRangeAddresses) {
                    sheet.addMergedRegion(item);
                }
            }
    
            /*
             * 如果不作判断,可以使用addMergedRegionUnsafe()方法,
             * 这样生成的Excel文件可以打开,只是打开时会提示内容有问题,修复后可以打开
             */
            // for (CellRangeAddress item : cellRangeAddresses) {
            //     sheet.addMergedRegionUnsafe(item);
            // }
        }
    }
    
    

    列宽自适应

    
    import com.alibaba.excel.enums.CellDataTypeEnum;
    import com.alibaba.excel.metadata.Head;
    import com.alibaba.excel.metadata.data.CellData;
    import com.alibaba.excel.metadata.data.WriteCellData;
    import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
    import com.alibaba.excel.write.style.column.AbstractColumnWidthStyleStrategy;
    import org.apache.poi.ss.usermodel.Cell;
    
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    /**
     * excel自适应列宽 拉过去就能直接套用自动适应列宽
     */
    public class CustomCellWriteUtil extends AbstractColumnWidthStyleStrategy {
        private Map<Integer, Map<Integer, Integer>> CACHE = new HashMap(8);
    
        public CustomCellWriteUtil() {
        }
    
        protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
            boolean needSetWidth = isHead;
            if (needSetWidth) {
                Map<Integer, Integer> maxColumnWidthMap = CACHE.get(writeSheetHolder.getSheetNo());
                if (maxColumnWidthMap == null || maxColumnWidthMap.isEmpty()) {
                    maxColumnWidthMap = new HashMap(16);
                    CACHE.put(writeSheetHolder.getSheetNo(), maxColumnWidthMap);
                }
    
                Integer columnWidth = this.dataLength(cellDataList, cell, true);
                if (columnWidth >= 0) {
                    if (columnWidth > 255) {
                        columnWidth = 255;
                    }
                    Integer maxColumnWidth = (Integer) ((Map) maxColumnWidthMap).get(cell.getColumnIndex());
                    if (maxColumnWidth == null || columnWidth > maxColumnWidth) {
                        ((Map) maxColumnWidthMap).put(cell.getColumnIndex(), columnWidth);
                        writeSheetHolder.getSheet().setColumnWidth(cell.getColumnIndex(), (int) ((columnWidth + 0.72) * 256));
                    }
                }
            }
        }
    
        private Integer dataLength(List<WriteCellData<?>> cellDataList, Cell cell, Boolean isHead) {
            if (isHead) {
                return cell.getStringCellValue().getBytes().length;
            } else {
                CellData cellData = cellDataList.get(0);
                CellDataTypeEnum type = cellData.getType();
                if (type == null) {
                    return -1;
                } else {
                    switch (type) {
                        case STRING:
                            return cellData.getStringValue().getBytes().length;
                        case BOOLEAN:
                            return cellData.getBooleanValue().toString().getBytes().length;
                        case NUMBER:
                            return cellData.getNumberValue().toString().getBytes().length;
                        default:
                            return -1;
                    }
                }
            }
        }
    }
    

    参考文献

    easyexcel(十一):easyexcel动态表头,表头合并
    EasyExcel 动态表头 + 数据单元格合并

    更多相关内容
  • C#语言WinForm框架下DataGridView合并表头列头和单元格示例,WPF下也可参考应用
  • VS2012 DevExpress gridcontrol 的表头合并、冻结列、合并行的操作案例。
  • asp.net 导入excel时,处理合并表头、复杂表头、多行表头 1.解决复杂表头的Excel导入。可以解决任何复杂的表头。 2.导入时,显示请稍后。。。提醒框,完毕后会自动隐藏 3.全面扫描Excel数据,将所有异常详细信息写入...
  • dev空间中GridControl自定义添加列以及不规则列头处理,涉及到列头分组问题
  • 本资源涵盖多维合并表头及如何将多维表导出至EXCEL,资源为源码范例,易懂易用,希望需要的人得到帮助
  • jqGrid合并表头

    2021-08-21 22:07:23
    这里写自定义目录标题jqGrid合并表头引入jqGrid这是我本地自己定义的数据插入数据核心设置最终效果 jqGrid合并表头 引入jqGrid (ps:要使用合并表头功能最低版本库貌似最低为4.3(再ps:错了勿喷),之前我使用4.0.0报错...

    刚入职新公司,负责的第一个项目就是前后端不分离的后台管理项目;其中使用的表格框架就是jqGrid,特此记录;(前后端不分离调试起来是真的抓狂!!)

    不浪费各位时间,先上效果图:

    在这里插入图片描述这是我在本地方便调试运行的,数据都是假数据;

    引入jqGrid

    请添加图片描述
    (ps:要使用合并表头功能最低版本库貌似最低为4.3(再ps:错了勿喷),之前我使用4.0.0报错;)

    这是我本地自己定义的数据

    在这里插入图片描述

    插入数据

    在这里插入图片描述ps:(清注意name值)

    核心设置

    在这里插入图片描述
    注意要调用jqGrid的‘setGroupHeaders’方法;
    startColumnName属性:设置的是从colModel中的哪条name属性开始合并;
    numBerOfColunms属性:设置合并的单元格数量;
    titleText:设置的是什么请直接看最终效果图!!

    最终效果

    在这里插入图片描述刚开始写,写的不好勿喷!!

    展开全文
  • c("Index", "Main X Sub A", "Main X Sub B", "Main Y Sub A", "Main Y Sub B", "Main Z Sub A", "Main Z Sub B"), row.names = c(NA, -9L), class = "data.frame") 但是,我想合并顶部标题以实现此输出(如png或pdf)...

    我目前正在使用以下方法创建表格图像:

    SummaryTable

    index,

    xa,

    xb,

    ya,

    yb,

    za,

    zb

    )

    names(SummaryTable)

    "Main X Sub A",

    "Main X Sub B",

    "Main Y Sub A",

    "Main Y Sub B",

    "Main Z Sub A",

    "Main Z Sub B")

    tt

    tbl

    grid.arrange(tbl,as.table=TRUE)

    带输出:

    CWHHg.png

    使用dput(SummaryTable):

    structure(list(Index = 0:8, `Main X Sub A` = c(1, 0.69, 0.61,

    0.56, 0.5, 0.44, 0.4, 0.36, 0.33), `Main X Sub B` = c(0.86, 0.62,

    0.51, 0.42, 0.36, 0.31, 0.27, 0.24, 0.23), `Main Y Sub A` = c(1,

    0.8, 0.74, 0.68, 0.63, 0.56, 0.52, 0.47, 0.43), `Main Y Sub B` = c(0.86,

    0.77, 0.67, 0.59, 0.53, 0.47, 0.43, 0.39, 0.36), `Main Z Sub A` = c(0,

    0.17, 0.23, 0.27, 0.33, 0.37, 0.42, 0.46, 0.49), `Main Z Sub B` = c(0,

    0.24, 0.33, 0.42, 0.48, 0.55, 0.6, 0.64, 0.66)), .Names = c("Index",

    "Main X Sub A", "Main X Sub B", "Main Y Sub A", "Main Y Sub B",

    "Main Z Sub A", "Main Z Sub B"), row.names = c(NA, -9L), class = "data.frame")

    但是,我想合并顶部标题以实现此输出(如png或pdf):

    OsKWm.png

    此表是在Excel中创建的. X,Y和Z在合并的单元格内.

    有人能够协助合并细胞的方法吗?

    展开全文
  • 引入jar com.alibaba  easyexcel 2.2.6 一实现表头合并,表格展示大小及样式简单处理,实现效果如下图所示: 1.1生成表头和数据 1.1.1control层 @ResultAnnotation(moduleName = EModule.PLSFLD_JTGXLD, operateType...

    引入jar

       <!--引入 阿里的  easyexcel  如果报错 需要引入  asm   jar-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>easyexcel</artifactId>
                  <version>2.2.6</version>
            </dependency>


     一实现表头合并,表格展示大小及样式简单处理,实现效果如下图所示:

     

    1.1生成表头和数据

    1.1.1control层

    @ResultAnnotation(moduleName = EModule.PLSFLD_JTGXLD, operateType = EOperate.SEARCH, description = "家庭关系落地(单个或批量)导出",operateLogger = false)
    @ApiOperation(value = "家庭关系落地(单个或批量)-导出")
    @ApiResponses(value = {@ApiResponse(code = 200, message = "请求成功", response = PageResult.class)})
    @GetMapping("/exportPlSfldJtgxld")
    public void exportPlSfldJtgxld(HjdQuery hjdQuery, HttpServletResponse response)throws IOException {
        try{
            String date = DateUtil.format(new Date(), DatePattern.PURE_DATE_PATTERN);
            String fileName = "家庭关系落地" + "-" + date +".xlsx";
            this.resolveResponse(response, fileName);
    
            ServletOutputStream outputStream = response.getOutputStream();
            plsfldJtgxService.exportPlSfldHj(hjdQuery,outputStream);
        }catch (Exception e){
            log.error("下载文件失败",e);
            this.resetResponse(response,e);
        }
    }
    
    private void resolveResponse(HttpServletResponse response, String fileName){
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        String encodeFileName = URLEncoder.createDefault().encode(fileName, StandardCharsets.UTF_8);
        response.setHeader("Content-disposition", "attachment;filename=" + encodeFileName);
        response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
    }
    private void resetResponse(HttpServletResponse response, Exception exception)throws IOException {
        // 重置response
        response.reset();
        response.setContentType("application/json");
        response.setCharacterEncoding("utf-8");
        PageResult pageResult = PageResult.failed("下载文件失败," + exception.getMessage());
        response.getWriter().println(JSON.toJSONString(pageResult));
    }

    1.1.2service层

    List<ExportJtgxldVo> listExport = new ArrayList<ExportJtgxldVo>();
            dataExportTransport(listExport,list);
            EasyExcel.write(outputStream,ExportJtgxldVo.class).head(head()).sheet("Sheet1")
                    .registerWriteHandler(new MyMergeStrategy())//自定义合并 单元格
                    .registerWriteHandler(createTableStyle())
    //                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
                    .doWrite(listExport);//数据

    private static WriteHandler createTableStyle() {
        // 头的策略
        WriteCellStyle headWriteCellStyle = new WriteCellStyle();
        // 背景
        headWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
        // 设置字体
        WriteFont headWriteFont = new WriteFont();
        headWriteFont.setFontHeightInPoints((short) 14);
        headWriteCellStyle.setWriteFont(headWriteFont);
        // 内容的策略
        WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
        // 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND 不然无法显示背景颜色.头默认了 FillPatternType所以可以不指定
        contentWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
        // 背景
        contentWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
        contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        WriteFont contentWriteFont = new WriteFont();
        // 字体大小
        contentWriteFont.setFontHeightInPoints((short) 13);
        contentWriteCellStyle.setWriteFont(contentWriteFont);
        // 设置边框的样式
        contentWriteCellStyle.setBorderBottom(BorderStyle.DASHED);
        contentWriteCellStyle.setBorderLeft(BorderStyle.DASHED);
        contentWriteCellStyle.setBorderRight(BorderStyle.DASHED);
        contentWriteCellStyle.setBorderTop(BorderStyle.DASHED);
        // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现
        HorizontalCellStyleStrategy horizontalCellStyleStrategy =
                new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
        return horizontalCellStyleStrategy;
    }
    /**
     * 创建表头
     * @return
     */
    private static List<List<String>> head() {
        List<List<String>> list = new ArrayList<List<String>>();
        List<String> head0 = new ArrayList<String>();
        head0.add("序号");
        List<String> head1 = new ArrayList<String>();
        head1.add("姓名");
        List<String> head2 = new ArrayList<String>();
        head2.add("查询线索:身份证号");
        List<String> head3 = new ArrayList<String>();
        head3.add("户号");
        List<String> head4 = new ArrayList<String>();
        head4.add("关联结果");
        List<String> head5 = new ArrayList<String>();
        head5.add("户籍地址");
        list.add(head0);
        list.add(head1);
        list.add(head2);
        list.add(head3);
        list.add(head4);
        list.add(head5);
        return list;
    }
    

    1.1.3entity

    import com.alibaba.excel.annotation.ExcelProperty;
    import com.alibaba.excel.annotation.write.style.ColumnWidth;
    import lombok.Data;
    
    /**
     * @Author:sunyuanquan
     * @Description:家庭关系落地
     * @Date:Created in 10:17 2022/3/13
     */
    @Data
    public class ExportJtgxldVo {
    
        @ExcelProperty("序号")
        @ColumnWidth(6)
        private String xh;
    
        @ExcelProperty("姓名")
        @ColumnWidth(10)
        private String name;
    
        @ExcelProperty("查询线索:身份证号")
        @ColumnWidth(25)
        private String sfzh;
    
        @ExcelProperty("户号")
        @ColumnWidth(16)
        private String hh;
    
        @ExcelProperty("关联结果")
        @ColumnWidth(10)
        private String nameR;
    
        @ExcelProperty("关联结果")
        @ColumnWidth(25)
        private String sfzhR;
    
        @ExcelProperty("关联结果")
        @ColumnWidth(20)
        private String hzgxR;
    
        @ExcelProperty("关联结果")
        @ColumnWidth(23)
        private String phoneR;
    
        @ExcelProperty("户籍地详细地址")
        @ColumnWidth(40)
        private String hjdxxdz;
    
    }
    

    二测试
    2.1生成表头和数据

    import com.alibaba.excel.EasyExcel;
    import com.alibaba.excel.write.handler.WriteHandler;
    import com.alibaba.excel.write.metadata.style.WriteCellStyle;
    import com.alibaba.excel.write.metadata.style.WriteFont;
    import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
    import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
    import com.surfilter.business.plsfld.entity.vo.ExportJtgxldVo;
    import org.apache.poi.ss.usermodel.BorderStyle;
    import org.apache.poi.ss.usermodel.FillPatternType;
    import org.apache.poi.ss.usermodel.IndexedColors;
    import org.apache.poi.ss.usermodel.VerticalAlignment;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    
    /**
     * @Author:
     * @Description:
     * @Date:Created in 15:08 2022/3/13
     */
    public class test {
        public static void main(String[] args) {
            // 写法1
            String fileName = "D:\\" + System.currentTimeMillis() + ".xlsx";
            // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
            EasyExcel.write(fileName,ExportJtgxldVo.class).head(head()).sheet("Sheet1")
                    .registerWriteHandler(new MyMergeStrategy())//自定义合并 单元格
                    .registerWriteHandler(createTableStyle())
    //                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
                    .doWrite(dataList());
        }
    
        private static WriteHandler createTableStyle() {
            // 头的策略
            WriteCellStyle headWriteCellStyle = new WriteCellStyle();
            // 背景
            headWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
            // 设置字体
            WriteFont headWriteFont = new WriteFont();
            headWriteFont.setFontHeightInPoints((short) 14);
            headWriteCellStyle.setWriteFont(headWriteFont);
            // 内容的策略
            WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
            // 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND 不然无法显示背景颜色.头默认了 FillPatternType所以可以不指定
            contentWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
            // 背景
            contentWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
            contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
            WriteFont contentWriteFont = new WriteFont();
            // 字体大小
            contentWriteFont.setFontHeightInPoints((short) 13);
            contentWriteCellStyle.setWriteFont(contentWriteFont);
            // 设置边框的样式
            contentWriteCellStyle.setBorderBottom(BorderStyle.DASHED);
            contentWriteCellStyle.setBorderLeft(BorderStyle.DASHED);
            contentWriteCellStyle.setBorderRight(BorderStyle.DASHED);
            contentWriteCellStyle.setBorderTop(BorderStyle.DASHED);
            // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现
            HorizontalCellStyleStrategy horizontalCellStyleStrategy =
                    new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
            return horizontalCellStyleStrategy;
        }
        /**
         * 创建表头
         * @return
         */
        private static List<List<String>> head() {
            List<List<String>> list = new ArrayList<List<String>>();
            List<String> head0 = new ArrayList<String>();
            head0.add("序号");
            List<String> head1 = new ArrayList<String>();
            head1.add("姓名");
            List<String> head2 = new ArrayList<String>();
            head2.add("查询线索:身份证号");
            List<String> head3 = new ArrayList<String>();
            head3.add("户号");
            List<String> head4 = new ArrayList<String>();
            head4.add("关联结果");
            List<String> head5 = new ArrayList<String>();
            head5.add("户籍地址");
            list.add(head0);
            list.add(head1);
            list.add(head2);
            list.add(head3);
            list.add(head4);
            list.add(head5);
            return list;
        }
    
        /**
         * 创建数据
         * @return
         */
        private static List<ExportJtgxldVo> dataList() {
            List<ExportJtgxldVo> list = new ArrayList<ExportJtgxldVo>();
            for (int i = 0; i < 10; i++) {
                ExportJtgxldVo exportJtgxldVo = new ExportJtgxldVo();
                exportJtgxldVo.setXh(String.valueOf(i));
                exportJtgxldVo.setName("姓名三");
                exportJtgxldVo.setSfzh("3708321211302519");
                exportJtgxldVo.setHh("1122344");
                exportJtgxldVo.setNameR("姓名三");
                exportJtgxldVo.setSfzhR("3708321992302519");
                exportJtgxldVo.setPhoneR("1846375141");
                exportJtgxldVo.setHzgxR("与户主关系:户主");
                exportJtgxldVo.setHjdxxdz("户籍地址户籍地址户籍地址户籍地址户籍地址户籍地址户籍地址户籍地址");
                list.add(exportJtgxldVo);
            }
            return list;
        }
    }
    

    2.2合并单元格

    import com.alibaba.excel.write.merge.AbstractMergeStrategy;
    import com.alibaba.excel.metadata.Head;
    import org.apache.commons.collections4.CollectionUtils;
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.Sheet;
    import org.apache.poi.ss.util.CellRangeAddress;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * @Author:sunyuanquan
     * @Description:导出合并表头
     * @Date:Created in 15:12 2022/3/13
     */
    public class MyMergeStrategy  extends AbstractMergeStrategy {
        //合并坐标集合
        private List<CellRangeAddress> cellRangeAddresss;
        //构造
        public MyMergeStrategy() {
            List<CellRangeAddress> list = new ArrayList<>();
            //合并 单元格坐标
            CellRangeAddress item1 = new CellRangeAddress(0, 0, 4, 7);
            list.add(item1);
            this.cellRangeAddresss = list;
        }
        /**
         * merge
         * @param sheet
         * @param cell
         * @param head
         * @param relativeRowIndex
         */
        @Override
        protected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) {
            //合并单元格
            /**
             *  ****加个判断:if (cell.getRowIndex() == 1 && cell.getColumnIndex() == 0) {}****
             * 保证每个cell被合并一次,如果不加上面的判断,因为是一个cell一个cell操作的,
             * 例如合并A2:A3,当cell为A2时,合并A2,A3,但是当cell为A3时,又是合并A2,A3,
             * 但此时A2,A3已经是合并的单元格了
             */
            if (CollectionUtils.isNotEmpty(cellRangeAddresss)) {
                if (cell.getRowIndex() == 1 && cell.getColumnIndex() == 0) {
                    for (CellRangeAddress item : cellRangeAddresss) {
                        sheet.addMergedRegionUnsafe(item);
                    }
                }
            }
        }
    }

    2.3合并后单元格效果

    展开全文
  • el-table表头合并,行合并
  • /*** 复合表头的Excel导出工具类 * *@authorliukun *@version1.0 * @date 2020/2/18 20:22*/public classComplexExcelUtils {/*** 导出(目前仅支持两行表头合并操作) *@paramrealName 导出文件名 *@paramdata ...
  • <table id="userList" class="easyui-tab" width="100%"></table> $("#userList").datagrid({ url:'/userManage/sellerManage/sellMessageList', ... nowrap: false,//当数据长度超出列宽..
  • 记录一下首次合并表格。 遇到了很多坑,这是解决后的代码 ui的设计图(也是最终效果啦) element 的table: <div class="category"> <el-table :data="alldata" :span-method="arraySpanMethod...
  • winform datagridview合并表头
  • 合并el-table表头效果呈现
  • element-ui table如何合并表头

    千次阅读 2022-03-14 15:07:44
    el-table 合并表头
  • Ext grid合并表头

    2019-03-22 02:49:47
    NULL 博文链接:https://guozhenqian.iteye.com/blog/1004411
  • el-table合并表头handerMethod

    千次阅读 2021-11-15 17:50:25
    这里主要使用到:header-cell-style="handerMethod"和:span-method="spanMethod"用来合并行和列 主要代码包括: //隐藏表头 handerMethod({ row, column, rowIndex, columnIndex }) { if (row[0].level == 1) .
  • JTable表头合并

    2015-07-30 18:17:39
    JTable表头合并, 很方便使用,swing的控件,下载下来,直接导入工程就可以使用了,接口封装的很好。想要什么样的表头都可以满足你
  • 效果如下,红色圈起来的是一个表头...先说合并表头,主要用到header-cell-style方法 代码只保留了一些相关的,多余的列数据没有贴, <el-table ref="standTable" border :data="standTableList" show-summary
  • table自带合并属性:rowSpan和colSpan,所以合并表头获取所有的表头单元格,针对性的对需要合并的单元格进行操作 如想要合并的是第二列和第三列,那么我们先获取到所有的表头,然后将第二列表头的colSpsn设为2,将...
  • winform(c#) DataGridView控件多维合并表头(有使用教程),从网上下载来的资料并不是很全,所以我自己动手做了个,效果很好,里面附有几个需要注意的地方的文档教程,方面大家掌握运用
  • 首先,DevExpress.XtraGrid的GridControl复合表头或多行表头的示例,界面如下图所示: 实现步骤: 点击GridControl右上角,先选中Show level designer后,将DevExpress的GridControl转换为BandedGridView,具体如...
  • 在使用datagrid的时候,有很多情况下,都需要合并表头,多行表头之类的操作。这就需要我们自定义列了。本文给出一个思路,可以实现此需要,只是本人对这个研究不很明白,只是只是实现,仅此而已...
  • 如果你要实现合并表格单元格,你可以使用以上代码,用一个<el-table-column>把要合并其他列包在里边,效果如下
  • 在使用element-ui中的el-table组件时,怎么自定义合并表头合并行 1、合并相同数据的行 效果图如下,合并相同名称的行 代码如下: data(){ return{ tableData1:[{a:6},{a:12},{a:7},{b:6},{b:7},{c:44}] } }...
  • c#合并表头

    2013-10-14 19:03:15
    c#合并表头合并单元格,就是像Table控件那像合并表头
  • el-table如何动态生成合并表头?场景描述需求分析代码实现 场景描述 在实际开发过程中,部分表头是根据页面中的某个参数动态生成的,常见于报表类; 需求分析 代码实现 <template> <div> <el-...
  • column, rowIndex, columnIndex }) { // 表头合并-第一列和第二列合并一个表头 const X = document.getElementsByClassName('el-table__header')[0].rows[0].cells X[0].colSpan = 2 X[1].style.display = 'none' /...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 47,105
精华内容 18,842
关键字:

合并表头