java中excel合并单元格,easyexcel读取合并单元格

  java中excel合并单元格,easyexcel读取合并单元格

  

目录

pom版本1.自定义合并单元格1.1 不合并单元格1.2 合并单元格1.3 写多个工作表1.4可写表

 

  

pom版本

相关性groupIdcom.alibaba/groupId artifactIdeasyexcel/artifactId版本2 .2 .7/版本/相关性

 

  

1.自定义合并单元格

在某些业务场景中可能会有合并单元格的需求,下面具体来说明如何实现

 

  

1.1 不合并单元格

先来看下不合并单元格的代码写法,简单复习下

 

  公共静态void writeExcel() { //写超过的路径,当前项目路径下string fileName=getPath();//构建excel writer。写(文件名)。excelType(ExcelTypeEnum .XLSX).build();//构建工作表写表写表=简易excel。编写器工作表(模板1).head(DemoData.class).build();//写工作表excelWriter.write(data1()、write sheet);excel writer。finish();}私有静态字符串getPath(){ return system。getproperty(用户。dir))/系统。当前时间毫秒() .xlsx ;}私有静态listmodata data1(){ listmodata list=lists。new ArrayList();for(int I=0;i3;I){ DemoData data=new DemoData();data.setString(字符串 1);数据。set Date(new Date());数据。setdoubledata(0.56);list.add(数据);} for(int I=0;i3;I){ DemoData data=new DemoData();data.setString(字符串 2);数据。set Date(new Date());数据。setdoubledata(0.56);list.add(数据);} for(int I=0;I 4;I){ DemoData data=new DemoData();data.setString(字符串 3);数据。set Date(new Date());数据。setdoubledata(0.57);list.add(数据);}返回列表;}公共静态void main(String[]args){ write excel();}打开输出的超过文件后如下,可以看到单元格没有合并。现在打算将第一列字符串标题相同的合并

  

1.2 合并单元格

//自定义合并策略该类继承了抽象合并策略抽象合并策略,需要重写合并()方法公共静态类自定义合并策略扩展抽象合并策略{ /** *分组,每几行合并一次*/private list integer exportfield group count list;/** * 目标合并列索引*/私有整数targetColumnIndex//需要开始合并单元格

 

  的首行index private Integer rowIndex; // exportDataList为待合并目标列的值 public CustomMergeStrategy(List<String> exportDataList, Integer targetColumnIndex) { this.exportFieldGroupCountList = getGroupCountList(exportDataList); this.targetColumnIndex = targetColumnIndex; } @Override protected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) { if (null == rowIndex) { rowIndex = cell.getRowIndex(); } // 仅从首行以及目标列的单元格开始合并,忽略其他 if (cell.getRowIndex() == rowIndex && cell.getColumnIndex() == targetColumnIndex) { mergeGroupColumn(sheet); } } private void mergeGroupColumn(Sheet sheet) { int rowCount = rowIndex; for (Integer count : exportFieldGroupCountList) { if(count == 1) { rowCount += count; continue ; } // 合并单元格 CellRangeAddress cellRangeAddress = new CellRangeAddress(rowCount, rowCount + count - 1, targetColumnIndex, targetColumnIndex); sheet.addMergedRegionUnsafe(cellRangeAddress); rowCount += count; } } // 该方法将目标列根据值是否相同连续可合并,存储可合并的行数 private List<Integer> getGroupCountList(List<String> exportDataList){ if (CollectionUtils.isEmpty(exportDataList)) { return new ArrayList<>(); } List<Integer> groupCountList = new ArrayList<>(); int count = 1; for (int i = 1; i < exportDataList.size(); i++) { if (exportDataList.get(i).equals(exportDataList.get(i - 1))) { count++; } else { groupCountList.add(count); count = 1; } } // 处理完最后一条后 groupCountList.add(count); return groupCountList; } }// 修改WriteSheet的代码如下 public static void writeExcel() { String fileName = getPath(); ExcelWriter excelWriter = EasyExcel.write(fileName).excelType(ExcelTypeEnum.XLSX).build(); List<DemoData> demoDataList = data1(); // 写sheet的时候注册相应的自定义合并单元格策略 WriteSheet writeSheet = EasyExcel.writerSheet("模板1").head(DemoData.class) .registerWriteHandler(new CustomMergeStrategy(demoDataList.stream().map(DemoData::getString).collect(Collectors.toList()), 0)) .build(); excelWriter.write(demoDataList, writeSheet); excelWriter.finish(); }打开输出的excel文件后如下,可以看到第一列有相同值的单元格已经合并了,成功实现

  

 

  同理若要合并第三列的数据,则可以在注册一个sheet写处理器,代码如下

  

 public static void writeExcel() { String fileName = getPath(); ExcelWriter excelWriter = EasyExcel.write(fileName).excelType(ExcelTypeEnum.XLSX).build(); List<DemoData> demoDataList = data1(); WriteSheet writeSheet = EasyExcel.writerSheet("模板1").head(DemoData.class) .registerWriteHandler(new CustomMergeStrategy(demoDataList.stream().map(DemoData::getString).collect(Collectors.toList()), 0)) .registerWriteHandler(new CustomMergeStrategy(demoDataList.stream().map(o -> o.getDoubleData().toString()).collect(Collectors.toList()), 2)) .build(); excelWriter.write(demoDataList, writeSheet); excelWriter.finish(); }

excel打开如下:

 

  

 

  

 

  

1.3 写多个sheet

 public static void writeExcel() { String fileName = getPath(); ExcelWriter excelWriter = EasyExcel.write(fileName).excelType(ExcelTypeEnum.XLSX).build(); List<DemoData> demoDataList = data1(); WriteSheet writeSheet = EasyExcel.writerSheet("模板1").head(DemoData.class) .registerWriteHandler(new CustomMergeStrategy(demoDataList.stream().map(DemoData::getString).collect(Collectors.toList()), 0)) .registerWriteHandler(new CustomMergeStrategy(demoDataList.stream().map(o -> o.getDoubleData().toString()).collect(Collectors.toList()), 2)) .build(); excelWriter.write(demoDataList, writeSheet); WriteSheet writeSheet1 = EasyExcel.writerSheet("模板2").head(DemoData.class).build(); excelWriter.write(data1(), writeSheet1); excelWriter.finish(); }

输出excel可以看到已经有两个sheet了

 

  

 

  

 

  

1.4 WriteTable

若业务需求要求在同一个sheet中写多个表,就需要用到WriteTable了。只定义一个WriteSheet,有几个表就定义几个WriteTable

 

  

 public static void writeExcel01() { String fileName = getPath(); ExcelWriter excelWriter = EasyExcel.write(fileName).excelType(ExcelTypeEnum.XLSX).build(); WriteSheet writeSheet = EasyExcel.writerSheet("模板").needHead(Boolean.FALSE).build(); List<DemoData> demoDataList = data1(); // 需要表头设置为true,WriteTable一些属性会继承自WriteSheet WriteTable writeTable = EasyExcel.writerTable(1).head(DemoData.class).needHead(Boolean.TRUE) .registerWriteHandler(new CustomMergeStrategy(demoDataList.stream().map(DemoData::getString).collect(Collectors.toList()), 0)) .registerWriteHandler(new CustomMergeStrategy(demoDataList.stream().map(o -> o.getDoubleData().toString()).collect(Collectors.toList()), 2)) .build(); excelWriter.write(demoDataList, writeSheet, writeTable); WriteTable writeTable1 = EasyExcel.writerTable(2).head(DemoData.class).needHead(Boolean.TRUE).build(); excelWriter.write(data1(), writeSheet, writeTable1); excelWriter.finish(); }

打开excel表格如下

 

  

 

  以上就是Java利用EasyExcel实现合并单元格的详细内容,更多关于Java EasyExcel合并单元格的资料请关注盛行IT其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: