C#から複数バージョンのEXCELへアクセスする方法

更新日:

C#からEXCELへアクセスする方法を紹介します。

簡単にEXCELへアクセスする方法をよく見かけますが、EXCELのバージョンは固定バージョンしかアクセスできない例がほとんどです。

VisualC++をやっていた方は、とても困ります。

C#のプログラムを修正せずに、どのEXCELバージョンでもアクセスできる方法を教えます。

メリットはEXCELがどんどんバージョンアップして最新版を使っても、C#プログラムはコードの修正をしなくても使えます。

C#はバージョン2010以上が対象。

暗黙の宣言 dynamic が使えるようになってできるようになりました。

記述しているEXCEL命令は、EXCELVBAマクロを参照してください。

不要パラメータは「Type.Missing」を設定します。

関数は各種よく使う物を記載しています。

  • 指定シートを探索してCSV保存
  • 先頭シートの印刷
  • あらかじめプログラムでクリップボードへコピーした内容をEXCELの先頭シートへ貼り付け。また値を特定セルへ設定
  • 先頭シートの指定セル範囲の値を取得
  • 指定EXCELファイルを起動

(補足1)EXCEL命令は間違っていてもコンパイルエラーにはなりません。実行時エラーしか確認できませんので注意してください。COM、OLEなので。

(補足2)たくさんのセル内容をプログラムへ取得したり、設定する場合は、個々のセルとアクセスするよりも、クリップボードを使った方が高速に処理できます。

スポンサーリンク

ちょっと見づらくてすいません、うまいことHTMLでかけませんでした。そのままコピーしてclassファイルにすれば使えます。ただし、{、}の位置を修正する必要があります。

コード開始

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace ExcelAccessReport
{
public class ExcelManager
{
Type t = Type.GetTypeFromProgID("Excel.Application");

dynamic xlApplication = null;
dynamic xlBooks = null;
dynamic xlBook = null;
dynamic xlSheets = null;
dynamic xlSheet = null;
dynamic xlRange = null;

int XLFormat_XLCSV = 6;
public ExcelManager()
{
}
/// <summary>
/// 指定EXCELファイルのパラメータシート名を検索し、
/// CSVファイルとして保存する
/// </summary>
/// <param name="strExcelFileName"></param>
/// <param name="strSheetName"></param>
/// <param name="strCSVFileName"></param>
/// <param name="strMsg"></param>
/// <returns></returns>
public void CSVSave(string strExcelFileName, string strSheetName,string strCSVFileName)
{
try
{

xlApplication = Activator.CreateInstance(t);
xlApplication.DisplayAlerts = false;
xlBooks = xlApplication.Workbooks;

xlBook = xlBooks.Open(strExcelFileName);
xlSheets = xlBook.Sheets;

int nSheetCnt = xlSheets.Count();
bool bSearch = false;

for (int i = 1; i <= nSheetCnt; i++)
{
xlSheet = xlApplication.Sheets[i];
string strName = (string)xlSheet.Name();
if (strName == strSheetName)
{
bSearch = true;
break;
}
}
if (bSearch == false)
{
throw new Exception("指定のシート名はありません");
}

xlSheet.Activate();

xlBook.SaveAs(strCSVFileName, XLFormat_XLCSV);

}
catch (Exception ex)
{
throw new Exception("CSV保存失敗:" + ex.Message);
}
finally
{

// COM オブジェクトの参照カウントを解放する
if (xlRange != null)
{
Marshal.ReleaseComObject(xlRange);
xlRange = null;
}
if (xlSheet != null)
{
Marshal.ReleaseComObject(xlSheet);
xlSheet = null;
}
if (xlSheets != null)
{
Marshal.ReleaseComObject(xlSheets);
xlSheets = null;
}
if (xlBook != null)
{
Marshal.ReleaseComObject(xlBook);
xlBook = null;
}
if (xlBooks != null)
{
Marshal.ReleaseComObject(xlBooks);
xlBooks = null;
}

xlApplication.Quit();
xlApplication.DisplayAlerts = true;

if (xlApplication != null)
{
Marshal.ReleaseComObject(xlApplication);
xlApplication = null;
}
GC.Collect();
}
}
/// <summary>
/// 指定EXCELファイルの先頭シートを印刷
/// </summary>
/// <param name="strExcelFileName">EXCELファイル名</param>
/// <returns></returns>
public void Print(string strExcelFileName)
{
try
{

xlApplication = Activator.CreateInstance(t);
xlApplication.DisplayAlerts = false;
xlBooks = xlApplication.Workbooks;
xlBook = xlBooks.Open(strExcelFileName);
xlSheets = xlBook.Sheets;

int nSheetCnt = xlSheets.Count();
xlSheet = xlApplication.Sheets[1];

xlSheet.PrintOut(Type.Missing, Type.Missing, 1, Type.Missing,
Type.Missing, Type.Missing, true, Type.Missing);

}
catch (Exception ex)
{
throw new Exception("EXCEL印刷失敗:" + ex.Message);
}
finally
{
// COM オブジェクトの参照カウントを解放する
if (xlRange != null)
{
Marshal.ReleaseComObject(xlRange);
xlRange = null;
}
if (xlSheet != null)
{
Marshal.ReleaseComObject(xlSheet);
xlSheet = null;
}
if (xlSheets != null)
{
Marshal.ReleaseComObject(xlSheets);
xlSheets = null;
}
if (xlBook != null)
{
Marshal.ReleaseComObject(xlBook);
xlBook = null;
}
if (xlBooks != null)
{
Marshal.ReleaseComObject(xlBooks);
xlBooks = null;
}

xlApplication.Quit();
xlApplication.DisplayAlerts = true;

if (xlApplication != null)
{
Marshal.ReleaseComObject(xlApplication);
xlApplication = null;
}
GC.Collect();
}

}

/// <summary>
/// 当ソフトであらかじめクリップボードコピーしたテキストデータを
/// 指定のEXCELファイルの先頭シートへ貼り付け
/// 貼り付け開始セルA13
/// セルA5にパラメータ日付を設定
/// </summary>
/// <param name="strExcelFileName">EXCELファイル名</param>
/// <param name="strDate">日付</param>
/// <returns></returns>
public void Paste(string strExcelFileName,string strDate)
{
try
{

xlApplication = Activator.CreateInstance(t);
xlApplication.DisplayAlerts = false;
xlBooks = xlApplication.Workbooks;

xlBook = xlBooks.Open(strExcelFileName);
xlSheets = xlBook.Sheets;

int nSheetCnt = xlSheets.Count();
xlSheet = xlApplication.Sheets[1];

xlRange = xlSheet.Range("A13");
xlRange.Select();

xlSheet.Paste();

xlRange = xlSheet.Range("A5");
xlRange.Select();
xlRange.Value2 = strDate;

xlBook.Save();

}
catch (Exception ex)
{
throw new Exception("EXCEL作成失敗:" + ex.Message);
}
finally
{
// COM オブジェクトの参照カウントを解放する
if (xlRange != null)
{
Marshal.ReleaseComObject(xlRange);
xlRange = null;
}
if (xlSheet != null)
{
Marshal.ReleaseComObject(xlSheet);
xlSheet = null;
}
if (xlSheets != null)
{
Marshal.ReleaseComObject(xlSheets);
xlSheets = null;
}
if (xlBook != null)
{
Marshal.ReleaseComObject(xlBook);
xlBook = null;
}
if (xlBooks != null)
{
Marshal.ReleaseComObject(xlBooks);
xlBooks = null;
}

xlApplication.Quit();
xlApplication.DisplayAlerts = true;

if (xlApplication != null)
{
Marshal.ReleaseComObject(xlApplication);
xlApplication = null;
}
GC.Collect();
}

}
/// <summary>
/// 指定のEXCELファイルの先頭シートのデータを取得
/// セルA38からR41までをレンジ指定して一挙に取得
/// </summary>
/// <param name="strExcelFileName">EXCELファイル名</param>
/// <param name="aryData">格納配列</param>
/// <returns></returns>
public void GetData(string strExcelFileName,ref double[] aryData)
{
try
{

xlApplication = Activator.CreateInstance(t);
xlApplication.DisplayAlerts = false;
xlBooks = xlApplication.Workbooks;
xlBook = xlBooks.Open(strExcelFileName);
xlSheets = xlBook.Sheets;

int nSheetCnt = xlSheets.Count();
xlSheet = xlApplication.Sheets[1];
xlRange = xlSheet.Range("A38","R41");

object[,] values = xlRange.Value2 as object[,];

aryData[0] = (double)values[4, 2];//CH1
aryData[1] = (double)values[1, 3];//CH1
aryData[2] = (double)values[2, 4];//CH1
aryData[3] = (double)values[4, 5];//CH2
aryData[4] = (double)values[1, 6];//CH2
aryData[5] = (double)values[2, 7];//CH2
aryData[6] = (double)values[3, 8];//CH3
aryData[7] = (double)values[3, 9];//CH4
aryData[8] = (double)values[3, 10];//CH5
aryData[9] = (double)values[3, 11];//CH6
aryData[10] = (double)values[4, 12];//CH7
aryData[11] = (double)values[4, 13];//CH8
aryData[12] = (double)values[4, 14];//CH9
aryData[13] = (double)values[4, 15];//CH10
aryData[14] = (double)values[4, 16];//CH11
aryData[15] = (double)values[4, 17];//CH12
aryData[16] = (double)values[4, 18];//CH13

}
catch (Exception ex)
{
throw new Exception("EXCEL値取得失敗:" + ex.Message);
}
finally
{
// COM オブジェクトの参照カウントを解放する
if (xlRange != null)
{
Marshal.ReleaseComObject(xlRange);
xlRange = null;
}
if (xlSheet != null)
{
Marshal.ReleaseComObject(xlSheet);
xlSheet = null;
}
if (xlSheets != null)
{
Marshal.ReleaseComObject(xlSheets);
xlSheets = null;
}
if (xlBook != null)
{
Marshal.ReleaseComObject(xlBook);
xlBook = null;
}
if (xlBooks != null)
{
Marshal.ReleaseComObject(xlBooks);
xlBooks = null;
}

xlApplication.Quit();
xlApplication.DisplayAlerts = true;

if (xlApplication != null)
{
Marshal.ReleaseComObject(xlApplication);
xlApplication = null;
}
GC.Collect();
}
}

/// <summary>
/// 指定のEXCELファイルを最大表示で起動
/// </summary>
/// <param name="strFileName">EXCELファイル名</param>
public void DisplayExcel(string strFileName)
{
Process _Process = new Process();
try
{
_Process.StartInfo.UseShellExecute = true;
_Process.StartInfo.FileName = strFileName;
_Process.StartInfo.CreateNoWindow = true;
_Process.StartInfo.WindowStyle = ProcessWindowStyle.Maximized;
_Process.Start();
}
catch (Exception)
{
}
finally
{
_Process.Close();
_Process.Dispose();
}
}
}
}

コード完了

以上 参考になればうれしい限りです。

スポンサーリンク


ところで、あなたはプログラミングするときに「クラス」、「クラスの継承」、「クラスの仮想関数」とか理解されてますか。
もしかして、VisualStudioの提供するWindow関数だけでプログラミングしていませんよね。
データ設計する場合、クラス設計していますよね、当然継承、仮想関数も理解しているはず。

もし、やみくもにプログラミングしているなら、下記の本を一度参考にしてください。
C#だけでなく、JAVA、PHP、Object-C、phytonなどいろんなプログラミング言語で「クラス」は知っておくべき内容です。

特にプログラミング初心者の方は、C++の入門書とクラスの継承は学んでください。
でないと、のちのちとっても苦労します。

C クラスと継承完全制覇 (標準プログラマーズライブラリ)


最後までありがとうございました。

仕事がスケジュールどおりに進むように願ってます。

-IT・スマホ
-,

Copyright© とげとげ情報局 , 2019 All Rights Reserved.