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

Résolu
bylkus Messages postés 8 Date d'inscription vendredi 8 juin 2012 Statut Membre Dernière intervention 21 juin 2012 - 8 juin 2012 à 10:34
bylkus Messages postés 8 Date d'inscription vendredi 8 juin 2012 Statut Membre 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();
}
}
}
}
}
//*****************************************************************************************

2 réponses

Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
9 juin 2012 à 17:46
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
3
bylkus Messages postés 8 Date d'inscription vendredi 8 juin 2012 Statut Membre Dernière intervention 21 juin 2012
11 juin 2012 à 11:11
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.
3
Rejoignez-nous