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

C# DataGridView 資料匯出 Word 文件:Office Interop 實作步驟

     編輯:程式設計綜合問答

前置條件

  1. 開發機與目標機**必須安裝 Microsoft Word (Office 2007+)**。
  2. 專案加入參考:`Microsoft.Office.Interop.Word` (COM 標籤頁) 或 NuGet `Microsoft.Office.Interop.Word`。
  3. 引入命名空間:`using Word = Microsoft.Office.Interop.Word;`

核心程式碼範例

private void btnExportWord_Click(object sender, EventArgs e) {
    if (dataGridView1.Rows.Count == 0) { MessageBox.Show("無資料"); return; }

    SaveFileDialog sfd = new SaveFileDialog {
        Filter = "Word 文件 (*.docx)|*.docx|Word 97-2003 (*.doc)|*.doc",
        FileName = $"Export_{DateTime.Now:yyyyMMdd_HHmmss}.docx"
    };
    if (sfd.ShowDialog() != DialogResult.OK) return;

    Word.Application wordApp = null;
    Word.Document doc = null;
    try {
        wordApp = new Word.Application { Visible = false };
        doc = wordApp.Documents.Add();

        // 建立表格:列數 = 欄位數,行數 = 資料行數 + 1 (標題列)
        int cols = dataGridView1.Columns.Count;
        int rows = dataGridView1.Rows.Count + 1;
        Word.Table table = doc.Tables.Add(wordApp.Selection.Range, rows, cols);
        table.Borders.Enable = 1;

        // 寫入標題列
        for (int c = 0; c < cols; c++) {
            table.Cell(1, c + 1).Range.Text = dataGridView1.Columns[c].HeaderText;
            table.Cell(1, c + 1).Range.Bold = 1;
        }

        // 寫入資料列
        for (int r = 0; r < dataGridView1.Rows.Count; r++) {
            for (int c = 0; c < cols; c++) {
                var val = dataGridView1.Rows[r].Cells[c].Value;
                table.Cell(r + 2, c + 1).Range.Text = val?.ToString() ?? "";
            }
        }

        // 自動調整欄寬
        table.AutoFitBehavior(Word.WdAutoFitBehavior.wdAutoFitWindow);

        doc.SaveAs2(sfd.FileName);
        MessageBox.Show("匯出成功!");
    } catch (Exception ex) {
        MessageBox.Show("失敗: " + ex.Message);
    } finally {
        if (doc != null) doc.Close(false);
        if (wordApp != null) wordApp.Quit(false);
        // 釋放 COM 物件
        System.Runtime.InteropServices.Marshal.ReleaseComObject(doc);
        System.Runtime.InteropServices.Marshal.ReleaseComObject(wordApp);
        GC.Collect(); GC.WaitForPendingFinalizers();
    }
}

替代方案:無需安裝 Office 的純 .NET 庫

  • DocX (NuGet):** 輕量、無相依、支援 .docx,適合簡單表格/文字。
  • Open XML SDK (DocumentFormat.OpenXml):** 微軟官方、效能最強、學習曲線較陡,適合高效能/伺服器端批次產生。
  • NPOI:** 相容 .doc/.xls/.xlsx,社群活躍。

建議:客戶端桌面程式且環境可控用 Interop 功能最全;伺服器端/無 Office 環境請用 DocX 或 Open XML SDK。

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