NonSoft

EXCEL印刷(Worksheet.PrintOut)のサンプル(C#.NET)


 サンプル(ソース/コード)
<このサンプルの概要>
C#.NETからエクセルを使用して帳票を印刷するサンプルを作ってみました。帳票印刷機能
を簡単に実現したい時に如何でしょうか。このサンプルのキーワードは以下の通りです。
(1)参照の追加(Microsoft Excel *.* Object Library)
(2)Excel.Application
(3)Excel.Workbooks
(4)Excel.Workbook
(5)Excel.Worksheet
(6)Excel.Worksheet.PrintOut
(7)Marshal.ReleaseComObject
(8)System.GC.Collect

C#.NETではVB.NETよりオブジェクト解放処理が多く必要なようです。。。
参照したオブジェクトは一つ一つ確実に解放するようにした方が良いでしょう。。。

エクセル関係のその他ののサンプルはこちらです。
エクセルを使用した帳票印刷のサンプル(VB.NET)
エクセルを操作する小技のサンプル(VB.NET)
エクセルを操作する小技のサンプル(C#.NET)
エクセルを起動しいろいろ操作するサンプル(VB6)
エクセルを起動しいろいろ操作するサンプル(VBS)
エクセルへデータをコピーし表示するサンプル(VB6)

★エクセルによる印刷クラス(ExcelPrint.cs)
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using Excel = Microsoft.Office.Interop.Excel;

namespace ExcelPrint
{
    class ExcelPrint
    {
        public String _xslFile = @"d:\temp\Book1.xls";  // XLSファイル名
        public int _sheetNo = 1;                        // シートNo.
        public int _col = 1;                            // データ書き込みカラム
        public int _line = 1;                           // データ書き込み開始行
        public String _printer = "";                    // 出力プリンター

        public String _A1 = "";                         // A1
        public String _A2 = "";                         // A2
        public String _A3 = "";                         // A3
        public String _A4 = "";                         // A4
        public String _A5 = "";                         // A5

        // -----------------------------------------------------------------------------
        // 印刷実行
        // -----------------------------------------------------------------------------
        public void Print()
        {
            // Excel.Applicationを有効にするため参照の追加を行なってください
            // [参照の追加],[COM],[Microsoft Excel *.* Object Library]
            // 参照設定に[Excel](ファイル名:Interop.Excel.dll)が追加されます
            Excel.Application objExcel = null;
            Excel.Workbooks objWorkBooks = null;
            Excel.Workbook objWorkBook = null;
            Excel.Worksheet objWorkSheet = null;
            Excel.Range objRange = null;
            object objCell = null;

            try
            {
                // EXCEL開始処理
                try
                {
                    objExcel = new Excel.Application();
                }
                catch
                {
                    throw new Exception(
                        "Microsoft Office Excelがインストールされていないため\n" +
                        "印刷できません。");
                }

                if (System.IO.File.Exists(_xslFile) == false)
                {
                    throw new Exception(
                        "エクセルファイルが見つかりませんでした。\n" + _xslFile);
                }

                objExcel.WindowState = Excel.XlWindowState.xlMinimized;
                objExcel.Visible = false;
                objExcel.DisplayAlerts = false;

                objWorkBooks = objExcel.Workbooks;
                objWorkBook = objWorkBooks.Open(_xslFile,
                    Type.Missing, Type.Missing, Type.Missing, 
                    Type.Missing, Type.Missing, Type.Missing, 
                    Type.Missing, Type.Missing, Type.Missing, 
                    Type.Missing, Type.Missing, Type.Missing, 
                    Type.Missing, Type.Missing);
                objWorkSheet = (Excel.Worksheet)objWorkBook.Sheets[_sheetNo];

                // EXCEL出力処理
                objCell = objWorkSheet.Cells[_line + 0, _col];
                objRange = objWorkSheet.get_Range(objCell, objCell);
                objRange.Value2 = _A1;
                Marshal.ReleaseComObject(objRange);     // オブジェクト参照を解放
                Marshal.ReleaseComObject(objCell);      // オブジェクト参照を解放

                objCell = objWorkSheet.Cells[_line + 1, _col];
                objRange = objWorkSheet.get_Range(objCell, objCell);
                objRange.Value2 = _A2;
                Marshal.ReleaseComObject(objRange);     // オブジェクト参照を解放
                Marshal.ReleaseComObject(objCell);      // オブジェクト参照を解放

                objCell = objWorkSheet.Cells[_line + 2, _col];
                objRange = objWorkSheet.get_Range(objCell, objCell);
                objRange.Value2 = _A3;
                Marshal.ReleaseComObject(objRange);     // オブジェクト参照を解放
                Marshal.ReleaseComObject(objCell);      // オブジェクト参照を解放

                objCell = objWorkSheet.Cells[_line + 3, _col];
                objRange = objWorkSheet.get_Range(objCell, objCell);
                objRange.Value2 = _A4;
                Marshal.ReleaseComObject(objRange);     // オブジェクト参照を解放
                Marshal.ReleaseComObject(objCell);      // オブジェクト参照を解放

                objCell = objWorkSheet.Cells[_line + 4, _col];
                objRange = objWorkSheet.get_Range(objCell, objCell);
                objRange.Value2 = _A5;
                Marshal.ReleaseComObject(objRange);     // オブジェクト参照を解放
                Marshal.ReleaseComObject(objCell);      // オブジェクト参照を解放

                // 印刷実行
                if (_printer != "")
                {
                    objWorkSheet.PrintOut(
                        Type.Missing, Type.Missing, 1, Type.Missing,
                        _printer, Type.Missing, true, Type.Missing);
                }else{
                    objWorkSheet.PrintOut(
                        Type.Missing, Type.Missing, 1, Type.Missing,
                        Type.Missing, Type.Missing, true, Type.Missing);
                }

                objWorkBook.Saved = true;   // 保存済みとする

            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                // EXCEL終了処理
                if (objWorkSheet != null)
                {
                    Marshal.ReleaseComObject(objWorkSheet);     // オブジェクト参照を解放
                    objWorkSheet = null;                        // オブジェクト解放
                }

                if (objWorkBook != null)
                {
                    objWorkBook.Close(false, 
                        Type.Missing, Type.Missing);            //ファイルを閉じる
                    Marshal.ReleaseComObject(objWorkBook);      // オブジェクト参照を解放
                    objWorkBook = null;                         // オブジェクト解放
                }

                if (objWorkBooks != null)
                {
                    Marshal.ReleaseComObject(objWorkBooks);     // オブジェクト参照を解放
                    objWorkBooks = null;                        // オブジェクト解放
                }
                if (objExcel != null)
                {
                    objExcel.Quit();                            // EXCELを閉じる

                    Marshal.ReleaseComObject(objExcel);         // オブジェクト参照を解放
                    objExcel = null;                            // オブジェクト解放
                }

                System.GC.Collect();                            // オブジェクトを確実に削除
            }
        }
    }
}

★メインのフォーム(テスト用)(Form1.cs)
''' -----------------------------------------------------------------------------
''' メインのフォーム(テスト用)
''' -----------------------------------------------------------------------------
namespace ExcelPrint
{
    public partial class Form1 : Form
    {
        // 印刷ボタンクリック
        private void button1_Click(object sender, EventArgs e)
        {
            ExcelPrint objExcel =new ExcelPrint();
            objExcel._A1 = "A1";
            objExcel._A2 = "A2";
            objExcel._A3 = "A3";
            objExcel._A4 = "A4";
            objExcel._A5 = "A5";
            objExcel.Print();
        }
    }
}