2008-11-28 8 views
1

Notre client obtient des fichiers Excel au format HTML d'Excel (c'est ainsi que cela arrive, personne n'a le contrôle.) Nous devons ensuite exécuter un rapport basé sur les données dans le fichier. L'utilisation de ADO.NET (OleDbReader) génère une exception "Fichier externe non prévu dans le format".Comment remplir DataTable à partir d'une feuille de calcul Excel en mémoire

Si les données sont converties au format Excel normal, elles sont lues dans OK. Cependant, ce n'est pas vraiment une solution, car elle impose une étape supplémentaire, et ils ne sont pas trop alphabétisés dans le meilleur des cas. La seule solution que j'ai pu trouver était d'utiliser Excel Automation pour créer une nouvelle feuille de calcul, la remplir avec les mêmes données et la lire à la place. Mais ADO.NET semble être seulement capable de lire à partir d'un fichier sur le disque. Je pourrais bien sûr enregistrer le fichier et le supprimer quand j'en aurai fini (ce que j'ai vérifié fonctionnera). Mais je ne suis pas à l'aise avec l'idée de jouer avec leur système de fichiers. Donc ma première question est - est-il un moyen de remplir un DataTable à partir d'une feuille de calcul Excel en mémoire?

En outre, je n'aime pas l'ensemble de l'entreprise avec l'utilisation de l'automatisation; C'est incroyablement lent. L'opération prend plus de 30 secondes même sans remplir le DataTable. Donc, une solution qui rend le tout plus lent ne sera pas bonne. Cela m'amène à ma deuxième question - Y a-t-il une meilleure façon d'accomplir ce que j'essaie ici?

Répondre

0

Je ne suis pas sûr de savoir ce que vous entendez par "format HTML d'Excel". Les versions récentes d'Excel ont un format de fichier XML, et je Excel peut ouvrir un fichier HTML contenant une table et le convertir en une feuille de calcul, mais je ne connais pas de format HTML Excel spécifique. En ce qui concerne la solution utilisant Excel Automation, une fois que vous avez une feuille de calcul en mémoire, vous pouvez obtenir les valeurs dans un tableau bidimensionnel d'objets en utilisant la propriété Value2, puis l'utiliser pour construire un DataTable. Je ne pense pas que cela va ajouter beaucoup de surcharge supplémentaire à la surcharge initiale de l'utilisation de l'automatisation (qui doit créer un processus Excel).

Y a-t-il un meilleur moyen? L'analyse de code HTML arbitraire n'est pas triviale, mais si les fichiers que vous recevez ont un format cohérent, il peut être possible de les analyser.

1

Essayez le HTML Agility pack: http://www.codeplex.com/htmlagilitypack

Je l'utilise dans un scénario similaire. Dans mon cas ...

  • quelqu'un a posté une table à partir d'Excel dans le presse-papiers
  • extraient le texte HTML
  • utiliser HTML Agility en arrière pour trouver la table, TR, TH, étiquettes TD
  • puis construire le DataTable de lui

a aucun moment, dans mon cas est le HTML a persisté sur le disque

Questions connexes