首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 實現 Excel 轉 HTML:Apache POI 讀取 + Velocity 模板渲染完整實戰

     編輯:Java 綜合教學

前言

將 Excel 報表轉為 HTML 網頁展示,是報表系統、數據門戶常見需求。本文採用 **Apache POI 讀取 Excel** + **Velocity 模板引擎渲染 HTML** 的輕量級方案,提供完整 Maven 專案代碼,支援 `.xls` (2003/2007) 與 `.xlsx` (2010+) 雙格式。

一、技術棧與依賴

<dependencies>
    <!-- POI 核心 -->
    <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.12</version></dependency>
    <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.12</version></dependency>
    <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>3.12</version></dependency>
    <!-- Velocity -->
    <dependency><groupId>velocity</groupId><artifactId>velocity</artifactId><version>1.5</version></dependency>
    <!-- XMLBeans (POI 依賴) -->
    <dependency><groupId>org.apache.xmlbeans</groupId><artifactId>xmlbeans</artifactId><version>2.6.0</version></dependency>
</dependencies>

二、核心流程兩步走

  1. 讀取:`ReadExcel.readExcel(path)` → 返回 `List`。
  2. 渲染:`WriteHtml.write(list)` → Velocity 合併模板 → 生成 `test.html`。

三、關鍵代碼解析

1. 統一入口判斷格式

public List readExcel(String path) throws IOException {
    String postfix = Util.getPostfix(path); // 取副檔名
    if ("xlsx".equals(postfix)) return readXlsx(path);
    else if ("xls".equals(postfix)) return readXls(path);
    return null;
}

2. POI 讀取 .xlsx (XSSF) 與 .xls (HSSF) 統一邏輯

// XSSF 範例
XSSFWorkbook wb = new XSSFWorkbook(is);
for (int s = 0; s < wb.getNumberOfSheets(); s++) {
    XSSFSheet sheet = wb.getSheetAt(s);
    for (int r = 1; r <= sheet.getLastRowNum(); r++) { // 跳過表頭
        XSSFRow row = sheet.getRow(r);
        Student stu = new Student();
        stu.setNo(getValue(row.getCell(0)));
        stu.setName(getValue(row.getCell(1)));
        stu.setAge(getValue(row.getCell(2)));
        stu.setScore(Float.valueOf(getValue(row.getCell(3))));
        list.add(stu);
    }
}
// getValue 統一處理數值/布爾/字串儲存格類型

3. Velocity 模板 (student.vm)

<table id="t01">
<tr><th>S/N</th><th>ID</th><th>Name</th><th>Age</th><th>Score</th></tr>
#set( $count = 1 )
#foreach( $student in $students )
<tr>
    <td>$count</td>
    <td>$student.no</td>
    <td>$student.name</td>
    <td>$student.age</td>
    <td>$student.score</td>
</tr>
#set( $count = $count + 1 )
#end
</table>

4. 模板渲染輸出

VelocityEngine ve = new VelocityEngine();
ve.setProperty("input.encoding", "UTF-8");
ve.setProperty("output.encoding", "UTF-8");
ve.init();
Template t = ve.getTemplate("./src/main/java/com/b510/excel/vm/student.vm");
VelocityContext ctx = new VelocityContext();
ctx.put("students", students);
StringWriter sw = new StringWriter();
t.merge(ctx, sw);
Files.write(Paths.get("test.html"), sw.toString().getBytes(StandardCharsets.UTF_8));

四、運行效果

瀏覽器打開生成的 HTML 表格

  • 表頭固定、斑馬紋樣式、中文正常顯示。
  • 刷新專案即可看到 `test.html`,雙擊用瀏覽器打開即為最終報表。

五、擴展建議

  1. 多 Sheet 支援:模板加入 `#foreach($sheet in $sheets)` 雙層循環。
  2. 樣式提取:POI 可讀取 CellStyle(背景色、字體、邊框)轉為內聯 CSS。
  3. 大文件優化:改用 `SXSSF` (流式) 或 `EasyExcel` 避免 OOM。
  4. 前端直出:Spring MVC Controller 直接返回 `text/html`,省落盤。

六、源碼下載

完整 Maven 專案:excel2html.zip

總結

POI + Velocity 組合實現「讀取與展示分離」,代碼量極小、擴展性強。掌握「統一入口判斷格式 → 統一 Cell 取值 → 模板數據綁定」三步曲,即可快速構建 Excel 轉 HTML 服務。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved