Java 中導出 Excel 文件的常見實現(xiàn)方法
在 Java 中導出 Excel 文件的方法有多種,主要依賴不同的類庫或工具,每種方法適用于不同的場景(如數(shù)據(jù)量大小、格式復雜度、易用性等)。以下是常見的幾種實現(xiàn)方式:
選擇建議
簡單格式 + 小數(shù)據(jù)量:Apache POI(XSSF/HSSF)或 EasyExcel。
復雜格式 + 中大數(shù)據(jù)量:EasyExcel(優(yōu)先)或 POI + 自定義樣式。
超大數(shù)據(jù)量(百萬級):EasyExcel(默認優(yōu)化)或 POI 的 SXSSF。
固定模板報表:Freemarker/Thymeleaf 模板引擎。
純數(shù)據(jù)導出(無格式):CSV 格式。
其中,EasyExcel 因易用性和性能優(yōu)勢,成為目前 Java 導出 Excel 的主流選擇,尤其在業(yè)務(wù)系統(tǒng)中廣泛應(yīng)用。
一、基于 Apache POI(最常用)
Apache POI 是 Apache 基金會的開源項目,是 Java 處理 Microsoft Office 文檔(包括 Excel)的主流工具,支持.xls(Excel 97-2003)和.xlsx(Excel 2007+)格式。
核心類HSSF:處理 .xls 格式(最多 65536 行,適合小數(shù)據(jù)量)。
核心類:HSSFWorkbook(文檔)、HSSFSheet(工作表)、HSSFRow(行)、HSSFCell(單元格)。
XSSF:處理 .xlsx 格式(支持百萬級行,適合中大數(shù)據(jù)量)。
核心類:XSSFWorkbook、XSSFSheet、XSSFRow、XSSFCell。
SXSSF:XSSF的擴展,支持大數(shù)據(jù)量導出(通過內(nèi)存優(yōu)化,適合十萬級以上數(shù)據(jù),避免 OOM)。
優(yōu)點
功能全面,支持復雜格式(單元格樣式、合并單元格、公式、圖表等)。
兼容性好,支持所有 Excel 版本。
缺點
代碼相對繁瑣,需要手動創(chuàng)建行、單元格并設(shè)置樣式。
處理大數(shù)據(jù)時(如十萬級以上),XSSF 可能占用較多內(nèi)存(需用 SXSSF 優(yōu)化)。
示例代碼片段(XSSF)
// 創(chuàng)建.xlsx文檔
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet("Sheet1");
// 創(chuàng)建標題行
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 是阿里巴巴開源的 Excel 處理工具,基于 POI 封裝,專注于簡化代碼和優(yōu)化大數(shù)據(jù)量性能,避免 POI 的內(nèi)存占用問題。
核心特點
注解驅(qū)動:通過@ExcelProperty等注解映射 Java 對象與 Excel 列,無需手動創(chuàng)建單元格。
低內(nèi)存:默認采用 SXSSF 的內(nèi)存優(yōu)化機制,支持百萬級數(shù)據(jù)導出。
支持復雜格式:合并單元格、表頭樣式、自定義轉(zhuǎn)換器等。
優(yōu)點
代碼簡潔,無需手動處理行和單元格,降低開發(fā)成本。
性能優(yōu)異,適合大數(shù)據(jù)量導出(如報表、日志數(shù)據(jù))。
缺點
高級格式(如公式、圖表)支持較弱,復雜場景仍需結(jié)合 POI。
示例代碼片段
// 定義數(shù)據(jù)模型(通過注解映射Excel列)
@Data
public class User {
@ExcelProperty("姓名")
private String name;
@ExcelProperty("年齡")
private Integer age;
}
// 導出邏輯
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),目前已停止維護,逐漸被 POI 替代。
優(yōu)點
輕量級,API 簡單,適合簡單的.xls 文件導出。
缺點
不支持.xlsx 格式,功能有限(如不支持公式、圖表),且不再更新。
示例代碼片段
// 創(chuàng)建.xls文檔
WritableWorkbook workbook = Workbook.createWorkbook(new File("test_jxl.xls"));
WritableSheet sheet = workbook.createSheet("Sheet1", 0);
// 標題行
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)
通過Excel 模板(如.xlsx模板)結(jié)合模板引擎,動態(tài)填充數(shù)據(jù)后導出。適用于格式固定、樣式復雜的報表(如財務(wù)報表、合同模板)。
原理
準備 Excel 模板,用占位符(如${name})標記需要填充的位置。
用模板引擎解析模板,替換占位符為實際數(shù)據(jù)。
生成最終 Excel 文件。
優(yōu)點
樣式與邏輯分離,模板可由非開發(fā)人員(如運營)維護。
適合復雜格式報表,無需代碼中手動設(shè)置樣式。
缺點
靈活性較低,模板變更需同步更新占位符。
大數(shù)據(jù)量場景性能較差。
示例(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(逗號分隔值)是一種簡單的文本格式,可被 Excel 直接打開,適合純數(shù)據(jù)導出(無格式要求)。
優(yōu)點
實現(xiàn)簡單,無需依賴任何 Excel 類庫。
生成速度快,適合超大數(shù)據(jù)量(如千萬級)。
缺點
不支持任何樣式(如單元格合并、顏色、公式),僅能存儲純文本數(shù)據(jù)。
示例代碼片段
FileWriter writer = new FileWriter("data.csv");
// 標題行
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è)工具,功能強大(支持所有 Excel 特性),但需要付費授權(quán),適合企業(yè)級復雜場景。JXLS:結(jié)合 POI 和模板引擎,通過標簽(如jx:each)在 Excel 模板中循環(huán)填充數(shù)據(jù),適合動態(tài)報表。
到此這篇關(guān)于Java 中導出 Excel 文件的方法的文章就介紹到這了,更多相關(guān)java導出excel文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JAVA把結(jié)果保留兩位小數(shù)的3種方法舉例
在寫程序的時候,有時候可能需要設(shè)置小數(shù)的位數(shù),所以下面這篇文章主要給大家介紹了關(guān)于JAVA把結(jié)果保留兩位小數(shù)的3種方法,文章通過代碼介紹的非常詳細,需要的朋友可以參考下2024-08-08
詳解Java虛擬機管理的內(nèi)存運行時數(shù)據(jù)區(qū)域
這篇文章主要介紹了詳解Java虛擬機管理的內(nèi)存運行時數(shù)據(jù)區(qū)域的相關(guān)資料,需要的朋友可以參考下2017-03-03
springboot2.x 接入阿里云市場短信發(fā)送的實現(xiàn)
本文主要介紹了springboot2.x 接入阿里云市場短信發(fā)送的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11
SpringBoot整合任務(wù)系統(tǒng)quartz和SpringTask的方法
這篇文章主要介紹了SpringBoot整合任務(wù)系統(tǒng)(quartz和SpringTask),Quartz是一個比較成熟了的定時任務(wù)框架,但是捏,它稍微的有些許繁瑣,本文先給大家講解下Quartz的一些基本概念結(jié)合實例代碼給大家詳細講解,需要的朋友可以參考下2022-10-10
SpringBoot自定義實現(xiàn)內(nèi)容協(xié)商的三種策略
內(nèi)容協(xié)商是HTTP協(xié)議中的一個重要概念,允許同一資源URL根據(jù)客戶端的偏好提供不同格式的表示,這篇文章主要介紹了SpringBoot自定義實現(xiàn)內(nèi)容協(xié)商的三種策略,希望對大家有一定的幫助2025-04-04

