Pregunta

Como leer / escribir datos en Excel 2007 en C ++?

¿Fue útil?

Solución

Excel proporciona una interfaz COM que se puede utilizar desde su aplicación C ++.

Tengo experiencia con Excel sólo 2003, pero creo que para Excel 2007 también funcionará.

Esto puede hacerse, por ejemplo, con import o en la forma descrita en este artículo: http://support.microsoft.com/kb/216686

Otros consejos

Hay una solución pitón (mediante el envío COM) aquí: http: //snippets.dzone .com / mensajes / mostrar / 2036

No es C ++, pero la interfaz COM debe ser el mismo sin importar el idioma que usa, ¿verdad?

Usted no necesita al puerto todo. Sólo __init__, set_range, get_value, set_value, save (o save_as), close y quit. También podría ser necesario disponer de la basura (como Python tiene gc automática).

o usted podría puerto (y modificar) el siguiente código (que no he probado, ya que no tiene Excel más - probablemente debería comprobar que mediante la descarga de Python y 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?

Los archivos de Excel 2007 son simplemente archivos zip. Intenta cambiar el nombre .xlsx a .zip: puede extraer los archivos y carpetas. Con un editor de texto se puede ver que son todos los archivos XML.

Así que la solución:

  1. utilizar una clase común para descomprimir su xlsx
  2. utilizar un analizador XML para agarrar sus datos
  3. si ha modificado somethig, vuelva a comprimir todo

No se requiere objeto COM. Dependiendo de su compilador de C ++ se puede facilmente encontrar las fuentes necesarias.

Hay tres cosas principales que hay que hacer.

1) asegurar que los archivos de requisitos previos están instalados y localizable.

salta a la vista lo sé, pero asegúrese de que tiene una versión adecuada de Excel instalado, para que pueda localizar las bibliotecas de Microsoft necesarias (y sus ubicaciones). a saber MSO.DLL, VBE6EXT.OLB y EXCEL.EXE

2) Configurar las bibliotecas de Microsoft.

En el código C ++, digamos que usted comienza con una simple aplicación de consola, asegúrese de incluir las bibliotecas de importación en cualquier aplicación C ++ que interactúa con Excel. En mi ejemplo, yo 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) Utilizar el modelo de objetos de Excel en su código C ++

Por ejemplo, para declarar un puntero de objeto de aplicación de Excel para la lectura / escritura de un libro de Excel:

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

Y para acceder y manipular la hoja de Excel y las células dentro de ella:

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

Y así sucesivamente. Tengo una discusión más en profundidad en este siguiente entrada de blog .

Una forma de baja tecnología que he utilizado en un par de proyectos es hacer un simple script / macro / lo que sea que se ejecuta un programa externo. Escribir ese programa externas en C ++. Consigue que el programa externo para leer su entrada desde y escribir su salida a un archivo CSV (comas sencillo archivo de texto de valores separados). Excel puede leer y escribir fácilmente archivos .csv, por lo que esta configuración le da todo lo necesario para elaborar una solución viable.

Todo esto se puede hacer a través de la interfaz IDispatch. Se puede volver muy complicada con sangre rápidamente (Saludos Microsoft), pero al menos una vez que tenga su cabeza redonda Excel encontrará la integración con cualquier otra aplicación MS fácil también:)

Afortunadamente hay alguien más en CodeGuru que ha hecho el proceso agradable y fácil. Una vez que había leído a través de ese código empecé a conseguir mi cabeza por lo que estaba haciendo Excel y, además, he encontrado que se hizo realmente fácil de extenderlo a hacer otras cosas que quería. Sólo recuerde que usted está enviando comandos a Excel a través de la interfaz IDispatch. Esto significa que hay que pensar en cómo le gustaría hacer algo para encontrar la manera de hacerlo mediante programación.

Editar: el ejemplo gurú del código es para Excel 2003, pero debería ser bastante fácil de extenderlo a 2007:)

Haga clic aquí con el OpenXml SDK . Descargar el SDK desde aquí . El SDK utiliza .NET, lo que puede necesitar el uso de C ++. NET

Ha sido un tiempo muy largo, pero he utilizado el Jet OLEDB para llegar a los archivos de Excel. Es posible que empieza a buscar en esa dirección.

He utilizado un componente tercera Parte para esto en el pasado: OLE XlsFile de SM Software (no es gratis, pero de bajo costo). La ventaja de este componente en los componentes COM de Microsoft es que se puede usar para escribir archivos XLS de Excel, incluso si no está instalado.

También le permite crear speadsheets o libros con fórmulas incrustados y formato, algo que no es posible si utiliza archivos CSV como un formato de intercambio.

Si necesita el mejor rendimiento, escribir archivos de Excel binarios es el camino a seguir y escribir ellos no es tan difícil como leerlos. El formato de archivo binario está relativamente bien documentada por el proyecto OpenOffice.org:

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

y Microsoft también ha lanzado la documentación:

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

Esta solución funcionará mejor si usted tiene que escribir muchos archivos de Excel, en su mayoría con los datos y el formato pequeño, y si no desea abrir los archivos al mismo tiempo. Si se escribe un único archivo de Excel para abrirlo después, es probable que pueda utilizar la interfaz COM ++ C propsed como los otros críticos han explicado.

Uso de la interfaz COM requerirá costosas llamadas fuera de proceso a menos que se escribe un complemento COM de Excel. Si se escribe un complemento que importa sus datos en la hoja de Excel actual, llenando la hoja todavía será mucho más lento que el dumping un archivo, pero para un solo archivo a la vez esto puede ser aceptable dependiendo de su situación de usuario. Si decide utilizar la interfaz COM, minimizar el número de llamadas a Excel. Utilice los métodos que permiten insertar una matriz de valores si es que existen, definir propiedades de estilo por fila y la columna es posible y no por célula.

Puede utilizar ODBC para leer y escribir datos desde un archivo de Excel fácilmente sin Excel. El enlace: Aquí

El enlace para la forma de escribir datos mediante ODBC: Aquí

He utilizado un conjunto de clases de C ++ que está disponible de CodeProject antes de escribir en archivos XLS.

Es muy fácil de usar, y gratis! Lo puede encontrar aquí .

Me llevó tiempo para configurar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top