Question

Comment lire/écrire des données dans excel 2007 en c++?

Était-ce utile?

La solution

Excel fournit une interface COM que vous pouvez utiliser à partir de votre application C ++.

J'ai l'expérience avec Excel 2003 seulement, mais je pense que pour Excel 2007, il fonctionnera également.

Cela peut être fait par exemple avec ou #import de la manière décrite dans cet article: http://support.microsoft.com/kb/216686

Autres conseils

Il y a un python de la solution (à l'aide de répartition COM) ici: http://snippets.dzone.com/posts/show/2036

C'est pas du C++, mais l'interface COM devrait être la même, peu importe la langue que vous utilisez, à droite?

Vous n'avez pas besoin de port tout.Juste __init__, set_range, get_value, set_value, save (ou save_as), close, et quit.Vous pourriez aussi avoir besoin de disposer de déchets (comme python est automatique gc).

Ou vous pouvez simplement le port (et de modifier) le code suivant (dont je n'ai pas testé, car je n'ai pas excel plus vous devriez probablement vérifier en téléchargeant python et pythonwin):

from win32com.client import Dispatch
app = Dispatch("Excel.Application")
app.Visible = True # spooky - watch the app run on your desktop!
app.Workbooks.Open("C:\\book.xls")

range = app.ActiveWorkbook.Sheets(1).Range("a1") 
print 'The range was:'
print range.Value

range.Value = 42

print 'The value is now 42'  

app.ActiveWorkbook.Save()
app.ActiveWorkbook.SaveAs("C:\\excel2.xls")

app.ActiveWorkbook.Close()
app.Quit()

# any gc to do?

fichiers Excel 2007 sont simplement des fichiers zip. Essayez de renommer .xlsx .zip: vous pouvez extraire des fichiers et des dossiers. Avec un éditeur de texte que vous pouvez voir qu'ils sont tous les fichiers XML.

Donc, la solution:

  1. utilisez une classe commune à dézipper votre xlsx
  2. utiliser un analyseur XML pour vous saisir des données
  3. si vous avez modifié somethig, re-zip tout

Aucun objet COM nécessaire. En fonction de votre compilateur c ++ vous pouvez easyly trouver les sources nécessaires.

Il y a trois choses principales que vous devez faire.

1) assurer que les fichiers pré-requis sont installés et localisable.

Je sais une évidence aveuglante, mais assurez-vous que vous avez une version adaptée d'Excel installée, de sorte que vous pouvez trouver les bibliothèques Microsoft nécessaires (et leurs emplacements). à savoir MSO.DLL, VBE6EXT.OLB et EXCEL.EXE

2) Mettre en place les bibliothèques Microsoft.

Dans votre code C ++, disons que vous commencez avec une simple application de la console, assurez-vous d'inclure les bibliothèques d'importation dans toutes les applications C ++ qui interface avec Excel. Dans mon exemple, je l'utilise:

#import "C:\\Program Files (x86)\\Common Files\\microsoft shared\\OFFICE11\\MSO.DLL" \
rename( "RGB", "MSORGB" )

using namespace Office;  

#import "C:\\Program Files (x86)\\Common Files\\microsoft shared\\VBA\\VBA6\\VBE6EXT.OLB"  

using namespace VBIDE;  

#import "C:\\Program Files (x86)\\Microsoft Office\\OFFICE11\\EXCEL.EXE" \  
    rename( "DialogBox", "ExcelDialogBox" ) \  
    rename( "RGB", "ExcelRGB" ) \  
    rename( "CopyFile", "ExcelCopyFile" ) \  
    rename( "ReplaceText", "ExcelReplaceText" ) \  
    exclude( "IFont", "IPicture" ) no_dual_interfaces 

3) Utilisez le modèle d'objet Excel dans votre code C ++

Par exemple, pour déclarer une application Excel pointeur de l'objet pour lire / écrire un classeur Excel:

Excel::_ApplicationPtr pXL;  
pXL->Workbooks->Open( L"C:\\dump\\book.xls" );

Et pour accéder et manipuler la feuille de calcul Excel et les cellules dans ce:

Excel::_WorksheetPtr pWksheet = pXL->ActiveSheet;  
Excel::RangePtr pRange = pWksheet->Cells;  
double value = pRange->Item[1][1];  
pRange->Item[1][1] = 5.4321; 

Et ainsi de suite. J'ai une discussion plus approfondie à ce qui suit affichage blog .

Une voie basse technologie, je l'ai utilisé sur deux projets est de faire un simple script / macro / whatever qui exécute un programme externe. Écrivez ce programme externe en C ++. Obtenez ce programme externe pour lire son entrée et écrire sa sortie vers un fichier .csv (fichier simple virgule texte de valeurs séparées). Excel peut facilement lire et écrire des fichiers .csv, cette configuration vous offre tout ce dont vous avez besoin pour concevoir une solution viable.

Cela peut être fait via l'interface IDispatch. Il peut obtenir très rapidement (Acclamations Microsoft) sanglante compliqué, mais au moins une fois que vous avez votre tête ronde Excel, vous trouverez l'intégration avec d'autres applications MS trop facile:)

Heureusement, il y a quelqu'un sur codeguru qui a fait le beau et facile processus. Une fois que je lu ce code j'ai commencé à ma tête ronde ce que Excel a été fait et, par ailleurs, je l'ai trouvé, il est devenu très facile de l'étendre à faire d'autres choses que je voulais. Rappelez-vous que vous envoyez des commandes à Excel via l'interface IDispatch. Cela signifie que vous devez penser à la façon dont vous faire quelque chose pour savoir comment faire programatically.

Edit: l'exemple de gourou de code est pour Excel 2003, mais il devrait être assez facile de l'étendre à 2007:)

Commencez ici OpenXml Sdk . Téléchargez le SDK de ici . Le SDK utilise .NET, vous devrez peut-être utiliser C ++. NET

Il a été très longtemps mais je l'ai utilisé le OLEDB Jet pour obtenir à des fichiers Excel. Vous pouvez commencer à chercher dans cette direction.

Je l'ai utilisé un composant 3ème partie pour cela dans le passé: OLE XlsFile de SM Software (pas libre, mais bon marché). L'avantage de ce composant sur les composants Microsoft COM est que vous pouvez l'utiliser pour écrire des fichiers XLS, même si Excel est pas installé.

Il vous permet également de créer des classeurs speadsheets ou avec des formules intégrées et la mise en forme, ce qui est impossible si vous utilisez des fichiers CSV comme format d'échange.

Si vous avez besoin la meilleure performance, l'écriture des fichiers Excel binaires est le chemin à parcourir et de les écrire est pas aussi difficile de les lire. Le format de fichier binaire est relativement bien documenté par le projet OpenOffice.org:

http://sc.openoffice.org/excelfileformat.pdf

et Microsoft a également publié la documentation:

http://download.microsoft.com/download/0/B/E/0BE8BDD7-E5E8-422A-ABFD-4342ED7AD886/Excel97-2007BinaryFileFormat (XLS) Specification.xps

Cette solution fonctionnera mieux si vous devez écrire de nombreux fichiers Excel, la plupart du temps avec des données et peu de mise en forme, et si vous ne voulez pas ouvrir les fichiers en même temps. Si vous écrivez un seul fichier Excel pour l'ouvrir après, vous pouvez probablement utiliser le propsed C ++ COM Interface comme les autres affiches ont expliqué.

En utilisant l'interface COM nécessitera coûteux appels hors processus, sauf si vous écrivez un fichier Excel COM Addin. Si vous écrivez un Addin qui importe vos données dans la feuille Excel en cours, remplir la feuille sera encore beaucoup plus lent que le dumping d'un fichier, mais pour un seul fichier à la fois cela peut être acceptable en fonction de votre scénario utilisateur. Si vous décidez d'utiliser l'interface COM, réduire le nombre d'appels vers Excel. Utilisez les méthodes qui permettent d'insérer un tableau de valeurs si elles existent, les propriétés de style définies par ligne et la colonne est possible et non par cellule.

Vous pouvez utiliser ODBC pour lire et écrire des données à partir d'un fichier Excel facilement sans Excel. Le lien:

Le lien pour savoir comment écrire des données en utilisant odbc:

Je l'ai utilisé un ensemble de classes de C qui est disponible à partir CodeProject avant d'écrire dans des fichiers XLS.

Il est vraiment facile à utiliser, et gratuit! Vous pouvez trouver .

m'a pris pas le temps de mettre en place.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top