26

OLEDB Data Providerを使用して Excel ファイルを読み取っていますが、問題は、Excel シートで数値文字列の代わりに無効な値が含まれていることです。この無効な値を読み取ると、実際の値ではなく空の文字列が取得されます。

ここに画像の説明を入力

空の文字列を取得する値ジョンを読んだときの上記のスクリーンショット。

この無効な値を読み取る方法はありますか?

どんな助けでも大歓迎です。

コードは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;
            }

        }
    }
}
4

2 に答える 2

14

これは私のために働いた

        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'"

しかし、両方があれば機能します。

于 2016-10-20T20:59:50.897 に答える
12

レジストリ キーの値を 0 に設定する必要がありますTypeGuessRows。これにより、ドライバーは最初の 8 つ (デフォルト) ではなく、すべての列の値に基づいてデータ型を設定します。

キーの場所はドライバーのバージョンによって異なります。特定のバージョンに基づいて簡単に Google で検索できます。たとえば、Access Connectivity Engine 2007 の場合は次のようになります。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\Access Connectivity Engine\Engines\Excel

ところで、XLS ファイルを読み取るのに Jet は必要ありません。ACE はこれも完全に実行できます。

于 2013-08-29T12:58:40.850 に答える