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