【C#】ExcelのActivePrinterを変更する
C#からExcelを操作するときの話。
複数PCでExportAsFixedFormatメソッドでPDFを大量に作成する業務をしたのだけど、特定の環境で作成したPDFの用紙サイズが違っていた。
原因は規定のプリンターの違いにあって、Excelで作成したPDFは、印刷設定によってはプリンター設定の影響を受けるのがExcelの仕様のよう。
参考サイト
donboolacoo.blog92.fc2.com
試行錯誤してみたところ「Microsoft XPS Document Writer」をExcelの規定プリンターにしたら正常サイズのPDFを出力できることがわかったので、PDF出力前にExcelの規定プリンターを変更するようにしました。
ExcelでPDF出力する場合は、規定プリンターを変更しておくほうが無難ですね。
Sheets.Printout メソッドのActivePrinterパラメーターで変更すればって情報はいくつか見られたのだけど、ActivePrinterだけ変更するのは日本語サイトでは見つからなかったのでこの場で覚え書きします。
参考サイト
stackoverflow.com
using Excel = Microsoft.Office.Interop.Excel; using Microsoft.Win32; /// <summary> /// Excelアプリケーション /// </summary> private Excel.Application excelApp; /// <summary> /// Excelワークブックス /// </summary> private Excel.Workbooks excelBooks; /// <summary> /// Excelワークブック /// </summary> private Excel.Workbook excelBook; /// <summary> /// Excelを起動します /// </summary> private void RunExcel() { if (excelApp == null) { excelApp = new Excel.Application(); excelBooks= excelApp.Workbooks; string excelFile = @"C:\Temp\doc.xlsx"; excelBook = excelBooks.Open(excelFile); string printerName = "Microsoft XPS Document Writer"; string printerPort = ""; // プリンターポート番号を取得する string keyAddress = @"Software\Microsoft\Windows NT\CurrentVersion\Devices"; using (RegistryKey registryKey = Registry.CurrentUser.OpenSubKey(keyAddress)) { if (registryKey != null) { // 例)"winspool,Ne00:" object value = registryKey.GetValue(printerName); if (value != null) { string[] split = value.ToString().Split(','); if (split.Length >= 2) { printerPort = split[1]; } } } } // アクティブプリンターを設定する if ((!excelApp.ActivePrinter.StartsWith(printerName)) && (printerPort != "")) { excelApp.ActivePrinter = $"{printerName} on {printerPort}"; } } }