2013年11月24日日曜日

ExcelAccessor

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using OfficeExcel = Microsoft.Office.Interop.Excel;

namespace Core.File.Excel
{
    /// <summary>
    /// Excelアクセサー
    /// </summary>
    public class ExcelAccessor : IDisposable
    {
        #region 構築・破棄

        /// <summary>
        /// コンストラクタ
        /// </summary>
        private ExcelAccessor()
        {
            // 初期設定
            Init();
        }

        /// <summary>
        /// 構成子
        /// </summary>
        /// <returns></returns>
        public static ExcelAccessor GetAccessor()
        {
            return new ExcelAccessor();
        }

        /// <summary>
        /// 破棄
        /// </summary>
        public void Dispose()
        {
            Quit();
            foreach(object releaseComObject in ReleaseComObjects)
            {
                Marshal.ReleaseComObject(releaseComObject);
            }
        }

        #endregion

        #region プロパティ

        /// <summary>Application</summary>
        private OfficeExcel.Application application;
        /// <summary>Application</summary>
        private OfficeExcel.Application Application
        {
            get
            {
                if (this.application == null)
                {
                    this.application = new OfficeExcel.Application();
                    ReleaseComObjects.Add(this.application);
                }
                return this.application;
            }
        }

        /// <summary>Workbooks</summary>
        private OfficeExcel.Workbooks workbooks;
        /// <summary>Workbooks</summary>
        private OfficeExcel.Workbooks Workbooks
        {
            get
            {
                if (this.workbooks == null)
                {
                    this.workbooks = Application.Workbooks;
                    ReleaseComObjects.Add(this.workbooks);
                }
                return this.workbooks;
            }
        }

        /// <summary>解放COMオブジェクト</summary>
        private List<object> releaseComObjects;
        /// <summary>解放COMオブジェクト</summary>
        public List<object> ReleaseComObjects
        {
            get
            {
                if (this.releaseComObjects == null)
                {
                    this.releaseComObjects = new List<object>();
                }
                return this.releaseComObjects;
            }
        }

        /// <summary>確認メッセージ表示設定</summary>
        public bool DisplayAlerts
        {
            get
            {
                return Application.DisplayAlerts;
            }
            set
            {
                Application.DisplayAlerts = value;
            }
        }

        /// <summary>Visible</summary>
        public bool Visible
        {
            get
            {
                return Application.Visible;
            }
            set
            {
                Application.Visible = value;
            }
        }

        /// <summary>ActiveWindow</summary>
        private OfficeExcel.Window ActiveWindow
        {
            get
            {
                OfficeExcel.Window window = Application.ActiveWindow;
                ReleaseComObjects.Add(window);
                return window;
            }
        }

        /// <summary>ウィンドウ枠の固定</summary>
        public bool FreezePanes
        {
            get
            {
                return ActiveWindow.FreezePanes;
            }
            set
            {
                ActiveWindow.FreezePanes = value;
            }
        }

        #endregion

        #region メソッド

        /// <summary>
        /// 初期設定
        /// </summary>
        private void Init()
        {
            DisplayAlerts = false;
        }

        /// <summary>
        /// Bookを開く
        /// </summary>
        /// <param name="absolutePath">絶対パス</param>
        /// <returns></returns>
        public BookAccessor OpenBook(string absolutePath)
        {
            OfficeExcel.Workbook workbook = Workbooks.Open(
                absolutePath, // オープンするExcelファイル名
                Type.Missing, // (省略可能)UpdateLinks (0 / 1 / 2 / 3)
                Type.Missing, // (省略可能)ReadOnly (True / False )
                Type.Missing, // (省略可能)Format
                              // 1:タブ / 2:カンマ (,) / 3:スペース / 4:セミコロン (;)
                              // 5:なし / 6:引数 Delimiterで指定された文字
                Type.Missing, // (省略可能)Password
                Type.Missing, // (省略可能)WriteResPassword
                Type.Missing, // (省略可能)IgnoreReadOnlyRecommended
                Type.Missing, // (省略可能)Origin
                Type.Missing, // (省略可能)Delimiter
                Type.Missing, // (省略可能)Editable
                Type.Missing, // (省略可能)Notify
                Type.Missing, // (省略可能)Converter
                Type.Missing, // (省略可能)AddToMru
                Type.Missing, // (省略可能)Local
                Type.Missing  // (省略可能)CorruptLoad
            );

            // 解放COMオブジェクト追加
            ReleaseComObjects.Add(workbook);

            return BookAccessor.GetAccessor(workbook, this);
        }

        /// <summary>
        /// Bookを追加
        /// </summary>
        /// <returns></returns>
        public BookAccessor AddBook()
        {
            OfficeExcel.Workbook workbook = Workbooks.Add();

            // 解放COMオブジェクト追加
            ReleaseComObjects.Add(workbook);

            return BookAccessor.GetAccessor(workbook, this);
        }

        /// <summary>
        /// 終了
        /// </summary>
        private void Quit()
        {
            Application.Quit();
        }

        /// <summary>
        /// マクロ実行
        /// </summary>
        /// <returns></returns>
        public dynamic Run(string macro, params object[] args)
        {
            object[] arg30 = new object[30];
            for(int i = 0; i < arg30.Length; i++)
            {
                arg30[i] = Type.Missing;
            }

            for(int i = 0; i < args.Length; i++)
            {
                arg30[i] = args[i];
            }

            return Application.Run(macro
                , arg30[0]
                , arg30[1]
                , arg30[2]
                , arg30[3]
                , arg30[4]
                , arg30[5]
                , arg30[6]
                , arg30[7]
                , arg30[8]
                , arg30[9]
                , arg30[10]
                , arg30[11]
                , arg30[12]
                , arg30[13]
                , arg30[14]
                , arg30[15]
                , arg30[16]
                , arg30[17]
                , arg30[18]
                , arg30[19]
                , arg30[20]
                , arg30[21]
                , arg30[22]
                , arg30[23]
                , arg30[24]
                , arg30[25]
                , arg30[26]
                , arg30[27]
                , arg30[28]
                , arg30[29]);
        }

        #endregion
    }
}

0 件のコメント:

コメントを投稿