私はOLEDB Data Providerを使用してExcelファイルを読み取りますが、問題はExcelシートの一部のcloumnに数値文字列の代わりに無効な値があるということです。この無効な値を読み取ると、実際の値の代わりに空の文字列。
空の文字列を取得する値johnを読み取ったときの上記のスクリーンショット。
この無効な値を読み取る方法はありますか?
任意の助けをいただければ幸いです。
コードはExcelファイルを読み取ることです
private DataTable ReadExcelFile(string sheetName, string path)
{
using (OleDbConnection conn = new OleDbConnection())
{
DataTable dt = new DataTable();
string Import_FileName = path;
string fileExtension = Path.GetExtension(Import_FileName);
if (fileExtension == ".xls")
conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Import_FileName + ";" + "Extended Properties='Excel 8.0;HDR=YES;'";
if (fileExtension == ".xlsx")
conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Import_FileName + ";" + "Extended Properties='Excel 12.0 Xml;HDR=YES;'";
using (OleDbCommand comm = new OleDbCommand())
{
comm.CommandText = "Select * from [" + sheetName + "$]";
comm.Connection = conn;
using (OleDbDataAdapter da = new OleDbDataAdapter())
{
da.SelectCommand = comm;
da.Fill(dt);
return dt;
}
}
}
}
TypeGuessRows
レジストリキーの値を0に設定する必要があります。これにより、ドライバーは最初の8(デフォルト)ではなく、すべての列の値に基づいてデータ型を設定します。
キーの場所はドライバーのバージョンによって異なります。特定のバージョンに基づいて簡単にGoogleで確認できます。たとえば、Access Connectivity Engine 2007の場合は次のようになります
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\Access Connectivity Engine\Engines\Excel
ちなみに、XLSファイルを読み込むのにJetは必要ありません。ACEも同様にこれに完全に対応しています。
これは私のために働いた
using (OleDbConnection conn = new OleDbConnection())
{
DataTable dt = new DataTable();
conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path
+ ";Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1;MAXSCANROWS=0'";
using (OleDbCommand comm = new OleDbCommand())
{
comm.CommandText = "Select * from [" + sheetName + "$]";
comm.Connection = conn;
using (OleDbDataAdapter da = new OleDbDataAdapter())
{
da.SelectCommand = comm;
da.Fill(dt);
return dt;
}
}
}
MAXSCANROWS = 0は、レジストリのデフォルトをオーバーライドし、タイプを決定する前にすべての行をスキャンします。 IMEX = 1を含める必要があります。
たとえば、次の表を考えます:
Header | Header
------ | ------
Cell1 | 2456354
Cell2 | 2456354
Cell3 | 2456354
Cell4 | 2456354
Cell5 | 2456354
Cell6 | 2456354
Cell7 | 2456354
Cell8 | 2456354
Cell9 | A5341
次の接続文字列はA5341を失います
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path
+ ";Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1;'"
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path
+ ";Extended Properties='Excel 12.0 Xml;HDR=YES;MAXSCANROWS=0'"
ただし、両方がある場合に機能します。