核心概念
Word(.doc)支援開啟 HTML 格式檔案。利用此特性,我們只需將資料組裝為**符合 Word 開啟規範的 HTML 字串**,再以 `.doc` 副檔名儲存,即可達到「匯出 Word」效果,無需引用 `Microsoft.Office.Interop.Word`、無需安裝 Office、無版本相容性問題、執行速度極快。
完整實作程式碼
using System;
using System.Data;
using System.IO;
using System.Text;
using System.Windows.Forms; // 僅為 MessageBox Demo
public class WordExporter
{
/// 建立 Word 相容 HTML 模板
public string BuildWordHtml(string tableHtml)
{
var sb = new StringBuilder();
sb.AppendLine("");
sb.AppendLine("");
sb.AppendLine("匯出文件");
sb.AppendLine("");
sb.AppendLine(tableHtml); // 已包含 標籤
sb.AppendLine("");
return sb.ToString();
}
/// 儲存為 .doc 檔案
public bool SaveAsDoc(string filePath, string htmlContent)
{
try
{
// Encoding.Default 對應系統預設編碼(中文環境為 Big5/GB2312),Word 開啟較無亂碼
using (var sw = new StreamWriter(filePath, false, Encoding.Default))
{
sw.Write(htmlContent);
}
return true;
}
catch (Exception ex)
{
// 記錄日誌 ex.ToString()
return false;
}
}
/// 示範:將 DataSet 多張表匯出為單一 Word
public void ExportDataSetToWord(DataSet ds, string savePath)
{
var allTablesHtml = new StringBuilder();
foreach (DataTable dt in ds.Tables)
{
var tableHtml = new StringBuilder();
tableHtml.AppendLine("");
// 表標題
tableHtml.AppendLine($"| {dt.TableName} |
");
// 欄位標題
tableHtml.Append("");
foreach (DataColumn col in dt.Columns)
tableHtml.Append($"| {col.ColumnName} | ");
tableHtml.AppendLine("
");
// 資料列
foreach (DataRow row in dt.Rows)
{
tableHtml.Append("");
foreach (DataColumn col in dt.Columns)
tableHtml.Append($"| {row[col]} | ");
tableHtml.AppendLine("
");
}
tableHtml.AppendLine("
");
allTablesHtml.Append(tableHtml);
}
string fullHtml = BuildWordHtml(allTablesHtml.ToString());
if (SaveAsDoc(savePath, fullHtml))
MessageBox.Show("匯出成功!");
else
MessageBox.Show("匯出失敗,請檢查路徑權限。");
}
}
WinForm / ASP.NET 呼叫範例
// WinForm
private void btnExport_Click(object sender, EventArgs e)
{
string path = Path.Combine(Application.StartupPath, "Report.doc");
var ds = GetReportData(); // 你的查詢邏輯
new WordExporter().ExportDataSetToWord(ds, path);
}
// ASP.NET (Web Forms)
protected void btnExport_Click(object sender, EventArgs e)
{
string path = Server.MapPath("~/Exports/Report.doc");
var ds = GetReportData();
new WordExporter().ExportDataSetToWord(ds, path);
Response.Clear();
Response.ContentType = "application/msword";
Response.AppendHeader("Content-Disposition", "attachment; filename=Report.doc");
Response.WriteFile(path);
Response.End();
}
優缺點分析
| 優點 |
缺點/限制 |
| 零依賴、無需安裝 Office |
無法使用 Word 進階排版:分頁符、頁首頁尾、書籤、目錄、追蹤修訂 |
| 速度極快(字串組裝 + 寫檔) |
複雜樣式(欄位合併、嵌套表格、浮水印)需手寫 HTML/CSS,維護困難 |
| 跨平台(Linux Docker 可用) |
大量資料(>5 萬列)HTML 字串過大,記憶體壓力大 |
| 程式碼簡潔、易除錯 |
Word 開啟時可能彈出「格式不符」警告(實際可正常顯示) |
進階替代方案比較
| 方案 |
適用場景 |
複雜度 |
| HTML 轉 .doc (本文) | 簡單表格報表、清單匯出、內部工具 | 低 |
| Open XML SDK (DocumentFormat.OpenXml) | 需精確控制 Word 結構、樣式、分頁、商業報表 | 中 |
| NPOI (HWPF/XWPF) | 需支援 .doc/.docx、不想装 Office、Java 移植專案 | 中 |
| Interop.Word (COM) | 需列印、轉 PDF、套用範本、伺服器端已裝 Office(不建議 Server 端用) | 高 |
| 第三方報表元件 | 複雜分組、交叉表、圖表、多格式匯出 | 高 |
結論
若需求為「快速把 GridView/DataTable 資料匯出給使用者用 Word 開啟檢視/列印」,**HTML 轉 .doc 是最高 CP 值方案**;若需精密排版、分頁控制、商業級報表,請投資學習 Open XML SDK。
- 上一篇文章: ASP.NET 效能優化 20 條實戰準則
- 下一篇文章: ASP.NET 記錄訪客 IP 至文字檔 (每日一檔 + Cookie 去重)
Copyright ©
程式碼之家 All Rights Reserved