1. はじめに
- Excelファイルの印刷を自動で実行したい
- タスクスケジューラーから定時起動したい
2. 開発環境
- Visual Stduio 2022
- .NET 8
- Windows 11
- Excel 2021
3. 自動処理の内容
- コンソールアプリとして作成する
- ファイル名、プリンタ名は一旦固定とする
- Excelファイルが複数シートある場合、シート分印刷する
- タスクスケジューラから起動できるようにする
4. 事前準備
4.1. Visual Stduioの設定
- 「Microsoft Excel 16.0 Object Library」の参照設定を追加する
4.2. コンポーネントサービスの設定 (Excel)
- 設定を変更しない場合、タスクスケジューラから起動できない。
1. マイ コンピューター > DCOM構成 > Microsoft Excel Applicationを右クリックして、プロパティを選択する
2. IDタブを開いて、対話ユーザーに変更する
5. ソースコード
Program.cs
using System.Runtime.InteropServices;
using Excel = Microsoft.Office.Interop.Excel;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Excel.Application? app = null;
try
{
// Excelオブジェクトを生成する
app = new Excel.Application();
Excel.Workbook? wb = null;
try
{
// 印刷ファイルを開く
wb = app.Workbooks.Open(@"D:\Book1.xlsx");
// 全シートを印刷する
foreach (Excel.Worksheet sh in wb.Sheets)
{
try
{
// 固定のプリンタへ印刷する
sh.PrintOutEx(ActivePrinter: "Microsoft Print to PDF");
}
catch (Exception ex)
{
throw new ApplicationException(sh.Name, ex);
}
}
}
finally
{
if (wb != null)
{
// Excelファイルを閉じる
wb.Close();
}
}
}
catch (Exception ex)
{
// エラーメッセージを出力
Console.WriteLine(ex.ToString());
}
finally
{
if (app != null)
{
// Excelオブジェクトを終了する
GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect();
app.Quit();
Marshal.ReleaseComObject(app); app = null;
GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect();
}
}
}
}
}
6. 注意事項
6.1. Excelオブジェクトの開放
- 単純にExcelオブジェクトをQuitしただけだとプロセスが残るため、後処理が必要になる。
6.2. タスクスケジューラの利用可能ユーザ
- タスクスケジューラのユーザーではプリンタへの印刷ができないため、DCOMの設定変更をしておく必要がある。
6.3. Office のオートメーションをサーバーサイドで使用する際の問題
- Windows Server上で実行する場合、複雑な問題があるので利用しないほうがよい。
7. 参考文献