Java 中導(dǎo)出 Excel 文件的常見實(shí)現(xiàn)方法
在 Java 中導(dǎo)出 Excel 文件的方法有多種,主要依賴不同的類庫或工具,每種方法適用于不同的場景(如數(shù)據(jù)量大小、格式復(fù)雜度、易用性等)。以下是常見的幾種實(shí)現(xiàn)方式:
選擇建議
簡單格式 + 小數(shù)據(jù)量:Apache POI(XSSF/HSSF)或 EasyExcel。
復(fù)雜格式 + 中大數(shù)據(jù)量:EasyExcel(優(yōu)先)或 POI + 自定義樣式。
超大數(shù)據(jù)量(百萬級):EasyExcel(默認(rèn)優(yōu)化)或 POI 的 SXSSF。
固定模板報表:Freemarker/Thymeleaf 模板引擎。
純數(shù)據(jù)導(dǎo)出(無格式):CSV 格式。
其中,EasyExcel 因易用性和性能優(yōu)勢,成為目前 Java 導(dǎo)出 Excel 的主流選擇,尤其在業(yè)務(wù)系統(tǒng)中廣泛應(yīng)用。
一、基于 Apache POI(最常用)
Apache POI 是 Apache 基金會的開源項(xiàng)目,是 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的擴(kuò)展,支持大數(shù)據(jù)量導(dǎo)出(通過內(nèi)存優(yōu)化,適合十萬級以上數(shù)據(jù),避免 OOM)。
優(yōu)點(diǎn)
功能全面,支持復(fù)雜格式(單元格樣式、合并單元格、公式、圖表等)。
兼容性好,支持所有 Excel 版本。
缺點(diǎn)
代碼相對繁瑣,需要手動創(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)建標(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 是阿里巴巴開源的 Excel 處理工具,基于 POI 封裝,專注于簡化代碼和優(yōu)化大數(shù)據(jù)量性能,避免 POI 的內(nèi)存占用問題。
核心特點(diǎn)
注解驅(qū)動:通過@ExcelProperty等注解映射 Java 對象與 Excel 列,無需手動創(chuàng)建單元格。
低內(nèi)存:默認(rèn)采用 SXSSF 的內(nèi)存優(yōu)化機(jī)制,支持百萬級數(shù)據(jù)導(dǎo)出。
支持復(fù)雜格式:合并單元格、表頭樣式、自定義轉(zhuǎn)換器等。
優(yōu)點(diǎn)
代碼簡潔,無需手動處理行和單元格,降低開發(fā)成本。
性能優(yōu)異,適合大數(shù)據(jù)量導(dǎo)出(如報表、日志數(shù)據(jù))。
缺點(diǎn)
高級格式(如公式、圖表)支持較弱,復(fù)雜場景仍需結(jié)合 POI。
示例代碼片段
// 定義數(shù)據(jù)模型(通過注解映射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)
輕量級,API 簡單,適合簡單的.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)
通過Excel 模板(如.xlsx模板)結(jié)合模板引擎,動態(tài)填充數(shù)據(jù)后導(dǎo)出。適用于格式固定、樣式復(fù)雜的報表(如財(cái)務(wù)報表、合同模板)。
原理
準(zhǔn)備 Excel 模板,用占位符(如${name})標(biāo)記需要填充的位置。
用模板引擎解析模板,替換占位符為實(shí)際數(shù)據(jù)。
生成最終 Excel 文件。
優(yōu)點(diǎn)
樣式與邏輯分離,模板可由非開發(fā)人員(如運(yùn)營)維護(hù)。
適合復(fù)雜格式報表,無需代碼中手動設(shè)置樣式。
缺點(diǎn)
靈活性較低,模板變更需同步更新占位符。
大數(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ù)導(dǎo)出(無格式要求)。
優(yōu)點(diǎn)
實(shí)現(xiàn)簡單,無需依賴任何 Excel 類庫。
生成速度快,適合超大數(shù)據(jù)量(如千萬級)。
缺點(diǎn)
不支持任何樣式(如單元格合并、顏色、公式),僅能存儲純文本數(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è)級復(fù)雜場景。JXLS:結(jié)合 POI 和模板引擎,通過標(biāo)簽(如jx:each)在 Excel 模板中循環(huán)填充數(shù)據(jù),適合動態(tài)報表。
到此這篇關(guān)于Java 中導(dǎo)出 Excel 文件的方法的文章就介紹到這了,更多相關(guān)java導(dǎo)出excel文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java如何導(dǎo)出多個excel并打包壓縮成.zip文件
- Java使用POI實(shí)現(xiàn)excel文件的導(dǎo)入和導(dǎo)出
- Java導(dǎo)出多個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樹形結(jié)構(gòu)數(shù)據(jù)生成導(dǎo)出excel文件方法記錄
- Java通過導(dǎo)出超大Excel文件解決內(nèi)存溢出問題
相關(guān)文章
Java基于ArrayList實(shí)現(xiàn)群主發(fā)紅包功能
這篇文章主要介紹了Java基于ArrayList實(shí)現(xiàn)群主發(fā)紅包功能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-09-09
Java中使用MyBatis-Plus操作數(shù)據(jù)庫的實(shí)例
本文主要介紹了Java中使用MyBatis-Plus操作數(shù)據(jù)庫的實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-02-02
關(guān)于ThreadLocal和InheritableThreadLocal解析
這篇文章主要介紹了關(guān)于ThreadLocal和InheritableThreadLocal解析,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-03-03
java調(diào)用通義千問API的詳細(xì)完整步驟
通義千問是阿里云自主研發(fā)的大語言模型,能夠在用戶自然語言輸入的基礎(chǔ)上,通過自然語言理解和語義分析,理解用戶意圖,在不同領(lǐng)域、任務(wù)內(nèi)為用戶提供服務(wù)和幫助,下面這篇文章主要給大家介紹了關(guān)于java調(diào)用通義千問API的詳細(xì)完整步驟,需要的朋友可以參考下2024-02-02
Maven繼承父工程時的relativePath標(biāo)簽解析用法小結(jié)
relativePath 的作用是為了找到父級工程的pom.xml,本文主要介紹了Maven繼承父工程時的relativePath標(biāo)簽解析用法小結(jié),具有一定的參考價值,感興趣的可以了解一下2024-03-03

