<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.7</version> </dependency>
在某些業務場景中可能會有合併單元格的需求,下面具體來說明如何實現
先來看下不合並單元格的程式碼寫法,簡單複習下
public static void writeExcel() { // 寫excel的路徑,當前專案路徑下 String fileName = getPath(); // 構建ExcelWriter ExcelWriter excelWriter = EasyExcel.write(fileName).excelType(ExcelTypeEnum.XLSX).build(); // 構建sheet WriteSheet writeSheet = EasyExcel.writerSheet("模板1").head(DemoData.class).build(); // 寫sheet excelWriter.write(data1(), writeSheet); excelWriter.finish(); } private static String getPath() { return System.getProperty("user.dir") + "/" + System.currentTimeMillis() + ".xlsx"; } private static List<DemoData> data1() { List<DemoData> list = Lists.newArrayList(); for (int i = 0; i < 3; i++) { DemoData data = new DemoData(); data.setString("字串" + 1); data.setDate(new Date()); data.setDoubleData(0.56); list.add(data); } for (int i = 0; i < 3; i++) { DemoData data = new DemoData(); data.setString("字串" + 2); data.setDate(new Date()); data.setDoubleData(0.56); list.add(data); } for (int i = 0; i < 4; i++) { DemoData data = new DemoData(); data.setString("字串" + 3); data.setDate(new Date()); data.setDoubleData(0.57); list.add(data); } return list; } public static void main(String[] args) { writeExcel(); }
開啟輸出的excel檔案後如下,可以看到單元格沒有合併。現在打算將第一列字串標題相同的合併
// 自定義合併策略 該類繼承了AbstractMergeStrategy抽象合併策略,需要重寫merge()方法 public static class CustomMergeStrategy extends AbstractMergeStrategy { /** * 分組,每幾行合併一次 */ private List<Integer> exportFieldGroupCountList; /** * 目標合併列index */ private Integer 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開啟如下:
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了
若業務需求要求在同一個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合併單元格的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45