Importer des données d'un fichier .XLS sans avoir à ouvrir le fichier. [Résolu]

Messages postés
8
Date d'inscription
vendredi 8 juin 2012
Dernière intervention
21 juin 2012
- - Dernière réponse : bylkus
Messages postés
8
Date d'inscription
vendredi 8 juin 2012
Dernière intervention
21 juin 2012
- 11 juin 2012 à 11:11
Bonjour,
Je suis actuellement en stage et on m'a demander de crée un programme qui pourrait exporter des donnée d'un fichier XLS vers Google Calendar.
Hors si je n'ouvre pas le fichier XLS rien ne s'exporte et donc une ERREUR "Object reference not set to an instance of an object."
Je voudrais savoir si il y'a une solution pour régler mon problème, voici mon code pour extraire du Fichier XLS.
Ce code marche si le fichier XLS est Ouvert


//**********************************************************//
//**************************
Programme principal
//***************************
List<DataTable> ls = Extract_excel.GetfichierFeuilleFichierExcel(txt_chemin.Text);
DataTable dt = ls[0];

if (dt.Rows.Count > 0)
{
for (int i = 1; i < dt.Rows.Count; i++)
{
DataRow row = dt.Rows[i];
string Evenement row[0] as string, Lieu row[8] as string, Description = row[9] as string;
object Year row[1], Month row[2], Day = row[3], HeureD = row[4], MinuteD = row[5], HeureF = row[6], MinuteF = row[7];






//*********************************************************************************************************
//*************************Procédure Extraction données Excel***********************************************
//*********************************************************************************************************

public static List<DataTable> GetfichierFeuilleFichierExcel(string parcour)
{
// Chaine de connexion
string strCnx = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + parcour + ";Extended Properties=" + (char)34 + "Excel 8.0;HDR=no;" + (char)34 + ";";
System.Data.DataTable dtRetour = null;


String[] excelSheets = GetExcelSheetNames(parcour);

if (excelSheets == null)
return null;


List<DataTable> list_OK = new List<DataTable>();
System.Data.OleDb.OleDbCommand objCmdSelect = null;
System.Data.OleDb.OleDbDataAdapter objAdapter = null;

if (parcour != string.Empty)
{
foreach (String str in excelSheets) //for (int i = 0; i<excelSheets.Length ; i++)
{

if (System.IO.File.Exists(parcour))
{

System.Data.DataSet oDs = new DataSet();
System.Data.OleDb.OleDbConnection oCnx = new System.Data.OleDb.OleDbConnection(strCnx);
oCnx.Open();
objCmdSelect = new System.Data.OleDb.OleDbCommand("SELECT * FROM [" + str + "]", oCnx);//excelSheets[i]
objAdapter = new System.Data.OleDb.OleDbDataAdapter();
objAdapter.SelectCommand = objCmdSelect;
objAdapter.Fill(oDs, str.Substring(0, str.Length - 1));//lol
// Vérification du dataset

if (oDs != null && oDs.Tables != null && oDs.Tables.Count > 0)
{
dtRetour = oDs.Tables[0];
try
{
/*
Console.WriteLine(dtRetour.TableName);

if(dtRetour.Rows.Count>0)
Console.WriteLine(dtRetour.Rows[0].GetType().ToString());
* */
}
catch { }

}
else
{
dtRetour = null;
}


oCnx.Close();
objCmdSelect.Dispose();
objAdapter.Dispose();
}



//Debug.WriteLine(excelSheets[i]);
// dtRetour.TableName = str.Substring(0, str.Length - 1);//excelSheets[i]
//Debug.WriteLine(dtRetour.TableName);
list_OK.Add(dtRetour);
//mettre le data in LIST !! ! !! !! !! !!


}
}

return list_OK;
}

private static String[] GetExcelSheetNames(string excelFile)
{
OleDbConnection objConn = null;
System.Data.DataTable dt = null;

try
{
// Connection String. Change the excel file to the file you
// will search.
String connString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + excelFile + ";Extended Properties=Excel 8.0;";
// Create connection object by using the preceding connection string.
objConn = new OleDbConnection(connString);
// Open connection with the database.
objConn.Open();
// Get the data table containg the schema guid.
dt = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);

if (dt == null)
{
return null;
}

String[] excelSheets = new String[dt.Rows.Count];
int i = 0;

// Add the sheet name to the string array.
foreach (DataRow row in dt.Rows)
{
excelSheets[i] = row["TABLE_NAME"].ToString();
i++;
}

// Loop through all of the sheets if you want too...
for (int j = 0; j < excelSheets.Length; j++)
{
// Query each excel sheet.
}

return excelSheets;
}
catch (Exception e)
{
Console.WriteLine(e.Message);
return null;
}
finally
{
// Clean up.
if (objConn != null)
{
objConn.Close();
objConn.Dispose();
}
if (dt != null)
{
dt.Dispose();
}
}
}
}
}
//*****************************************************************************************
Afficher la suite 

Votre réponse

2 réponses

Meilleure réponse
Messages postés
12415
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
18 décembre 2018
3
Merci
Bonjour,

avant de te proposer une piste, je te cite la signature de NHenry, regarde bien la partie concernant le code:

[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list


J'ajouterai, que même avec les balises, ton code est difficilement lisible car sans indentation.
Pour te donner un exemple:
//**********************************************************// 
//************************** 
//Programme principal 
//*************************** 
List<DataTable> ls = Extract_excel.GetfichierFeuilleFichierExcel(txt_chemin.Text); 
DataTable dt = ls[0]; 

if (dt.Rows.Count > 0) 
{ 
   for (int i = 1; i < dt.Rows.Count; i++) 
   { 
      DataRow row = dt.Rows[i]; 
      string Evenement row[0] as string, Lieu row[8] as string, Description = row[9] as string; 
      object Year row[1], Month row[2], Day = row[3], HeureD = row[4], MinuteD = row[5], HeureF = row[6], MinuteF = row[7]; 
   }
}

C'est un peu plus facile à lire non?


Perso je n'ai jamais utilisé de liaison oledb vers excel, par contre j'ai développé cette classe pour y accéder via interop. Ça peut être une autre façon de faire pour toi.


Whismeril

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 96 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Whismeril
Messages postés
8
Date d'inscription
vendredi 8 juin 2012
Dernière intervention
21 juin 2012
3
Merci
ok merci très bien je vais essayer.
L'indentation à vrai dire est faite hors quand je l'ai coller sur le site cela l'a enlever.
Je veillerais a respecter la signature lors de mes prochain post.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 96 internautes nous ont dit merci ce mois-ci

Commenter la réponse de bylkus

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.