首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# Excel Interop 列印預覽實作:頁面設定與報表輸出完整指南

     編輯:關於C語言

承接上一篇「另存為」範例,本文著重於 **列印預覽** 功能的實作。透過 PrintPreview 讓使用者在列印前確認版面,並詳細說明 PageSetup 頁面設定的關鍵屬性,助你產出專業級的列印輸出。

核心差異:列印預覽 vs 另存為

程式結構與資料寫入、格式化邏輯大同小異,關鍵差異在於最後階段:

  • 另存為: 呼叫 SaveAs(),關閉 Excel。
  • 列印預覽: 設定 PageSetup → xlsApp.Visible = true → xlsSheet.PrintPreview(true) → 使用者操作列印/關閉 → 程式清理關閉。

關鍵程式碼片段:PageSetup 深度解析

// 頁面方向與紙張
xlsSheet.PageSetup.Orientation = Excel.XlPageOrientation.xlLandscape; // 橫向
xlsSheet.PageSetup.PaperSize = Excel.XlPaperSize.xlPaperA4;

// 邊距(單位:英吋,需透過 InchesToPoints 轉換)
xlsSheet.PageSetup.LeftMargin   = xlsApp.InchesToPoints(0.5);
xlsSheet.PageSetup.RightMargin  = xlsApp.InchesToPoints(0.5);
xlsSheet.PageSetup.TopMargin    = xlsApp.InchesToPoints(1.3);
xlsSheet.PageSetup.BottomMargin = xlsApp.InchesToPoints(1.0);
xlsSheet.PageSetup.HeaderMargin = xlsApp.InchesToPoints(0.9);
xlsSheet.PageSetup.FooterMargin = xlsApp.InchesToPoints(0.6);

// 水平置中
xlsSheet.PageSetup.CenterHorizontally = true;

// **重複列印標題列**(關鍵:跨頁顯示表頭)
Excel.Range titleRange = xlsSheet.get_Range(xlsSheet.Cells[1, 1], xlsSheet.Cells[2, intCols]);
xlsSheet.PageSetup.PrintTitleRows = titleRange.get_Address(
    Type.Missing, Type.Missing, 
    Excel.XlReferenceStyle.xlA1, 
    Type.Missing, Type.Missing);

// 頁首/頁尾(可選)
xlsSheet.PageSetup.CenterHeader = "&\"標楷體\"&18" + lblDMMC.Text + " 斷面實測成果表";
// xlsSheet.PageSetup.CenterFooter = "&9----- 第 &P 頁 -----";

// 不列印格線
xlsSheet.PageSetup.PrintGridlines = false;

列印預覽流程控制

// 顯示 Excel 視窗並進入列印預覽模式
xlsApp.Visible = true;
xlsSheet.PrintPreview(true); // true = 全螢幕預覽

// **關鍵:預覽視窗關閉前,程式會阻塞在此**
// 使用者點擊「列印」或「關閉」後,繼續執行清理程式碼

xlsBook.Saved = true; // 標記已儲存,避免關閉時跳出「是否儲存」對話框
xlsApp.Workbooks.Close();
xlsApp.Visible = false; // 隱藏再關閉,避免閃爍
xlsApp.Quit();

// 釋放 COM 物件(同上篇,極重要)
ReleaseComObject(xlsSheet);
ReleaseComObject(xlsBook);
ReleaseComObject(xlsApp);
GC.Collect();
GC.WaitForPendingFinalizers();

常見坑點與解決方案

問題原因解決
預覽視窗關閉後 Excel 進程殘留 未正確 ReleaseComObject、未 Quit() 嚴格遵循「建立順序反向釋放」+ GC.Collect()
跨頁表頭不重複 未設定 PrintTitleRows 正確設定標題區域 Range 的 Address
中文頁首/頁尾亂碼 字型名稱需用 &\"字體名\" 語法 如 &\"標楷體\"&18標題文字
伺服器端 (IIS) 執行失敗/卡住 Interop 需互動式桌面、DCOM 權限極難設 **嚴禁伺服端使用**,改用 ClosedXML/EPPlus 產生檔案供下載列印

現代化替代方案建議

若專案僅需「產生 PDF/列印」,強烈建議:

  1. 使用 ClosedXML 或 EPPlus 產生 .xlsx 檔案(無 Office 相依、效能佳、支援 .NET Core/5+)。
  2. 搭配 LibreOffice Headless 或商用元件 (如 Aspose.Cells, Spire.XLS) 在伺服端轉 PDF。
  3. 前端直接用瀏覽器列印 HTML/CSS 排版,或用 jsPDF/pdfmake 產生 PDF。

Interop 適合 **WinForms/WPF 桌面應用、需啟動 Excel 互動操作** 的情境;其他情境請果斷選擇純 .NET 函式庫。

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