Java 中導(dǎo)出 Excel 文件的常見(jiàn)實(shí)現(xiàn)方法
在 Java 中導(dǎo)出 Excel 文件的方法有多種,主要依賴不同的類庫(kù)或工具,每種方法適用于不同的場(chǎng)景(如數(shù)據(jù)量大小、格式復(fù)雜度、易用性等)。以下是常見(jiàn)的幾種實(shí)現(xiàn)方式:
選擇建議
簡(jiǎn)單格式 + 小數(shù)據(jù)量:Apache POI(XSSF/HSSF)或 EasyExcel。
復(fù)雜格式 + 中大數(shù)據(jù)量:EasyExcel(優(yōu)先)或 POI + 自定義樣式。
超大數(shù)據(jù)量(百萬(wàn)級(jí)):EasyExcel(默認(rèn)優(yōu)化)或 POI 的 SXSSF。
固定模板報(bào)表:Freemarker/Thymeleaf 模板引擎。
純數(shù)據(jù)導(dǎo)出(無(wú)格式):CSV 格式。
其中,EasyExcel 因易用性和性能優(yōu)勢(shì),成為目前 Java 導(dǎo)出 Excel 的主流選擇,尤其在業(yè)務(wù)系統(tǒng)中廣泛應(yīng)用。
一、基于 Apache POI(最常用)
Apache POI 是 Apache 基金會(huì)的開(kāi)源項(xiàng)目,是 Java 處理 Microsoft Office 文檔(包括 Excel)的主流工具,支持.xls(Excel 97-2003)和.xlsx(Excel 2007+)格式。
核心類HSSF:處理 .xls 格式(最多 65536 行,適合小數(shù)據(jù)量)。
核心類:HSSFWorkbook(文檔)、HSSFSheet(工作表)、HSSFRow(行)、HSSFCell(單元格)。
XSSF:處理 .xlsx 格式(支持百萬(wàn)級(jí)行,適合中大數(shù)據(jù)量)。
核心類:XSSFWorkbook、XSSFSheet、XSSFRow、XSSFCell。
SXSSF:XSSF的擴(kuò)展,支持大數(shù)據(jù)量導(dǎo)出(通過(guò)內(nèi)存優(yōu)化,適合十萬(wàn)級(jí)以上數(shù)據(jù),避免 OOM)。
優(yōu)點(diǎn)
功能全面,支持復(fù)雜格式(單元格樣式、合并單元格、公式、圖表等)。
兼容性好,支持所有 Excel 版本。
缺點(diǎn)
代碼相對(duì)繁瑣,需要手動(dòng)創(chuàng)建行、單元格并設(shè)置樣式。
處理大數(shù)據(jù)時(shí)(如十萬(wàn)級(jí)以上),XSSF 可能占用較多內(nèi)存(需用 SXSSF 優(yōu)化)。
示例代碼片段(XSSF)
// 創(chuàng)建.xlsx文檔
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet("Sheet1");
// 創(chuàng)建標(biāo)題行
XSSFRow row = sheet.createRow(0);
row.createCell(0).setCellValue("姓名");
row.createCell(1).setCellValue("年齡");
// 填充數(shù)據(jù)
XSSFRow dataRow = sheet.createRow(1);
dataRow.createCell(0).setCellValue("張三");
dataRow.createCell(1).setCellValue(25);
// 輸出到文件或響應(yīng)流
FileOutputStream fos = new FileOutputStream("test.xlsx");
workbook.write(fos);
fos.close();
workbook.close();二、基于 Alibaba EasyExcel
EasyExcel 是阿里巴巴開(kāi)源的 Excel 處理工具,基于 POI 封裝,專注于簡(jiǎn)化代碼和優(yōu)化大數(shù)據(jù)量性能,避免 POI 的內(nèi)存占用問(wèn)題。
核心特點(diǎn)
注解驅(qū)動(dòng):通過(guò)@ExcelProperty等注解映射 Java 對(duì)象與 Excel 列,無(wú)需手動(dòng)創(chuàng)建單元格。
低內(nèi)存:默認(rèn)采用 SXSSF 的內(nèi)存優(yōu)化機(jī)制,支持百萬(wàn)級(jí)數(shù)據(jù)導(dǎo)出。
支持復(fù)雜格式:合并單元格、表頭樣式、自定義轉(zhuǎn)換器等。
優(yōu)點(diǎn)
代碼簡(jiǎn)潔,無(wú)需手動(dòng)處理行和單元格,降低開(kāi)發(fā)成本。
性能優(yōu)異,適合大數(shù)據(jù)量導(dǎo)出(如報(bào)表、日志數(shù)據(jù))。
缺點(diǎn)
高級(jí)格式(如公式、圖表)支持較弱,復(fù)雜場(chǎng)景仍需結(jié)合 POI。
示例代碼片段
// 定義數(shù)據(jù)模型(通過(guò)注解映射Excel列)
@Data
public class User {
@ExcelProperty("姓名")
private String name;
@ExcelProperty("年齡")
private Integer age;
}
// 導(dǎo)出邏輯
List<User> data = new ArrayList<>();
data.add(new User("卡布大帝", 25));
// 輸出到文件
EasyExcel.write("test_easy.xlsx", User.class)
.sheet("Sheet1")
.doWrite(data);三、基于 JXL(僅支持.xls)
JXL(Java Excel API) 是早期的 Excel 處理工具,僅支持 .xls 格式(不支持.xlsx),目前已停止維護(hù),逐漸被 POI 替代。
優(yōu)點(diǎn)
輕量級(jí),API 簡(jiǎn)單,適合簡(jiǎn)單的.xls 文件導(dǎo)出。
缺點(diǎn)
不支持.xlsx 格式,功能有限(如不支持公式、圖表),且不再更新。
示例代碼片段
// 創(chuàng)建.xls文檔
WritableWorkbook workbook = Workbook.createWorkbook(new File("test_jxl.xls"));
WritableSheet sheet = workbook.createSheet("Sheet1", 0);
// 標(biāo)題行
Label nameLabel = new Label(0, 0, "姓名");
Label ageLabel = new Label(1, 0, "年齡");
sheet.addCell(nameLabel);
sheet.addCell(ageLabel);
// 數(shù)據(jù)行
Label name = new Label(0, 1, "張三");
Number age = new Number(1, 1, 25);
sheet.addCell(name);
sheet.addCell(age);
workbook.write();
workbook.close();四、基于模板引擎(如 Freemarker、Thymeleaf)
通過(guò)Excel 模板(如.xlsx模板)結(jié)合模板引擎,動(dòng)態(tài)填充數(shù)據(jù)后導(dǎo)出。適用于格式固定、樣式復(fù)雜的報(bào)表(如財(cái)務(wù)報(bào)表、合同模板)。
原理
準(zhǔn)備 Excel 模板,用占位符(如${name})標(biāo)記需要填充的位置。
用模板引擎解析模板,替換占位符為實(shí)際數(shù)據(jù)。
生成最終 Excel 文件。
優(yōu)點(diǎn)
樣式與邏輯分離,模板可由非開(kāi)發(fā)人員(如運(yùn)營(yíng))維護(hù)。
適合復(fù)雜格式報(bào)表,無(wú)需代碼中手動(dòng)設(shè)置樣式。
缺點(diǎn)
靈活性較低,模板變更需同步更新占位符。
大數(shù)據(jù)量場(chǎng)景性能較差。
示例(Freemarker)
模板文件(template.xlsx.ftl)中單元格設(shè)置為 ${user.name}。
代碼填充數(shù)據(jù):
Configuration cfg = new Configuration(Configuration.VERSION_2_3_31);
cfg.setDirectoryForTemplateLoading(new File("templates"));
Template template = cfg.getTemplate("template.xlsx.ftl");
Map<String, Object> data = new HashMap<>();
data.put("user", new User("張三", 25));
FileOutputStream fos = new FileOutputStream("report.xlsx");
template.process(data, new OutputStreamWriter(fos));
fos.close();五、基于 CSV 格式(偽 Excel)
CSV(逗號(hào)分隔值)是一種簡(jiǎn)單的文本格式,可被 Excel 直接打開(kāi),適合純數(shù)據(jù)導(dǎo)出(無(wú)格式要求)。
優(yōu)點(diǎn)
實(shí)現(xiàn)簡(jiǎn)單,無(wú)需依賴任何 Excel 類庫(kù)。
生成速度快,適合超大數(shù)據(jù)量(如千萬(wàn)級(jí))。
缺點(diǎn)
不支持任何樣式(如單元格合并、顏色、公式),僅能存儲(chǔ)純文本數(shù)據(jù)。
示例代碼片段
FileWriter writer = new FileWriter("data.csv");
// 標(biāo)題行
writer.write("姓名,年齡\n");
// 數(shù)據(jù)行
writer.write("張三,25\n");
writer.write("李四,30\n");
writer.close();六、其他工具
Alibaba EasyExcel:如前文所述,是 POI 的優(yōu)化封裝,推薦優(yōu)先使用。Aspose.Cells:商業(yè)工具,功能強(qiáng)大(支持所有 Excel 特性),但需要付費(fèi)授權(quán),適合企業(yè)級(jí)復(fù)雜場(chǎng)景。JXLS:結(jié)合 POI 和模板引擎,通過(guò)標(biāo)簽(如jx:each)在 Excel 模板中循環(huán)填充數(shù)據(jù),適合動(dòng)態(tài)報(bào)表。
到此這篇關(guān)于Java 中導(dǎo)出 Excel 文件的方法的文章就介紹到這了,更多相關(guān)java導(dǎo)出excel文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java如何導(dǎo)出多個(gè)excel并打包壓縮成.zip文件
- Java使用POI實(shí)現(xiàn)excel文件的導(dǎo)入和導(dǎo)出
- Java導(dǎo)出多個(gè)excel表打包到zip文件中供客戶端另存為窗口下載實(shí)現(xiàn)方法
- java中的export方法實(shí)現(xiàn)導(dǎo)出excel文件
- Java+EasyExcel實(shí)現(xiàn)文件的導(dǎo)入導(dǎo)出
- Java Hutool工具實(shí)現(xiàn)驗(yàn)證碼生成及Excel文件的導(dǎo)入和導(dǎo)出
- Java樹(shù)形結(jié)構(gòu)數(shù)據(jù)生成導(dǎo)出excel文件方法記錄
- Java通過(guò)導(dǎo)出超大Excel文件解決內(nèi)存溢出問(wèn)題
相關(guān)文章
JAVA把結(jié)果保留兩位小數(shù)的3種方法舉例
在寫(xiě)程序的時(shí)候,有時(shí)候可能需要設(shè)置小數(shù)的位數(shù),所以下面這篇文章主要給大家介紹了關(guān)于JAVA把結(jié)果保留兩位小數(shù)的3種方法,文章通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-08-08
詳解Java虛擬機(jī)管理的內(nèi)存運(yùn)行時(shí)數(shù)據(jù)區(qū)域
這篇文章主要介紹了詳解Java虛擬機(jī)管理的內(nèi)存運(yùn)行時(shí)數(shù)據(jù)區(qū)域的相關(guān)資料,需要的朋友可以參考下2017-03-03
springboot2.x 接入阿里云市場(chǎng)短信發(fā)送的實(shí)現(xiàn)
本文主要介紹了springboot2.x 接入阿里云市場(chǎng)短信發(fā)送的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
Maven?自動(dòng)化構(gòu)建的實(shí)現(xiàn)示例
本文主要介紹了Maven?自動(dòng)化構(gòu)建的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05
SpringBoot整合任務(wù)系統(tǒng)quartz和SpringTask的方法
這篇文章主要介紹了SpringBoot整合任務(wù)系統(tǒng)(quartz和SpringTask),Quartz是一個(gè)比較成熟了的定時(shí)任務(wù)框架,但是捏,它稍微的有些許繁瑣,本文先給大家講解下Quartz的一些基本概念結(jié)合實(shí)例代碼給大家詳細(xì)講解,需要的朋友可以參考下2022-10-10
springboot項(xiàng)目如何配置多數(shù)據(jù)源
本文介紹了如何在SpringBoot項(xiàng)目中配置多數(shù)據(jù)源,包括配置多個(gè)數(shù)據(jù)源、創(chuàng)建數(shù)據(jù)源配置類、配置事務(wù)管理器以及使用不同的Mapper,從而實(shí)現(xiàn)跨數(shù)據(jù)庫(kù)操作2025-03-03
SpringBoot自定義實(shí)現(xiàn)內(nèi)容協(xié)商的三種策略
內(nèi)容協(xié)商是HTTP協(xié)議中的一個(gè)重要概念,允許同一資源URL根據(jù)客戶端的偏好提供不同格式的表示,這篇文章主要介紹了SpringBoot自定義實(shí)現(xiàn)內(nèi)容協(xié)商的三種策略,希望對(duì)大家有一定的幫助2025-04-04

