2013年11月24日日曜日

BookAccessor

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

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

        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="workbook"></param>
        /// <param name="application">ExcelApplicationアクセサー</param>
        private BookAccessor(OfficeExcel.Workbook workbook, ExcelAccessor application)
            :base(application)
        {
            Workbook = workbook;
        }

        /// <summary>
        /// 構成子
        /// </summary>
        /// <param name="workbook"></param>
        /// <param name="application">ExcelApplicationアクセサー</param>
        /// <returns></returns>
        internal static BookAccessor GetAccessor(OfficeExcel.Workbook workbook, ExcelAccessor application)
        {
            return new BookAccessor(workbook, application);
        }

        #endregion

        #region プロパティ

        /// <summary>Workbook</summary>
        private OfficeExcel.Workbook Workbook { get; set; }

        /// <summary>Sheets</summary>
        private OfficeExcel.Sheets sheets;
        /// <summary>Sheets</summary>
        private OfficeExcel.Sheets Sheets
        {
            get
            {
                if (this.sheets == null)
                {
                    this.sheets = Workbook.Sheets;
                    ReleaseComObjects.Add(this.sheets);
                }
                return this.sheets;
            }
        }

        /// <summary>フルネーム</summary>
        public string FullName
        {
            get
            {
                return Workbook.FullName;
            }
        }

        /// <summary>ファイル名</summary>
        public string Name
        {
            get
            {
                return Workbook.Name;
            }
        }

        /// <summary>パス</summary>
        public string Path
        {
            get
            {
                return Workbook.Path;
            }
        }

        #endregion

        #region WorkBook

        /// <summary>
        /// 保存
        /// </summary>
        public void Save()
        {
            Workbook.Save();
        }

        /// <summary>
        /// 名前を付けて保存
        /// </summary>
        /// <param name="absolutePath">絶対パス</param>
        public void SaveAs(string absolutePath)
        {
            Workbook.SaveAs(ConvertIllegalBookName(absolutePath));
        }

        /// <summary>
        /// 禁則文字変換
        /// 1 )コロン        :
        /// 2 )角カッコ      [ ]
        /// </summary>
        /// <param name="name"></param>
        public string ConvertIllegalBookName(string name)
        {
            StringBuilder sb = new StringBuilder();

            sb.Append(System.IO.Path.GetDirectoryName(name));
            sb.Append(@"\");

            string tmp = System.IO.Path.GetFileNameWithoutExtension(name);
            tmp = tmp.Replace(@":", "");
            tmp = tmp.Replace(@":", "");
            tmp = tmp.Replace(@"[", "");
            tmp = tmp.Replace(@"[", "");
            tmp = tmp.Replace(@"]", "");
            tmp = tmp.Replace(@"]", "");
            sb.Append(tmp);

            sb.Append(System.IO.Path.GetExtension(name));

            return sb.ToString();
        }

        /// <summary>
        /// 閉じる
        /// </summary>
        /// <param name="saveChanges">true:変更を保存して閉じる</param>
        public void Close(bool saveChanges = false)
        {
            Workbook.Close(saveChanges);
        }

        #endregion

        #region Worksheet

        /// <summary>
        /// Sheet取得
        /// </summary>
        /// <param name="index">インデックス</param>
        /// <returns></returns>
        public SheetAccessor GetSheet(int index)
        {
            OfficeExcel.Worksheet worksheet = Sheets[index];

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

            return SheetAccessor.GetAccessor(worksheet, Application);
        }

        /// <summary>
        /// Sheet取得
        /// </summary>
        /// <param name="name">名前</param>
        /// <returns></returns>
        public SheetAccessor GetSheet(string name)
        {
            foreach(OfficeExcel.Worksheet worksheet in Sheets)
            {
                // 解放COMオブジェクト追加
                ReleaseComObjects.Add(worksheet);

                if (worksheet.Name.Equals(name))
                {
                    return SheetAccessor.GetAccessor(worksheet, Application);
                }
            }

            throw new KeyNotFoundException();
        }

        /// <summary>
        /// Sheetを追加
        /// </summary>
        /// <returns></returns>
        public SheetAccessor AddSheet()
        {
            OfficeExcel.Worksheet lastWorksheet = Sheets[Sheets.Count];
            // 解放COMオブジェクト追加
            ReleaseComObjects.Add(lastWorksheet);

            OfficeExcel.Worksheet worksheet = Sheets.Add(System.Type.Missing, lastWorksheet, System.Type.Missing, System.Type.Missing);
            // 解放COMオブジェクト追加
            ReleaseComObjects.Add(worksheet);

            return SheetAccessor.GetAccessor(worksheet, Application);
        }

        /// <summary>
        /// Sheetを追加
        /// </summary>
        /// <param name="name">名前</param>
        /// <returns></returns>
        public SheetAccessor AddSheet(string name)
        {
            SheetAccessor sheet = AddSheet();
            sheet.Name = ConvertIllegalSheetName(name);
            return sheet;
        }

        /// <summary>
        /// 禁則文字変換
        /// 1 )コロン        :
        /// 2 )円記号        ¥
        /// 3 )疑問符        ?
        /// 4 )角カッコ      [ ]
        /// 5 )スラッシュ     /
        /// 6 )アスタリスク  *
        /// </summary>
        /// <param name="name"></param>
        public string ConvertIllegalSheetName(string name)
        {
            string tmp = name;
            tmp = tmp.Replace(@":", "");
            tmp = tmp.Replace(@":", "");
            tmp = tmp.Replace(@"\", "");
            tmp = tmp.Replace(@"¥", "");
            tmp = tmp.Replace(@"?", "");
            tmp = tmp.Replace(@"?", "");
            tmp = tmp.Replace(@"[", "");
            tmp = tmp.Replace(@"[", "");
            tmp = tmp.Replace(@"]", "");
            tmp = tmp.Replace(@"]", "");
            tmp = tmp.Replace(@"/", "");
            tmp = tmp.Replace(@"/", "");
            tmp = tmp.Replace(@"*", "");
            tmp = tmp.Replace(@"*", "");

            return tmp;
        }

        #endregion
    }
}

0 件のコメント:

コメントを投稿