我的需求:

項目中有一些工程表格需要導出,設計到行列合并,定制樣式,原有工具類冗余,內聚性強。所以想寫一個可以隨意定制excel的工具類,工具類滿足需求:
對于常用的工程表格有模板格式,可以任意插拔。
可以操作任意一個sheet頁,進行行列合并,邏輯可以根據業務調整。
可以對當前存儲sheet頁數據行進行數據動態插入,單元格操作。
有實用的輸出方式,比如報文實體,字節數組等。
最后輕量,代碼邏輯清晰,好維護。
我是這樣做的:
在構建上基于建造者設計模式
將excel的構建邏輯抽象,將數據注入邏輯從構建邏輯中分離出來,采用函數式編程的方式。
實現了樣式不同的多sheet頁構建。
在代碼上結合原有工具類數據轉化部分優點,利用JSON格式實現數據處理
嗯,時間有限,沒有優化代碼,小伙伴們有好的IDEA可以留言。可以基于這個擴展操作方法
使用方法:
public static void main(String[] args) { // 使用方法 new WorkbookUtil() // 文件名稱 .setFileName(null) // TODO 初始化一個excel .initWorkbook() // TODO 初始化一個sheet頁,可自定義邏輯,(HSSFWorkbook,String) ->{ HSSFSheet} .initSheet(null,null) // TODO 初始化sheet頁表頭 ,可自定義邏輯,(HSSFSheet,HeadDetails) ->{ HSSFSheet} 下同 .initSheetHead(null,null,null,null) // 填充sheet頁數據 .setSheetData(null,null,null) // sheet頁數據指定列合并行 .setDataRowMerged(null,null,null) // sheet頁數據指定相鄰列合并,可以傳入多值,(單行合并,值相同情況) .setDataCellMerged(null,null,null) // 當前sheet當前行插入數據 data :Map (列索引,數據) .setSheetRow(null,null) // 當前sheet當前行強制合并 (firstCol,lastCol) 合并索引[必填] .setRowMerged(null,null) // 當前sheet指定行強制合并 .setCellRangeAddress(null,null) // 初始化表尾 .initSheetFoot(null,null) // TODO 第二個sheet頁.. .initSheet(null,null) .initSheetHead(null,null,null,null) .setSheetData(null,null,null) .initSheetFoot(null,null) .setDataRowAndCellMerged(null,null,null) //.... // .builderByte() 輸出字節數組 // 直接寫入報文 .builderResponseEntity(); }
具體的Demo:
基本的表格
簡單的行列合并:
稍微復雜的行列合并:
代碼

package com.hhwy.pwps.util.excel; import java.util.LinkedList; import java.util.List; /** * @author Liruilong * @Date 2021-01-20 15:37 * @Description: */ public class HeadDetails { private List headDetails = new LinkedList<>(); public static class HeadDetail{ private String key; private String title; private int width = 50; //列數據單元格是否對齊 private boolean center = true; public String getKey() { return key; } public HeadDetail setKey(String key) { this.key = key; return this; } public String getTitle() { return title; } public HeadDetail setTitle(String title) { this.title = title; return this; } public int getWidth() { return width; } public HeadDetail setWidth(int width) { this.width = width; return this; } public boolean isCenter() { return center; } public HeadDetail setCenter(boolean center) { this.center = center; return this; } } public HeadDetails add(String key,String title,int width){ this.headDetails.add(new HeadDetail().setTitle(title).setKey(key).setWidth(width)); return this; } public HeadDetails add(String key,String title,int width,boolean center){ this.headDetails.add(new HeadDetail().setTitle(title).setKey(key).setWidth(width).setCenter(center)); return this; } public HeadDetails add(String key,String title){ this.headDetails.add(new HeadDetail().setTitle(title).setKey(key)); return this; } public List builder(){ return this.headDetails; } public int headSize(){ return this.headDetails.size(); } }
Java
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
上一篇:word表格內容無法全部顯示怎么辦(word中表格不能全部顯示)