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 件のコメント:
コメントを投稿