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.
Vous devez vous connecter pour publier un commentaire.
Ici est un
static class
j'ai construit en fusionnant les différents morceaux de code que j'ai trouvé ou développé. Cette méthode pour vous de prendre note de estExportToExcelOleDb
qui, étant donné unDataSet
et une chaîne de connexion à écrire queDataSet
le fichier Excel de votre choix, sous la forme de laDataSet
a été.Remarque, il y a un "bug" avec la façon dont le Moteur d'Accès écrit à Exceller, il ne peut pas persister types de données lors de l'écriture dans le classeur Excel, cela signifie que tous les types de données sont écrites dans Excel
TEXT
/STRING
. De toute façon ici c'est...J'espère que c'est de quelque utilité pour vous.
Note. Je suis conscient que ce type de réponse est mal vu, mais j'ai passé un peu de temps à la développer et à la fin, a - déplacement au lieu COM/interop. C'est une honte de ne pas partager!
Microsoft.Office.Interop.Excel
était due à la mise en forme vraiment. Le OleDb façon est très rapide, beaucoup plus rapide que de passer par l'interface COM, mais sans numéro de base de mise en forme, elle est limitée dans le cosmétique département. La routine, j'ai mis en place pour faire de la COM à l'exportation est multithread, pour éviter de l'INTERFACE utilisateur de verrouillage/point de congélation. Envoyez-moi un email et je vais vous donner le code...