2013年11月24日日曜日

CellAccessor

using OfficeExcel = Microsoft.Office.Interop.Excel;

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

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

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

        #endregion

        #region プロパティ

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

        #endregion

        #region Cell

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

        /// <summary>値</summary>
        public string Value
        {
            get
            {
                return Cell.Value2;
            }
            set
            {
                Cell.Value2 = value;
            }
        }

        /// <summary>表示形式</summary>
        public string NumberFormatLocal
        {
            get
            {
                return Cell.NumberFormatLocal;
            }
            set
            {
                Cell.NumberFormatLocal = value;
            }
        }

        /// <summary>列幅</summary>
        public dynamic ColumnWidth
        {
            get
            {
                return Cell.ColumnWidth;
            }
            set
            {
                Cell.ColumnWidth = value;
            }
        }

        /// <summary>行高さ</summary>
        public dynamic RowHeight
        {
            get
            {
                return Cell.RowHeight;
            }
            set
            {
                Cell.RowHeight = value;
            }
        }

        /// <summary>Merge</summary>
        public void Merge()
        {
            Cell.Merge();
        }

        /// <summary>Merge</summary>
        public void Merge(CellAccessor cell)
        {
            OfficeExcel.Range range = Worksheet.get_Range(Cell, cell.Cell);

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

            range.Merge();
        }

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

        /// <summary>
        /// ウィンドウ枠を固定
        /// <セルの左上を基準にして、ウィンドウ枠を固定します。>
        /// </summary>
        public void FreezePanes()
        {
            Application.FreezePanes = false;
            Cell.Select();
            Application.FreezePanes = true;
        }

        #endregion

        #region 配置

        /// <summary>文字の配置-横位置</summary>
        public ExcelHAlign HorizontalAlignment
        {
            get
            {
                return Cell.HorizontalAlignment;
            }
            set
            {
                Cell.HorizontalAlignment = value;
            }
        }

        /// <summary>文字の配置-縦配置</summary>
        public ExcelVAlign VerticalAlignment
        {
            get
            {
                return Cell.VerticalAlignment;
            }
            set
            {
                Cell.VerticalAlignment = value;
            }
        }

        /// <summary>文字の配置-インデント</summary>
        public int IndentLevel
        {
            get
            {
                return Cell.IndentLevel;
            }
            set
            {
                Cell.IndentLevel = value;
            }
        }

        /// <summary>文字の配置-方向</summary>
        public int Orientation
        {
            get
            {
                return Cell.Orientation;
            }
            set
            {
                Cell.Orientation = value;
            }
        }

        /// <summary>文字の配置-文字の制御-折り返して全体を表示する</summary>
        public bool WrapText
        {
            get
            {
                return Cell.WrapText;
            }
            set
            {
                Cell.WrapText = value;
            }
        }

        /// <summary>文字の配置-文字の制御-縮小して全体を表示する</summary>
        public bool ShrinkToFit
        {
            get
            {
                return Cell.ShrinkToFit;
            }
            set
            {
                Cell.ShrinkToFit = value;
            }
        }

        /// <summary>文字の配置-文字の制御-セルを結合する</summary>
        public bool MergeCells
        {
            get
            {
                return Cell.MergeCells;
            }
            set
            {
                Cell.MergeCells = value;
            }
        }

        #endregion

        #region Font

        /// <summary>Font</summary>
        private FontAccessor font;
        /// <summary>Font</summary>
        public FontAccessor Font
        {
            get
            {
                if (this.font == null)
                {
                    OfficeExcel.Font font = Cell.Font;
                    ReleaseComObjects.Add(font);

                    this.font = FontAccessor.GetAccessor(font);
                }
                return this.font;
            }
        }

        #endregion

        #region Interior

        /// <summary>Interior</summary>
        private OfficeExcel.Interior interior;
        /// <summary>Interior</summary>
        private OfficeExcel.Interior Interior
        {
            get
            {
                if (this.interior == null)
                {
                    this.interior = Cell.Interior;
                    ReleaseComObjects.Add(this.interior);
                }
                return this.interior;
            }
        }

        /// <summary>背景色</summary>
        public dynamic Color
        {
            get
            {
                return Interior.Color;
            }
            set
            {
                Interior.Color = value;
            }
        }

        /// <summary>背景色</summary>
        public int ColorIndex
        {
            get
            {
                return Interior.ColorIndex;
            }
            set
            {
                Interior.ColorIndex = value;
            }
        }

        #endregion

        #region Borders

        /// <summary>Borders</summary>
        private OfficeExcel.Borders borders;
        /// <summary>Borders</summary>
        private OfficeExcel.Borders Borders
        {
            get
            {
                if (this.borders == null)
                {
                    this.borders = Cell.Borders;
                    ReleaseComObjects.Add(this.borders);
                }
                return this.borders;
            }
        }

        /// <summary>上端横線</summary>
        private BorderAccessor borderEdgeTop;
        /// <summary>上端横線</summary>
        public BorderAccessor BorderEdgeTop
        {
            get
            {
                if (this.borderEdgeTop == null)
                {
                    OfficeExcel.Border border = Borders.get_Item(OfficeExcel.XlBordersIndex.xlEdgeTop);
                    ReleaseComObjects.Add(border);

                    this.borderEdgeTop = BorderAccessor.GetAccessor(border);
                }
                return this.borderEdgeTop;
            }
        }

        /// <summary>下端横線</summary>
        private BorderAccessor borderEdgeBottom;
        /// <summary>下端横線</summary>
        public BorderAccessor BorderEdgeBottom
        {
            get
            {
                if (this.borderEdgeBottom == null)
                {
                    OfficeExcel.Border border = Borders.get_Item(OfficeExcel.XlBordersIndex.xlEdgeBottom);
                    ReleaseComObjects.Add(border);

                    this.borderEdgeBottom = BorderAccessor.GetAccessor(border);
                }
                return this.borderEdgeBottom;
            }
        }

        /// <summary>左端縦線</summary>
        private BorderAccessor borderEdgeLeft;
        /// <summary>左端縦線</summary>
        public BorderAccessor BorderEdgeLeft
        {
            get
            {
                if (this.borderEdgeLeft == null)
                {
                    OfficeExcel.Border border = Borders.get_Item(OfficeExcel.XlBordersIndex.xlEdgeLeft);
                    ReleaseComObjects.Add(border);

                    this.borderEdgeLeft = BorderAccessor.GetAccessor(border);
                }
                return this.borderEdgeLeft;
            }
        }

        /// <summary>右端縦線</summary>
        private BorderAccessor borderEdgeRight;
        /// <summary>右端縦線</summary>
        public BorderAccessor BorderEdgeRight
        {
            get
            {
                if (this.borderEdgeRight == null)
                {
                    OfficeExcel.Border border = Borders.get_Item(OfficeExcel.XlBordersIndex.xlEdgeRight);
                    ReleaseComObjects.Add(border);

                    this.borderEdgeRight = BorderAccessor.GetAccessor(border);
                }
                return this.borderEdgeRight;
            }
        }

        /// <summary>上下端以外横線</summary>
        private BorderAccessor borderInsideHorizontal;
        /// <summary>上下端以外横線</summary>
        public BorderAccessor BorderInsideHorizontal
        {
            get
            {
                if (this.borderInsideHorizontal == null)
                {
                    OfficeExcel.Border border = Borders.get_Item(OfficeExcel.XlBordersIndex.xlInsideHorizontal);
                    ReleaseComObjects.Add(border);

                    this.borderInsideHorizontal = BorderAccessor.GetAccessor(border);
                }
                return this.borderInsideHorizontal;
            }
        }

        /// <summary>左右端以外縦線</summary>
        private BorderAccessor borderInsideVertical;
        /// <summary>左右端以外縦線</summary>
        public BorderAccessor BorderInsideVertical
        {
            get
            {
                if (this.borderInsideVertical == null)
                {
                    OfficeExcel.Border border = Borders.get_Item(OfficeExcel.XlBordersIndex.xlInsideVertical);
                    ReleaseComObjects.Add(border);

                    this.borderInsideVertical = BorderAccessor.GetAccessor(border);
                }
                return this.borderInsideVertical;
            }
        }

        /// <summary>右下がり斜線</summary>
        private BorderAccessor borderDiagonalDown;
        /// <summary>右下がり斜線</summary>
        public BorderAccessor BorderDiagonalDown
        {
            get
            {
                if (this.borderDiagonalDown == null)
                {
                    OfficeExcel.Border border = Borders.get_Item(OfficeExcel.XlBordersIndex.xlDiagonalDown);
                    ReleaseComObjects.Add(border);

                    this.borderDiagonalDown = BorderAccessor.GetAccessor(border);
                }
                return this.borderDiagonalDown;
            }
        }

        /// <summary>右上がり斜線</summary>
        private BorderAccessor borderDiagonalUp;
        /// <summary>右上がり斜線</summary>
        public BorderAccessor BorderDiagonalUp
        {
            get
            {
                if (this.borderDiagonalUp == null)
                {
                    OfficeExcel.Border border = Borders.get_Item(OfficeExcel.XlBordersIndex.xlDiagonalUp);
                    ReleaseComObjects.Add(border);

                    this.borderDiagonalUp = BorderAccessor.GetAccessor(border);
                }
                return this.borderDiagonalUp;
            }
        }

        #endregion

        #region Hyperlink

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

        /// <summary>
        /// Hyperlin設定
        /// </summary>
        /// <param name="address"></param>
        public void setHyperlink(string address)
        {
            Hyperlinks.Add(Cell, address);
        }

        #endregion

        #region AutoFilter

        /// <summary>
        /// オートフィルター
        /// </summary>
        /// <param name="field">フィルタの対象となるフィールド番号を整数で指定します。フィールド番号は、リストの左側から始まります。つまり、最も左側にあるフィールドはフィールド番号 1 になります。</param>
        /// <param name="criteria1">抽出条件となる文字列 ("101" など) を指定します。"=" と指定すると、空白セルが抽出され、"<>"※半角文字 と指定すると空白以外のフィールドが抽出されます。この引数を省略すると、抽出条件は All になります。引数 Operator に xlTop10Items が指定されている場合は、引数 Criteria1 に項目数を指定します (たとえば "10")。</param>
        /// <param name="autoFilterOperator"></param>
        /// <param name="criteria2">2 番目の抽出条件となる文字列を指定します。引数 Criteria1 および引数 Operator と組み合わせて使用して、複合抽出条件を指定します。</param>
        /// <param name="visibleDropDown">True を指定すると、フィルタのフィールドでオートフィルタのドロップダウン矢印を表示します。False を指定すると、フィルタのフィールドでオートフィルタのドロップダウン矢印を非表示にします。既定値は True です。</param>
        public void AutoFilter(int field = 1, string criteria1 = "", ExcelAutoFilterOperator autoFilterOperator = ExcelAutoFilterOperator.And, string criteria2 = "", bool visibleDropDown = true)
        {
            object tmpCriteria1 = System.Type.Missing;
            if (string.IsNullOrEmpty(criteria1) == false)
            {
                tmpCriteria1 = criteria1;
            }
            object tmpCriteria2 = System.Type.Missing;
            if (string.IsNullOrEmpty(criteria2) == false)
            {
                tmpCriteria2 = criteria2;
            }
            Cell.AutoFilter(field, tmpCriteria1, (OfficeExcel.XlAutoFilterOperator)autoFilterOperator, tmpCriteria2, visibleDropDown);
        }

        #endregion
    }

    #region 列挙型

    /// <summary>オブジェクトの水平方向の配置</summary>
    public enum ExcelHAlign
    {
        /// <summary>中央</summary>
        HAlignCenter = OfficeExcel.XlHAlign.xlHAlignCenter,
        /// <summary>選択範囲内で中央</summary>
        HAlignCenterAcrossSelection = OfficeExcel.XlHAlign.xlHAlignCenterAcrossSelection,
        /// <summary>均等</summary>
        HAlignDistributed = OfficeExcel.XlHAlign.xlHAlignDistributed,
        /// <summary>繰り返し</summary>
        HAlignFill = OfficeExcel.XlHAlign.xlHAlignFill,
        /// <summary>データ型に応じて配置</summary>
        HAlignGeneral = OfficeExcel.XlHAlign.xlHAlignGeneral,
        /// <summary>両端揃え</summary>
        HAlignJustify = OfficeExcel.XlHAlign.xlHAlignJustify,
        /// <summary>左</summary>
        HAlignLeft = OfficeExcel.XlHAlign.xlHAlignLeft,
        /// <summary>右</summary>
        HAlignRight = OfficeExcel.XlHAlign.xlHAlignRight
    }

    /// <summary>オブジェクトの垂直方向の配置</summary>
    public enum ExcelVAlign
    {
        /// <summary>中央</summary>
        VAlignBottom = OfficeExcel.XlVAlign.xlVAlignBottom,
        /// <summary>選択範囲内で中央</summary>
        VAlignCenter = OfficeExcel.XlVAlign.xlVAlignCenter,
        /// <summary>均等</summary>
        VAlignDistributed = OfficeExcel.XlVAlign.xlVAlignDistributed,
        /// <summary>繰り返し</summary>
        VAlignJustify = OfficeExcel.XlVAlign.xlVAlignJustify,
        /// <summary>右</summary>
        VAlignTop = OfficeExcel.XlVAlign.xlVAlignTop
    }

    /// <summary>フィルタによって適用される 2 つの条件を関連付けるために使用する演算子</summary>
    public enum ExcelAutoFilterOperator
    {
        /// <summary>Criteria1 と Criteria2 の論理 AND</summary>
        And = OfficeExcel.XlAutoFilterOperator.xlAnd,
        /// <summary>表示されている最小値の項目 (Criteria1 で指定した項目数)</summary>
        Bottom10Items = OfficeExcel.XlAutoFilterOperator.xlBottom10Items,
        /// <summary>表示されている最小値の項目 (Criteria1 で指定したパーセンテージ)</summary>
        Bottom10Percent = OfficeExcel.XlAutoFilterOperator.xlBottom10Percent,
        /// <summary>Criteria1 と Criteria2 の論理 OR</summary>
        Or = OfficeExcel.XlAutoFilterOperator.xlOr,
        /// <summary>表示されている最大値の項目 (Criteria1 で指定した項目数)</summary>
        Top10Items = OfficeExcel.XlAutoFilterOperator.xlTop10Items,
        /// <summary>表示されている最大値の項目 (Criteria1 で指定したパーセンテージ)</summary>
        Top10Percent = OfficeExcel.XlAutoFilterOperator.xlTop10Percent,
    }

    #endregion
}

0 件のコメント:

コメントを投稿