web-dev-qa-db-fra.com

Lecture d'un fichier Excel à l'aide du fournisseur de données OLEDB

J'utilise fournisseur de données OLEDB pour lire le fichier Excel, mais le problème est que dans la feuille Excel, certains cloumn ont une valeur non valide, par exemple au lieu de la chaîne de nombre est là, lorsque je lis cette valeur non valide, j'obtiens un chaîne vide au lieu de la valeur réelle.

enter image description here

pour la capture d'écran ci-dessus lorsque je lis la valeur john obtient une chaîne vide.

Existe-t-il un moyen de lire cette valeur non valide?

Toute aide serait appréciée.

Code est pour lire le fichier 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;
            }

        }
    }
}
18
Gajendra

Vous devez définir la valeur de la clé de registre TypeGuessRows sur 0, de cette façon, le pilote définira le type de données en fonction de toutes les valeurs de colonne au lieu des 8 premières (par défaut).

L'emplacement de la clé diffère d'une version à l'autre du pilote, vous pouvez facilement la rechercher sur Google en fonction de votre version spécifique. Par exemple, pour Access Connectivity Engine 2007, il serait

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

Soit dit en passant, vous n'avez pas besoin de Jet pour lire les fichiers XLS, ACE en est parfaitement capable également.

9
Yuriy Galanter

Cela a fonctionné pour moi

        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 remplace la valeur par défaut du Registre et analyse toutes les lignes avant de déterminer les types. IMEX = 1 doit encore être inclus.

Par exemple, étant donné ce tableau:

Header | Header
------ | ------
Cell1  | 2456354
Cell2  | 2456354
Cell3  | 2456354
Cell4  | 2456354
Cell5  | 2456354
Cell6  | 2456354
Cell7  | 2456354
Cell8  | 2456354
Cell9  | A5341

Les chaînes de connexion suivantes perdront 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'"

Mais cela fonctionne quand il a les deux.

9
Adam