2013年11月24日日曜日

SheetAccessor

using Microsoft.Office.Core;
using OfficeExcel = Microsoft.Office.Interop.Excel;

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

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

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

        #endregion

        #region プロパティ

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

        /// <summary>名前</summary>
        public string Name
        {
            get
            {
                return Worksheet.Name;
            }
            set
            {
                Worksheet.Name = value;
            }
        }

        #endregion

        #region WorkSheet

        /// <summary>
        /// シート-移動
        /// </summary>
        /// <param name="after">指定したシートの後ろへ移動</param>
        public void Move(SheetAccessor after)
        {
            Worksheet.Move(System.Type.Missing, after.Worksheet);
        }

        /// <summary>
        /// シート-コピー
        /// </summary>
        /// <param name="after">指定したシートの後ろへコピー</param>
        public void Copy(SheetAccessor after)
        {
            Worksheet.Copy(System.Type.Missing, after.Worksheet);
        }

        /// <summary>
        /// 選択
        /// </summary>
        public void Select()
        {
            Worksheet.Select();
        }

        #endregion

        #region Cell

        /// <summary>Sheets</summary>
        private OfficeExcel.Range cells;
        /// <summary>Sheets</summary>
        private OfficeExcel.Range Cells
        {
            get
            {
                if (this.cells == null)
                {
                    this.cells = Worksheet.Cells;
                    ReleaseComObjects.Add(this.cells);
                }
                return this.cells;
            }
        }

        /// <summary>
        /// Cell取得
        /// </summary>
        /// <param name="rowIndex">行インデックス</param>
        /// <param name="columnIndex">列インデックス</param>
        /// <returns></returns>
        public CellAccessor GetCell(int rowIndex, int columnIndex)
        {
            OfficeExcel.Range cell = Cells[rowIndex, columnIndex];

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

            return CellAccessor.GetAccessor(cell, Worksheet, Application);
        }
        /// <summary>
        /// Cell取得
        /// </summary>
        /// <param name="row1Index">行1インデックス</param>
        /// <param name="column1Index">列1インデックス</param>
        /// <param name="row2Index">行2インデックス</param>
        /// <param name="column2Index">列2インデックス</param>
        /// <returns></returns>
        public CellAccessor GetCell(int row1Index, int column1Index, int row2Index, int column2Index)
        {
            OfficeExcel.Range cell1 = Cells[row1Index, column1Index];
            // 解放COMオブジェクト追加
            ReleaseComObjects.Add(cell1);

            OfficeExcel.Range cell2 = Cells[row2Index, column2Index];
            // 解放COMオブジェクト追加
            ReleaseComObjects.Add(cell2);

            OfficeExcel.Range range = Worksheet.get_Range(cell1, cell2);
            // 解放COMオブジェクト追加
            ReleaseComObjects.Add(range);

            return CellAccessor.GetAccessor(range, Worksheet, Application);
        }
        /// <summary>
        /// Cell取得
        /// </summary>
        /// <param name="name">名前付き名前</param>
        /// <returns></returns>
        public CellAccessor GetCell(string name)
        {
            OfficeExcel.Range cell = Worksheet.get_Range(name);

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

            return CellAccessor.GetAccessor(cell, Worksheet, Application);
        }
        /// <summary>
        /// Cell取得
        /// </summary>
        /// <param name="name1">名前付きCell1</param>
        /// <param name="name2">名前付きCell2</param>
        /// <returns></returns>
        public CellAccessor GetCell(string name1, string name2)
        {
            OfficeExcel.Range cell = Worksheet.get_Range(name1, name2);

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

            return CellAccessor.GetAccessor(cell, Worksheet, Application);
        }

        #endregion

        #region Shepe

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

        /// <summary>
        /// Shepe取得
        /// </summary>
        /// <returns></returns>
        public ShapeAccessor AddShape(ExcelShapeType shapeType, float left = 0, float top = 0, float width = 0, float height = 0)
        {
            OfficeExcel.Shape shape = Shapes.AddShape((MsoAutoShapeType)shapeType, left, top, width, height);

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

            return ShapeAccessor.GetAccessor(shape, Worksheet, Application);
        }

        /// <summary>
        /// Connector取得
        /// </summary>
        /// <returns></returns>
        public ConnectorAccessor AddConnector(ExcelConnectorType connectorType, float beginX = 0, float beginY = 0, float endX = 0, float endY = 0)
        {
            OfficeExcel.Shape connector = Shapes.AddConnector((MsoConnectorType)connectorType, beginX, beginY, endX, endY);

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

            return ConnectorAccessor.GetAccessor(connector, Application);
        }

        #endregion
    }
}

0 件のコメント:

コメントを投稿