承接上一篇「另存為」範例,本文著重於 **列印預覽** 功能的實作。透過 PrintPreview 讓使用者在列印前確認版面,並詳細說明 PageSetup 頁面設定的關鍵屬性,助你產出專業級的列印輸出。
程式結構與資料寫入、格式化邏輯大同小異,關鍵差異在於最後階段:
SaveAs(),關閉 Excel。PageSetup → xlsApp.Visible = true → xlsSheet.PrintPreview(true) → 使用者操作列印/關閉 → 程式清理關閉。// 頁面方向與紙張
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/列印」,強烈建議:
.xlsx 檔案(無 Office 相依、效能佳、支援 .NET Core/5+)。Interop 適合 **WinForms/WPF 桌面應用、需啟動 Excel 互動操作** 的情境;其他情境請果斷選擇純 .NET 函式庫。