[C#] - probleme d'ouverture de fichier Excel

Salut à tous,

Alors voila, je suis en train de développer une petite application de rien du tout pour parcourir des fichiers excels et agréger un certain nombre d’information dans différente datatable.

Pour cela, j’utilise le code suivant :

[code] public DataTable GetfichierFeuilleFichierExcel(string strCheminFichier, string strNomFeuilleExcel)
{
// Chaine de connexion
string strCnx = « Provider=Microsoft.Jet.OLEDB.4.0;Data Source= » + strCheminFichier + « ;Extended Properties= » + (char)34 + « Excel 8.0;HDR=Yes; » + (char)34 + « ; »;
System.Data.DataTable dtRetour = null;
System.Data.OleDb.OleDbConnection oCnx = new System.Data.OleDb.OleDbConnection(strCnx);
System.Data.OleDb.OleDbCommand objCmdSelect = null;
System.Data.OleDb.OleDbDataAdapter objAdapter = null;
System.Data.DataSet oDs = new DataSet();
rt_output.Text += Environment.NewLine + « DEBUG - GetfichierFeuilleFichierExcel - IN - [ » + strCheminFichier + « ] – [ » + strNomFeuilleExcel + « ] » + Environment.NewLine;
// vérification globale des données entrantes
if (strCheminFichier != string.Empty && strNomFeuilleExcel != string.Empty)
{
if (System.IO.File.Exists(strCheminFichier))
{
try
{
// ouvertur de la connexion
oCnx.Open();
// création de la commande
objCmdSelect = new System.Data.OleDb.OleDbCommand(« SELECT * FROM [ » + strNomFeuilleExcel + « $] », oCnx);
objAdapter = new System.Data.OleDb.OleDbDataAdapter();
// on informe de l’instruction SELECT
objAdapter.SelectCommand = objCmdSelect;
// on execute la requete en spécifiant le protocole et on remplit le DataSet
objAdapter.Fill(oDs, « XLData »);
// Vérification du dataset
if (oDs != null && oDs.Tables != null && oDs.Tables.Count > 0)
{
rt_output.Text += « DEBUG - GetfichierFeuilleFichierExcel - Ouverture reussi - dtretour != null » + Environment.NewLine;
dtRetour = oDs.Tables[0];
}
else
{
rt_output.Text += « DEBUG - GetfichierFeuilleFichierExcel - Ouverture KO - dtretour == null » + Environment.NewLine;
dtRetour = null;
}

					// Libération
					oCnx.Close();
					objCmdSelect.Dispose();
					objAdapter.Dispose();
				}
				catch (Exception e)
				{
					rt_output.Text += "DEBUG EXCEPTION : "+Environment.NewLine+e.ToString()+ Environment.NewLine;
				}
			}
			else
				rt_output.Text += "DEBUG - GetfichierFeuilleFichierExcel - Ouverture KO - fichier existe pas" + Environment.NewLine;
		}
		else
			rt_output.Text += "DEBUG - GetfichierFeuilleFichierExcel - string en entrée vide" + Environment.NewLine;
		return dtRetour; 
	}[/code]

C’est du code que j’ai récupérer sur le net, et je maitrise pas du tout les connexions OLE. C’est surement la qu’est le probleme d’ailleurs (si vous avez de la doc la dessus).

Mais tout marche tres bien sur mon PC. La procedure me retourne bien les données du fichier excel que je souhaite ouvrir, et j’ai développer mon appli sur cette base.
La elle est fini, je la montre a un pote qui la trouve bien pratique et me la demande.

Je la publie donc sous Visual C# express (je maitrise pas non plus cette partie d’ailleurs, si vous avez des docs la dessus …), lui envoie le setup, il l’installe et … impossible d’ouvrir les fichiers excel.

Je rajoute donc les trace en debug ci dessous pour voir ce qui se passe, et ca plante avec l’erreur suivante à l’ouverture des fichiers xls :

Creation de la liste de PAN -- Fichier source : D:\2 - Activité\1 - Reporting\PAN_List.xls . on traite la feuille SFR_Projects DEBUT - GetfichierFeuilleFichierExcel - IN - [D:\2 - Activité\1 - Reporting\PAN_List.xls] -- [ SFR_Projects] EXCEPTION : System.Data.OleDb.OleDbException: Pilote ISAM introuvable. à System.Data.OleDb.OleDbConnectionInternal..ctor(OleDbConnectionString constr, OleDbConnection connection) à System.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject) à System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup) à System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) à System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) à System.Data.OleDb.OleDbConnection.Open() à AbbaccusFollowUp.ExcelReader.GetfichierFeuilleFichierExcel(String strCheminFichier, String strNomFeuilleExcel) -- KO 0 PAN traités au total

C’est quoi cet histoire de pilote ISAM ?
Je sais que mon code d’ouverture est pas top, vu que la version de excel est hardcodé, mais je sais pas trop quoi mettre a la place. De plus, il a la meme version d’excel que moi.

Et surtout, comment faire ca proprement pour que l’ouverture de fichier excel marche a tout les coups ?
Je suis egalement preneur d’autre methode de lecture de fichier excel si vous en connaissez des meilleurs :slight_smile:

Pour les autres méthodes, tes fichiers excel c’est quelle version ? n’importe ? ou ca peut n’être que les .xlsx ?

Les fichiers excel sont des fichiers .xls classique (excel 2000 surement), pas des xlsx.
J’ai excel 2003 sur mon poste et sr celui de mon pote, c’est pour ca que je le mentionne.

Ahlala Excel et code, ça me rappelle ma J.E. à chaque fois ^^
Du côté de ton pote, es-tu sûr que son moteur Jet est bien configuré de partout ?
Tu te connectes via Microsoft.Jet.OLEDB.4.0. En googlant rapidement, il y a une note sur ce sujet dans la MSDN

Regarde si dans HKLM/SOFTWARE/Microsoft/Jet/4.0/Engines/Excel il a la clé win32=“C:\WINDOWS\System32\msexcl40.dll”

Si elle est absente, tente d’inscrire la DLL via Regsvr32 c:\WINDOWS\System32\msexcl40.dll et regarde si ça fonctionne désormais.

[quote=“xentyr, post:4, topic: 48672”]Ahlala Excel et code, ça me rappelle ma J.E. à chaque fois ^^
Du côté de ton pote, es-tu sûr que son moteur Jet est bien configuré de partout ?
Tu te connectes via Microsoft.Jet.OLEDB.4.0. En googlant rapidement, il y a une note sur ce sujet dans la MSDN

Regarde si dans HKLM/SOFTWARE/Microsoft/Jet/4.0/Engines/Excel il a la clé win32=“C:\WINDOWS\System32\msexcl40.dll”

Si elle est absente, tente d’inscrire la DLL via Regsvr32 c:\WINDOWS\System32\msexcl40.dll et regarde si ça fonctionne désormais.[/quote]

ha non justement, je n’ai rien configurer sur le poste de mon pot, et je ne sais pas ce qu’est jet.
Je vais regarder ca alors, par contre, il y a moyen de faire un pack d’installe qui configure tout bien ou qui soit pas intrusif ? quitte a embarqué plus de chose dans le setup de l’appli ?
Parce que ca va etre chiant sinon.

Bin alors, me dites pas que j’ai reussi a coller la toute puissante geekzone avec une bete question de lecture de fichier excel en C# :slight_smile:

Tu es cantonné à OleDb? Tu peux pas utiliser la DLL Microsoft.Office.InteropExcel ou un truc comme ça?

Ou le convertir et l’exporter dans un truc plus simple (CSV, SQLite, etc)

ha non, je suis pas du tout cantoné a OleDb. J’ai chercher des solutions pour traiter les donner d’un fichier excel, et je suis tombé la dessus.
Et j’ai jamais reussi a trouver comment faire marcher la DLL Microsoft.Office.InteropExcel. Quand j’essaie de la rajouter au reference, je la trouve pas parmis la liste.

En admettant que j’arrive a le faire fonctionner, on peut construire un datatable avec aussi ? (c’est pas indispensable, je peux reecrire cette partie du code).
Et surtout, c’est deployable directement avec l’appli ? C’est chiant de devoir faire des config sur le poste client.

Non, ca je peux pas, les fichiers que je lis sont généré toutes les semaines par plein de monde sous excel. C’est tout le but de mon appli que de lire ces fichiers pour aggreger les données.

hop, un petit up, parce que je suis toujours bloqué :slight_smile:

ploum ploum …

me dites pas qu’il est si compliqué d’ouvrir un fichier excel en C# que personne sur la zone ne sache comment faire :slight_smile:

Pour autant que j’en sache, la gestion des documents office via C# a toujour été un bordel innomable. La meilleure solution reste Interop mais t’arrive pas à l’utiliser de ce que tu nous dis. Moi je serais tenté de te suggérer de commencer par creuser dans les technologies que tu maitrise pas pour comprendre ce que fait ton code, plutôt que de demander une recette de cuisine toute faite qui par miracle correspondrait exactement à tes besoins.

Bin je comprends tres bien ce que fais mon code. Je demande juste de l’aide sur la creation d’un tabledata a partir d’un fichier xls.
Mais comme je l’ai mis plus haut, s’il y a d’autre moyen d’obtenir le contenu des fichiers excel qu’un tabledata, je suis tout a fait pret a reecrire cette partie !

En gros je suis preneur de toute solution clair sur le traitement de fichier xls en C#…

Donc Bishop,Zoubidaman, vous voulez bien m’expliquer les autres solutions ?

Sinon Glop, ca te parle tout ca ? je demande vraiment qu’a apprendre, et je suis ouvert a toute proposition :
[ul]
[li]M’expliquer comment faire marcher et deployer automatiquement OLEDB pour utiliser mon code actuel (qui fonctionne niquel sur mon poste)[/li][li]Ou m’orientez vers d’autre solution, quitte a redevelopper une partie, et m’expliquer comment le deployer[/li][/ul]

Merci ! Parce que j’arrive pas a trouver d’info pertinente, et je suis assez surpris que tout le monde bloque sur un truc qui m’avait l’air trivial a priori.

Utilise Microsoft.Office.InteropExcel c’est ce qui a de plus propre, lit les documentations et si tu as un problème dis nous exactement où ça plante.

Personnellement je ne peux pas t’aider n’étant pas expert DotNet mais je suis sur que bishop ou Glop se feront un plaisir à te donner les pistes qui t’aideront à faire ce que tu souhaite.

je te propose : une recherche, qui te donne des résultats comme celui de dotnetperls, MSDN ou code project.

ok merci messieurs, je vais regarder tout ca.

hop, me revoici. Donc je bloque toujours sur l’utilisation de Microsoft.Office.Excel.Interop.

Quand je rajoute dans ma classe « using Microsoft.Office.Excel.Interop », j’ai l’erreur suivante :

Erreur	1	Le type ou le nom d'espace de noms 'Office' n'existe pas dans l'espace de noms 'Microsoft' (une référence d'assembly est-elle manquante ?)	D:\Personnel\Dev\C#\AbbaccusFollowUp\AbbaccusFollowUp\ExcelReader.cs	8	32	AbbaccusFollowUp

J’ai donc cherché quel reference ajouté, et je suis tombé sur des pages qui explique qu’il faut rajouter la reference « Microsoft Office xx Object Library ».

Je vais dans l’ecran de gestion des references, je trouve une « Microsoft Office 11.0 Object Library », je le rajoute.

Maintenant, sous Microsoft, j’ai bien un Office, mais qui ne contient qu’un Core.
En gros, je peux faire un « using Microsoft.Office.Core; », mais « Microsoft.Office.Excel.Interop » est toujours inconnu.
Et je seche la, j’ai rien trouvé de plus.

J’ai l’erreur suivante :

Erreur	1	Le type ou le nom d'espace de noms 'Interop' n'existe pas dans l'espace de noms 'Microsoft.Office' (une référence d'assembly est-elle manquante ?)	D:\Personnel\Dev\C#\AbbaccusFollowUp\AbbaccusFollowUp\ExcelReader.cs	8	32	AbbaccusFollowUp

Donc je veux bien utilisé excel.interop, mais je n’arrive pas a l’inclure a mon projet :confused:
je veux bien un coup de main :slight_smile:
Merci !

Hop, c’est bon, j’ai trouvé.
En gros, faut installer un package supplementaire qui declare les nouveaux wrapper d’interop.

Tout est ici : http://support.microsoft.com/kb/897646

Une fois le MSI installé sur mon PC, ca a marché direct.
Je vais voir s’il est possible de l’integrer a mon package d’installation. Vous savez comment faire ca ?

http://wix.sourceforge.net/