Insérer un DataTable dans Excel à l'Aide de Microsoft Access Moteur de Base de données via OleDb

Je suis tombé sur les instructions d'aujourd'hui pour la lecture de données à partir d'un fichier Microsoft Excel à l'aide d'un OleDbConnection sur ce site: Fournisseurs OLE DB

Cela me permet de lire les données à partir d'un fichier Excel:

private const string EXCEL_CON =
  @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};" +
  @"Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'";

    public DataTable ExtractExcel(string fullFilename, string tableName)
    {
        var table = new DataTable();
        string strCon = string.Format(EXCEL_CON, fullFilename);
        using (var xlConn = new System.Data.OleDb.OleDbConnection(strCon))
        {
            ConnectionState initialState = xlConn.State;
            try
            {
                if ((initialState & ConnectionState.Open) != ConnectionState.Open)
                {
                    xlConn.Open();
                }
                string sql = string.Format("SELECT * FROM `{0}`;", tableName);
                using (var cmd = new System.Data.OleDb.OleDbCommand(sql, xlConn))
                {
                    table.Load(cmd.ExecuteReader());
                }
            }
            finally
            { //it seems like Access does not always close the connection
                if ((initialState & ConnectionState.Open) != ConnectionState.Open)
                {
                    xlConn.Close();
                }
            }
        }
        return table;
    }

Lorsque j'insère des données, l'Étape 1 est de souffler la table existante dans la base de données Microsoft Access dans le cas des colonnes ont été ajoutées, modifiées ou supprimées:

public void InsertExcel(OleDbConnection dbConn, DataTable table) {
  ConnectionState initState = dbConn.State;
  try {
    if ((initState & ConnectionState.Open) != ConnectionState.Open) {
      dbConn.Open();
    }
    string sql = string.Format("SELECT * FROM {0};", table.TableName);
    DataTable original = new DataTable();
    using (OleDbCommand cmd = new OleDbCommand(sql, dbConn)) {
      try {
        original.Load(cmd.ExecuteReader());
      } catch (Exception) { //table does not exist
      }
    }
    if (0 < original.Rows.Count) {
      sql = string.Format("DROP TABLE {0};", table.TableName);
      using (OleDbCommand cmd = new OleDbCommand(sql, dbConn)) {
        cmd.ExecuteNonQuery();
      }
    }
    //****************
    //CODE NEEDED HERE
    //****************
  } finally {
    if ((initState & ConnectionState.Open) != ConnectionState.Open) {
      dbConn.Close();
    }
  }
}

Après la DROP TABLE commande est exécutée (dans le CODE NEEDED HERE section), j'ai besoin de quelque sorte insérer les informations dans le DataTable.

Comment puis-je insérer la table si je n'ai pas de type de la Clé Primaire, les noms de colonnes, ou des types de données des colonnes?

La OleDbParameter a a la AddWithValue méthode qui permet d'ajouter des données sans avoir à connaître le type de données. Est-il quelque chose de similaire que je pourrais utiliser pour vider dans l'ensemble de la DataTable (ou DataSet)?

  • il est possible d'exécuter une requête sur les lignes de SELECT * INTO NewTable FROM [Excel 8.0;HDR=YES;IMEX=1;DATABASE=Z:\Docs\Book1.xlsm].[Sheet1$]
  • J'ai mis à jour le titre pour plus de clarté. J'espère que vous n'avez pas l'esprit... le meilleur de Tous.
  • C'est une super ligne de code et peut bien fonctionner, mais nous essayons de garder cette classe modulaire. Une méthode extrait les données à partir de l'emplacement du fichier et retourne que comme un ensemble de données (plusieurs feuilles) ou DataTable. Une autre méthode (celle-ci) insère les données à partir des données.
  • Grâce Killercam. Je ne suis pas sûr de ce qu'il était avant.
InformationsquelleAutor jp2code | 2012-05-14