OVH Cloud OVH Cloud

Lecture de données Excel en C# avec oledb

5 réponses
Avatar
Claude Cap
Bonjour,

Si dans mon fichier excel les 8 premières lignes d'une de mes colonnes ne
sont pas renseignées, toutes les valeurs de cette colonne seront nulles dans
mon DataTable.

Quelqu'un sait-il pourquoi ?
Merci.

Voici un exemple du code :
------------------------------
string ExcelConnectionStr = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data
Source=" + HttpContext.Current.Server.MapPath(FileNameExcel) + ";Extended
Properties=Excel 8.0;";

OleDbConnection con = new OleDbConnection(ExcelConnectionStr);
OleDbDataAdapter da = new OleDbDataAdapter();

con.Open();
OleDbCommand cmdSelect = new OleDbCommand("SELECT * FROM [" + RangeStr +
"]", con);
da.SelectCommand = cmdSelect;
DataSet ds = new DataSet();
DataTable dt = ds.Tables.Add("result");
da.Fill(ds, "result");
return dt;

5 réponses

Avatar
Bonjour,

a tout hasard le provider voit la premières ligne vide il considère qu'il ne
s'agit pas d'une colonne de base de données

essayez en mettant un caractère (espace devrait suffire) pour faire le test

Sebastien


"Claude Cap" a écrit dans le message de
news:%
Bonjour,

Si dans mon fichier excel les 8 premières lignes d'une de mes colonnes ne
sont pas renseignées, toutes les valeurs de cette colonne seront nulles


dans
mon DataTable.

Quelqu'un sait-il pourquoi ?
Merci.

Voici un exemple du code :
------------------------------
string ExcelConnectionStr = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data
Source=" + HttpContext.Current.Server.MapPath(FileNameExcel) + ";Extended
Properties=Excel 8.0;";

OleDbConnection con = new OleDbConnection(ExcelConnectionStr);
OleDbDataAdapter da = new OleDbDataAdapter();

con.Open();
OleDbCommand cmdSelect = new OleDbCommand("SELECT * FROM [" + RangeStr +
"]", con);
da.SelectCommand = cmdSelect;
DataSet ds = new DataSet();
DataTable dt = ds.Tables.Add("result");
da.Fill(ds, "result");
return dt;




Avatar
Claude Cap
En effet j'ai déjà penser à ce genre de solution de contournement, mais
étant donné que les feuilles excels peuvent être saisies par de multiples
utilisateurs de mon client, je me vois mal leur expliquer qu'il faut faire
ce genre de manipulation à chaque édition de nouvelle feuille.

J'aurais préféré une solution plus "propre", n'y aurait-il pas un
paramètrage quelque part qui supprimerai cette vérification du moteur OLEDB
(si toutefois le problème vient bien de là).

Merci.


a écrit dans le message de
news:%
Bonjour,

a tout hasard le provider voit la premières ligne vide il considère qu'il


ne
s'agit pas d'une colonne de base de données

essayez en mettant un caractère (espace devrait suffire) pour faire le


test

Sebastien


"Claude Cap" a écrit dans le message de
news:%
> Bonjour,
>
> Si dans mon fichier excel les 8 premières lignes d'une de mes colonnes


ne
> sont pas renseignées, toutes les valeurs de cette colonne seront nulles
dans
> mon DataTable.
>
> Quelqu'un sait-il pourquoi ?
> Merci.
>
> Voici un exemple du code :
> ------------------------------
> string ExcelConnectionStr = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data
> Source=" + HttpContext.Current.Server.MapPath(FileNameExcel) +


";Extended
> Properties=Excel 8.0;";
>
> OleDbConnection con = new OleDbConnection(ExcelConnectionStr);
> OleDbDataAdapter da = new OleDbDataAdapter();
>
> con.Open();
> OleDbCommand cmdSelect = new OleDbCommand("SELECT * FROM [" + RangeStr +
> "]", con);
> da.SelectCommand = cmdSelect;
> DataSet ds = new DataSet();
> DataTable dt = ds.Tables.Add("result");
> da.Fill(ds, "result");
> return dt;
>
>




Avatar
personnellement je traite quelque fichiers excel (une trentaine) et je me
préoccupe toujours de les nettoyer avant de les injecter ne serait ce que
parce que certains ne pourrait pas rentrer dans des tables de bases de
données du fait du nom respect des contraintes donc je ne me suis jamais
penché sur la question.

il y a aussi la possibilité de mette une macro dans le fichier excel qui
fait le nettoyage

Eventuellement en définissant un dataset fortement typé

Malheureusement je ne vois pas de commande au niveau du provider permettant
d'ignorer les null si d'ailleur le problème se trouve bien au niveau du
provider

Sebastien

"Claude Cap" a écrit dans le message de
news:
En effet j'ai déjà penser à ce genre de solution de contournement, mais
étant donné que les feuilles excels peuvent être saisies par de multiples
utilisateurs de mon client, je me vois mal leur expliquer qu'il faut faire
ce genre de manipulation à chaque édition de nouvelle feuille.

J'aurais préféré une solution plus "propre", n'y aurait-il pas un
paramètrage quelque part qui supprimerai cette vérification du moteur


OLEDB
(si toutefois le problème vient bien de là).

Merci.


a écrit dans le message de
news:%
> Bonjour,
>
> a tout hasard le provider voit la premières ligne vide il considère


qu'il
ne
> s'agit pas d'une colonne de base de données
>
> essayez en mettant un caractère (espace devrait suffire) pour faire le
test
>
> Sebastien
>
>
> "Claude Cap" a écrit dans le message de
> news:%
> > Bonjour,
> >
> > Si dans mon fichier excel les 8 premières lignes d'une de mes colonnes
ne
> > sont pas renseignées, toutes les valeurs de cette colonne seront


nulles
> dans
> > mon DataTable.
> >
> > Quelqu'un sait-il pourquoi ?
> > Merci.
> >
> > Voici un exemple du code :
> > ------------------------------
> > string ExcelConnectionStr = "Provider=Microsoft.Jet.OLEDB.4.0;" +


"Data
> > Source=" + HttpContext.Current.Server.MapPath(FileNameExcel) +
";Extended
> > Properties=Excel 8.0;";
> >
> > OleDbConnection con = new OleDbConnection(ExcelConnectionStr);
> > OleDbDataAdapter da = new OleDbDataAdapter();
> >
> > con.Open();
> > OleDbCommand cmdSelect = new OleDbCommand("SELECT * FROM [" + RangeStr


+
> > "]", con);
> > da.SelectCommand = cmdSelect;
> > DataSet ds = new DataSet();
> > DataTable dt = ds.Tables.Add("result");
> > da.Fill(ds, "result");
> > return dt;
> >
> >
>
>




Avatar
Axel Guerrier [MS]
Bonjour,

En fait, il s'agit d'une propriété du moteur Jet.
Celui ci détermine le format d'une colonne suivant les 8 premières lignes
par défaut.
Ex.: 8 string --> toute la colonne est en string, même si le reste est
integer.

Clé de registre :
HKEY_LOCAL_MACHINESOFTWAREMicrosoftJet4.0EnginesExcel

modifie TypeGuessRows

sinon:
194124 PRB: Excel Values Returned as NULL Using DAO OpenRecordset
http://support.microsoft.com/?id4124

--
Axel GUERRIER
Microsoft France
--------------------
Merci de bien vouloir répondre à ce message dans le newsgroup où il a été
posté. Je le consulte régulièrement.

"Claude Cap" wrote in message
news:%
Bonjour,

Si dans mon fichier excel les 8 premières lignes d'une de mes colonnes ne
sont pas renseignées, toutes les valeurs de cette colonne seront nulles


dans
mon DataTable.

Quelqu'un sait-il pourquoi ?
Merci.

Voici un exemple du code :
------------------------------
string ExcelConnectionStr = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data
Source=" + HttpContext.Current.Server.MapPath(FileNameExcel) + ";Extended
Properties=Excel 8.0;";

OleDbConnection con = new OleDbConnection(ExcelConnectionStr);
OleDbDataAdapter da = new OleDbDataAdapter();

con.Open();
OleDbCommand cmdSelect = new OleDbCommand("SELECT * FROM [" + RangeStr +
"]", con);
da.SelectCommand = cmdSelect;
DataSet ds = new DataSet();
DataTable dt = ds.Tables.Add("result");
da.Fill(ds, "result");
return dt;




Avatar
Claude Cap
Merci,
En effet en changeant la valeur dans la base de registre cela fonctionne.

Reste-t'il possible de faire ignorer au moteur ce test ?

Mon nombre de ligne reste variable, j'ai donc mis une valeur correspondant à
une moyenne du nombre de lignes possibles : 500 au lieu du 8.
Les premiers tests ont l'air de bien fonctionner, mais je reste craintif
quant au performance.

Ai-je raison de m'inquiéter ?


"Axel Guerrier [MS]" a écrit dans le message de
news:
Bonjour,

En fait, il s'agit d'une propriété du moteur Jet.
Celui ci détermine le format d'une colonne suivant les 8 premières lignes
par défaut.
Ex.: 8 string --> toute la colonne est en string, même si le reste est
integer.

Clé de registre :
HKEY_LOCAL_MACHINESOFTWAREMicrosoftJet4.0EnginesExcel

modifie TypeGuessRows

sinon:
194124 PRB: Excel Values Returned as NULL Using DAO OpenRecordset
http://support.microsoft.com/?id4124

--
Axel GUERRIER
Microsoft France
--------------------
Merci de bien vouloir répondre à ce message dans le newsgroup où il a été
posté. Je le consulte régulièrement.

"Claude Cap" wrote in message
news:%
> Bonjour,
>
> Si dans mon fichier excel les 8 premières lignes d'une de mes colonnes


ne
> sont pas renseignées, toutes les valeurs de cette colonne seront nulles
dans
> mon DataTable.
>
> Quelqu'un sait-il pourquoi ?
> Merci.
>
> Voici un exemple du code :
> ------------------------------
> string ExcelConnectionStr = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data
> Source=" + HttpContext.Current.Server.MapPath(FileNameExcel) +


";Extended
> Properties=Excel 8.0;";
>
> OleDbConnection con = new OleDbConnection(ExcelConnectionStr);
> OleDbDataAdapter da = new OleDbDataAdapter();
>
> con.Open();
> OleDbCommand cmdSelect = new OleDbCommand("SELECT * FROM [" + RangeStr +
> "]", con);
> da.SelectCommand = cmdSelect;
> DataSet ds = new DataSet();
> DataTable dt = ds.Tables.Add("result");
> da.Fill(ds, "result");
> return dt;
>
>