Domanda

Come leggere / scrivere i dati in Excel 2007 in C ++?

È stato utile?

Soluzione

Excel fornisce l'interfaccia COM che può essere utilizzato da un'applicazione C ++.

Ho esperienza con Excel solo 2003, ma credo che per Excel 2007 funzionerà anche.

Questo può essere fatto per esempio con #import o nel modo descritto in questo articolo: http://support.microsoft.com/kb/216686

Altri suggerimenti

C'è una soluzione python (utilizzando COM spedizione) qui: http: //snippets.dzone .com / messaggi / show / 2036

Non è C ++, ma l'interfaccia COM dovrebbe essere lo stesso, non importa quale lingua si usa, giusto?

Non avrebbe bisogno di tutto la porta. Proprio __init__, set_range, get_value, set_value, save (o save_as), close e quit. Potrebbe anche essere necessario disporre di immondizia (come Python ha gc automatico).

o si può solo porto (e modificare) il seguente codice (che non ho ancora testato, come io non ho più excel - probabilmente si dovrebbe verificare scaricando pitone e 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?

i file di Excel 2007 sono semplicemente zip file. Tenta di rinominare xlsx a .zip: è possibile estrarre i file e le cartelle. Con un editor di testo è possibile visualizzare che sono tutti i file XML.

Quindi la soluzione:

  1. utilizzare una classe comune per decomprimere il xlsx
  2. utilizzare un parser XML per afferrare i tuoi dati
  3. se sono stati modificati coincidevano, ri-comprimere tutti

Nessun oggetto COM richiesto. A seconda del compilatore C ++ è possibile easyly trovare le fonti necessarie.

Ci sono tre cose principali che devi fare.

1) garantire che i file pre-requisiti sono installati e localizzabile.

assolutamente ovvio lo so, ma assicuratevi di avere una versione adatta di Excel installata, in modo da poter individuare le librerie Microsoft richiesti (e le loro posizioni). cioè MSO.DLL, VBE6EXT.OLB e EXCEL.EXE

2) Impostare le librerie Microsoft.

Nel codice C ++, diciamo che si inizia con una semplice applicazione console, assicurarsi di includere le librerie di importazione in qualsiasi applicazione C ++ che si interfaccia con Excel. Nel mio esempio io uso:

#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) Utilizzare il modello di oggetti di Excel nel codice C ++

Ad esempio, per dichiarare un puntatore oggetto Application di Excel per la lettura / scrittura di una cartella di lavoro di Excel:

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

E per accedere e manipolare il foglio di lavoro di Excel e le cellule all'interno di esso:

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

E così via. Ho una discussione più approfondita a questo seguito blog di distacco .

Un modo low tech che ho usato su un paio di progetti è quello di fare un semplice script / macro / qualunque cosa che esegue un programma esterno. Scrivere che programma esterno in C ++. Ottenere che il programma esterno per leggere il suo input e scrivere il suo output in un file .csv (comma separated value semplice file di testo). Excel può facilmente leggere e scrivere file .csv, quindi questa impostazione ti dà tutto il necessario per realizzare una soluzione praticabile.

Questo può essere fatto tramite l'interfaccia IDispatch. Si può ottenere molto sanguinosa complicato rapidamente (acclamazioni Microsoft), ma almeno una volta che hai la tua testa rotonda Excel troverete l'integrazione con altre applicazioni MS troppo facile:)

Per fortuna c'è qualcuno sopra su CodeGuru che ha fatto il bello e facile processo. Una volta avevo letto attraverso il codice che ho iniziato a ottenere la mia testa rotonda che cosa eccellere stava facendo e, inoltre, ho trovato è diventato davvero facile da estenderlo a fare altre cose che volevo. Basta ricordare che si sta inviando comandi per Excel tramite l'interfaccia IDispatch. Questo significa che è necessario pensare a come si dovrebbe fare qualcosa per capire come farlo programatically.

Edit: l'esempio di codice guru è per Excel 2003 ma dovrebbe essere abbastanza facile da estenderlo al 2007:)

Inizia da qui con la OpenXml Sdk . Scarica l'SDK da qui . L'SDK utilizza .NET, quindi potrebbe essere necessario utilizzare C ++. NET

E 'stato un tempo molto lungo, ma ho usato l'OLE DB Jet per arrivare al file Excel. Si potrebbe iniziare a cercare in quella direzione.

ho usato un componente 3rd Party per questo in passato: OLE XlsFile da SM Software (non libero, ma poco costoso). Il vantaggio di questa componente nel corso dei componenti Microsoft COM è che si può utilizzare per scrivere i file XLS, anche se non è installato Excel.

Permette inoltre di creare speadsheets o cartelle di lavoro con formule incorporate e la formattazione, cosa non possibile se si utilizzano file CSV come formato di interscambio.

Se avete bisogno le migliori prestazioni, la scrittura di file di Excel binarie è la strada da percorrere e la scrittura non è così difficile come la loro lettura. Il formato di file binario è relativamente ben documentata dal progetto OpenOffice.org:

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

e Microsoft ha rilasciato anche la documentazione:

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

Questa soluzione funziona meglio se si deve scrivere molti file di Excel, per lo più con i dati e la formattazione poco, e se non si desidera aprire i file allo stesso tempo. Se si scrive un singolo file di Excel per aprirlo in seguito, probabilmente si può usare il C ++, proposto COM Interface come gli altri utenti hanno spiegato.

Con l'interfaccia COM richiederà costose chiamate out-of-process a meno che non si scrive un COM Addin Excel. Se si scrive un componente aggiuntivo che importa i dati nel foglio di Excel corrente, riempiendo il foglio sarà ancora molto più lento di scarico di un file, ma per un singolo file alla volta questo può essere accettabile a seconda dello scenario utente. Se si decide di utilizzare l'interfaccia COM, ridurre al minimo il numero di chiamate in Excel. Utilizzare i metodi che consentono di inserire una matrice di valori se esistono, proprietà di stile impostate per riga e la colonna è possibile e non per cellula.

È possibile utilizzare ODBC per leggere e scrivere i dati da un file di Excel facilmente senza Excel. Il link: Qui

Il link per come scrivere i dati tramite ODBC: Qui

Ho usato un insieme di classi C ++ che è disponibile da CodeProject, prima di scrivere su file XLS.

E 'davvero facile da usare, e gratuito! Lo si può trovare qui .

Mi ha portato nessun tempo per impostare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top