如何用 JAVA 實現一個基于 POI 的復雜表格導出工具類?

      網友投稿 925 2025-04-02

      我的需求:


      項目中有一些工程表格需要導出,設計到行列合并,定制樣式,原有工具類冗余,內聚性強。所以想寫一個可以隨意定制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:

      基本的表格

      簡單的行列合并:

      稍微復雜的行列合并:

      代碼

      如何用 JAVA 實現一個基于 POI 的復雜表格導出工具類?

      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中表格不能全部顯示)
      下一篇:多表匯總(excel多表匯總)
      相關文章
      亚洲精品无码专区2| 五月婷婷亚洲综合| 亚洲午夜久久久久久久久电影网 | 亚洲另类无码专区首页| 亚洲一区二区三区不卡在线播放| 亚洲一二成人精品区| 亚洲av无码片在线播放| 亚洲AV无码成人网站久久精品大 | 亚洲精品无码久久久久A片苍井空 亚洲精品无码久久久久YW | 亚洲av无码成h人动漫无遮挡| 亚洲精品亚洲人成在线观看| 亚洲熟妇丰满多毛XXXX| 久久精品国产亚洲沈樵| 亚洲成A人片在线观看WWW| 亚洲VA成无码人在线观看天堂| 国产亚洲精品国产| 亚洲国产人成网站在线电影动漫 | 国产AV无码专区亚洲AV毛网站| 亚洲国产精品无码久久久不卡| 亚洲va无码手机在线电影| 亚洲人成电影亚洲人成9999网| 亚洲一区免费观看| 亚洲精品无码久久毛片波多野吉衣| 亚洲国产美女视频| 亚洲综合国产成人丁香五月激情| 亚洲精品动漫免费二区| WWW国产亚洲精品久久麻豆| 亚洲第一成人影院| 亚洲中文字幕无码爆乳AV| 亚洲精品无码Av人在线观看国产| 久久久久亚洲Av片无码v| 亚洲神级电影国语版| 亚洲一区免费视频| 亚洲精品乱码久久久久久蜜桃图片 | 亚洲s码欧洲m码吹潮| 亚洲国产精品一区二区九九| 丁香五月亚洲综合深深爱| 亚洲∧v久久久无码精品| 亚洲激情视频网站| 亚洲国产成人久久综合| 久久亚洲中文字幕精品一区|