アプリケーションは、Excelファイルからデータを読み取る必要があります。開発には.Netとc#を使用しています。システムにMS Officeをインストールできません。そのため、私のアプリケーションはExcelファイルの読み取りに失敗し、Excelのdllの読み込み中にエラーをスローします。
Ms officeがインストールされていないシステムのアプリケーションでExcelファイルにアクセスするにはどうすればよいですか?
OleDB
を使用し、データベース内のデータテーブルのようなExcelシートを使用するオプションがあります...
ほんの一例.....
string con =
@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\temp\test.xls;" +
@"Extended Properties='Excel 8.0;HDR=Yes;'";
using(OleDbConnection connection = new OleDbConnection(con))
{
connection.Open();
OleDbCommand command = new OleDbCommand("select * from [Sheet1$]", connection);
using(OleDbDataReader dr = command.ExecuteReader())
{
while(dr.Read())
{
var row1Col0 = dr[0];
Console.WriteLine(row1Col0);
}
}
}
この例では、Microsoft.Jet.OleDb.4.0
プロバイダーを使用してExcelファイルを開いて読み取ります。ただし、ファイルのタイプが(xlsx)の場合(Excel 2007以降)、 Microsoft Access Database Engine コンポーネントをダウンロードして、ターゲットマシンにインストールする必要があります。
プロバイダーはMicrosoft.ACE.OLEDB.12.0;
と呼ばれます。このコンポーネントには、32ビット用と64ビット用の2つのバージョンがあることに注意してください。アプリケーションのビット数とインストールされているOfficeのバージョン(存在する場合)に適したものを選択します。そのドライバーをアプリケーションで正しく動作させるには、多くの癖があります。 例についてはこの質問を参照 。
もちろん、ターゲットマシンにOfficeをインストールする必要はありません。
このアプローチにはいくつかのメリットがありますが、質問のコメントによって通知されるリンクに特に注意を払う必要があると思います C#からExcelファイルを読み取る 。データ型の正しい解釈に関して、および単一のExcelセルに存在するデータの長さが255文字を超える場合、いくつかの問題があります。
Excel 97-2003ファイル(xls)を読み取るためのCSharpJExcel: http://sourceforge.net/projects/jexcelapi/
およびExcel 2007/2010ファイルを読み込むためのExcelPackage(Office Open XML形式、xlsx): http://excelpackage.codeplex.com/
およびExcelDataReader、これは両方の形式を処理する機能を持っているようです: https://github.com/ExcelDataReader/ExcelDataReader
がんばろう!
これをテストするマシンはありませんが、動作するはずです。最初に 2007 Office System Driver:Data Connectivity Components または Microsoft Access Database Engine 2010 Redistributable をインストールする必要があります。次に、次のコードを試してください。Excelファイルのシート名と一致するように、以下のSelectステートメントでシートの名前を変更する必要があることに注意してください。
using System.Data;
using System.Data.OleDb;
namespace Data_Migration_Process_Creator
{
class Class1
{
private DataTable GetDataTable(string sql, string connectionString)
{
DataTable dt = null;
using (OleDbConnection conn = new OleDbConnection(connectionString))
{
conn.Open();
using (OleDbCommand cmd = new OleDbCommand(sql, conn))
{
using (OleDbDataReader rdr = cmd.ExecuteReader())
{
dt.Load(rdr);
return dt;
}
}
}
}
private void GetExcel()
{
string fullPathToExcel = "<Path to Excel file>"; //ie C:\Temp\YourExcel.xls
string connString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 12.0;HDR=yes'", fullPathToExcel);
DataTable dt = GetDataTable("SELECT * from [SheetName$]", connString);
foreach (DataRow dr in dt.Rows)
{
//Do what you need to do with your data here
}
}
}
}
注:これをテストする環境はありません(Officeがインストールされている環境)。環境で動作するかどうかはわかりませんが、動作しない理由はわかりません。
ExcelファイルをCSVに保存し、 FileHelpers などのCSVリーダーライブラリを使用してC#で結果ファイルを読み取ります。
Excelファイルを.csv
ファイル(カンマ区切り値ファイル)に変換すると、簡単に読み取れるようになります。