前置準備
- NuGet 安裝:
NPOI、NPOI.OOXML
- 專案目標:.NET Framework 4.6.1+ / .NET Core 3.1+
後端核心程式碼 (Controller)
using NPOI.XWPF.UserModel;
using System.IO;
using Microsoft.AspNetCore.Mvc;
public IActionResult ExportResume() {
var doc = new XWPFDocument();
// 標題
AddParagraph(doc, "未登錄過學生的賬號密碼", "宋體", 18, true, ParagraphAlignment.LEFT);
// 備註
AddParagraph(doc, "(備註:已登錄過的學生密碼不顯示)", "宋體", 10, true, ParagraphAlignment.LEFT);
// 學校
AddParagraph(doc, "學校:XX一中", "宋體", 10, true, ParagraphAlignment.LEFT);
// 班級
AddParagraph(doc, "班級:(7)", "宋體", 10, true, ParagraphAlignment.LEFT);
// 班主任
AddParagraph(doc, "班主任:ddd", "宋體", 10, true, ParagraphAlignment.LEFT);
// 備註行
AddParagraph(doc, "可以在此處添加備註:", "宋體", 10, true, ParagraphAlignment.LEFT);
// 輸出
using (var ms = new MemoryStream()) {
doc.Write(ms);
return File(ms.ToArray(),
"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
"Resume.docx");
}
}
private void AddParagraph(XWPFDocument doc, string text, string font, int size, bool bold, ParagraphAlignment align) {
var p = doc.CreateParagraph();
p.Alignment = align;
var r = p.CreateRun();
r.SetText(text);
r.FontFamily = font;
r.FontSize = size;
r.IsBold = bold;
}
前端呼叫 (Razor / HTML)
匯出 Word 簡歷
進階:表格佈局 (簡歷常用)
var table = doc.CreateTable(4, 2);
table.GetRow(0).GetCell(0).SetText("姓名");
table.GetRow(0).GetCell(1).SetText(model.Name);
table.GetRow(1).GetCell(0).SetText("性別");
table.GetRow(1).GetCell(1).SetText(model.Gender);
// 設定邊框、寬度...
常見問題
| 問題 | 解決 |
| 中文亂碼 | 確認字型名稱正確 (如「微軟正黑體」),且伺服器已安裝該字型 |
| 檔案損壞 | 務必 doc.Write(stream) 後再 stream.ToArray(),不可倒序 |
| 效能 | 大量資料改用 SXWPFDocument (串流寫入) |
替代方案比較
- Open XML SDK:微軟官方、無第三方依賴、API 較繁瑣
- DocX:語法簡潔、但維護較慢
- NPOI:⭐ 推薦,相容性好、社群活躍、支援 .doc/.docx