2009-05-25 7 views
4

Je rencontre un problème lors de l'utilisation de OLDEDB à partir de C# pour écrire des entrées dans un fichier Excel. Essentiellement, je veux utiliser un fichier de modèle Excel pour le formatage de certaines informations. L'idée est que les utilisateurs peuvent exécuter une requête, il va peupler les résultats dans un fichier Excel, où l'utilisateur peut ensuite continuer à utiliser Excel pour gérer les résultats. Pour cela, je crée un onglet "raw_data" et j'utilise OLEDB pour y écrire comme une table. Cependant, je suis confronté à un problème où les calculs prédéfinis. Certaines colonnes sont du texte, d'autres sont des nombres et les forums devraient faire référence à ces colonnes dès que la feuille est ouverte.L'utilisation du pilote OLEDB/Microsoft Jet provoque «Nombre stocké en tant que texte» dans le fichier Excel

Excel version 2003 C# /. Net 3.5

Voici mon chaîne de connexion

string connectString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={filename};Extended Properties=""Excel 8.0;HDR=YES;IMEX=0"""; 

{nom de fichier} get remplacé plus tard dans le code avec le chemin du fichier

DbProviderFactory factory = DbProviderFactories.GetFactory("System.Data.OleDb"); 
using (DbConnection connection = factory.CreateConnection()) 
{ 
    connection.ConnectionString = connectString; 
    using (DbCommand command = connection.CreateCommand()) 
    { 

    connection.Open(); 
    query = "INSERT INTO [raw_prod$] (correlationid, created, ipaddr, nai, started, delta, csid, bytesin, bytesout, cause, bsid, servopt, svzone) VALUES (\"{correlationid}\", \"{created}\", \"{ipaddr}\", \"{nai}\", \"{started}\", {delta}, \"{csid}\", {bytesin}, {bytesout}, {cause}, \"{bsid}\", \"{servopt}\", \"{zone}\")"; 
    //Replace {} code with actual values skipped 
    command.CommandText = query; 
    command.ExecuteNonQuery(); 
    } 
} 

Lorsque cette série est remplie, les données sont remplies comme prévu, mais Excel traite les données sous forme de texte, donc des choses comme sum (c2: c100) ne fonctionnent pas. Si je sélectionne simplement une entrée et que j'appuie sur Entrée, cela deviendra automatiquement du texte. J'ai essayé de mettre en forme la colonne à numéroter dans le modèle, et comme vous pouvez le voir, je supprime les guillemets doubles dans le sql.

Comment puis-je obtenir Excel pour traiter ces entrées comme numériques tout de suite, de sorte que tous les calculs vont fonctionner?

Merci

Répondre

2

Avez-vous essayé de modifier le réglage pour reg TypeGuessRows? HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Jet \ 4.0 \ Moteurs \ Excel \ TypeGuessRows devrait être où chercher Jet 4.0. Pour des fins de débogage, vous pouvez le mettre à un plus grand nombre que la valeur par défaut de 8, (ou, si cela est absolument certain que la première ligne est correcte, réglez-le sur 1.)

Quelques liens pour faciliter le débogage Daily Does et MSDN

Aha! Juste repéré l'exemple au bas de votre code. Essayez de supprimer les guillemets autour de ces valeurs qui sont numériques

\"{correlationid}\", \"{created}\", \"{ipa 

Je suppose serait

{correlationid}, \"{created}\", \"{ipa 
+0

Je l'ai déjà en sans les guillemets, c'est juste hors de l'écran: {bytesin}, –

2

j'ai tout compris, il était en fait assez bêtement ennuyeux. Dans mon fichier Excel pour les lignes 2 à 8, pour n'importe quelle colonne je voulais être un nombre, je viens de remplir quelques chiffres factices. De cette façon, le pilote Jet lors de l'analyse de ces colonnes verra les numéros et considérera ces numéros de colonnes. Mes insertions de C# sont ensuite démarrées sur la ligne 9 et j'ai modifié le modèle en conséquence pour ne commencer les calculs qu'à partir de la ligne 9. Vraiment une douleur, mais cela semble fonctionner.

0

Vous le faites en disant explicitement Jet quel type les colonnes sont lorsque vous créez la table pour l'exportation:

"create table [tabName] ([col1] varchar(255), [col2] double)" 

Le seul hic est que si vous essayez ensuite de coller des données de caractère dans un jet de colonne numérique sera jeter quand vous insérez, ce qui n'est pas une surprise.Un problème lié est comment vous gérez les valeurs nulles: une chaîne vide n'est pas nulle pour ce qui concerne Jet: si vous essayez de l'insérer dans une colonne numérique, Jet se lève.

0

J'ai eu le même problème avec Excel 2007 et a résolu le problème en faisant deux choses:

  • En utilisant la méthode CREATE TABLE mentionné par philw ci-dessus
  • Modification de la chaîne de connexion et en ajoutant « xml » après excel 12,0 partie

Voir l'exemple de code suivant

string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=""" + scratchFile 
    + @""";Extended Properties=""Excel 12.0 xml;HDR=YES"""; 

DbProviderFactory factory = DbProviderFactories.GetFactory("System.Data.OleDb"); 

using (DbConnection connection = factory.CreateConnection()) 
{ 
    connection.ConnectionString = connectionString; 

    using (DbCommand command = connection.CreateCommand()) 
    { 
     connection.Open(); 

     command.CommandText = @"CREATE TABLE [RawData$] " + 
      "([Organization] varchar(255), " + 
      "[Department] varchar(255), [TotalSales] int, [TotalHours] int)"; 
     command.ExecuteNonQuery(); 

     command.CommandText = @"INSERT INTO [RawData$] " + 
      "(Organization,Department,TotalSales,TotalHours)" + 
      "VALUES('Organization','Department',700,70)"; 

     command.ExecuteNonQuery(); 

    } 
} 
Questions connexes