2010-12-14 15 views
6

Estoy buscando una manera de almacenar datos XML en un archivo de Excel. Los datos deben estar completamente ocultos para el usuario, no deben estar en una celda o comentario, incluso ocultos. Además, los datos deben conservarse cuando el usuario abre y luego guarda el archivo con Excel. No estoy buscando una forma de asignar celdas a datos XML externos. Los datos XML deben estar dentro del archivo xlsx.Cuál es la mejor manera de almacenar datos XML en un archivo de Excel

Los datos se ingresarán utilizando una herramienta C#, no Excel en sí.

Respuesta

2

Excel es una aplicación para almacenar, manipular y visualizar datos, y por lo tanto, no está diseñado para almacenar datos arbitrarios ilegibles. Sin embargo, como lo aludió, podría usar campos ocultos en una hoja separada para poner algo de información.

+0

¿Debo utilizar un objeto OLE incrustado? ¿O una parte personalizada? – user542393

+0

¿Cuál es el propósito de almacenar este xml en el archivo? –

6

El archivo .xlsx es en realidad solo un archivo de compresión (archivo zip) por lo que si realmente desea agregar un archivo oculto, entonces puede agregar un archivo .xml al archivo. De esa forma, Excel ni siquiera sabría que estaba allí.

Cambie el nombre de un archivo .xlsx a .zip, extráigalo, agregue su archivo, luego seleccione el contenido del archivo .zip y vuelva a archivarlos. Cambie el nombre a .xlsx y tendrá su archivo oculto .xml allí. (NOTA: No comprimir la carpeta de nivel superior, sólo los contenidos)

Usted puede hacer esto en C# usando una biblioteca zip como SharpZipLib: http://www.sharpdevelop.net/OpenSource/SharpZipLib/

ACTUALIZACIÓN: Este archivo "oculto" se no se conservará si el usuario guarda el archivo desde Excel. La mejor idea que se me ocurre para ese escenario es invocar el código como parte de una macro de VBA incrustada en la hoja.

Este enlace contiene información útil sobre la manipulación de las partes de un paquete de oficina: http://msdn.microsoft.com/en-us/library/aa982683.aspx

El core.xml y app.xml (en la carpeta docProps) contienen las propiedades del documento y podría ser una buena ubicación para almacenar adicional información xml

+0

¿Esto preservará los datos XML después de un 'Guardar como ...' del usuario? – reinierpost

+0

No sobrevivirá ni a Guardar ni a Guardar como. Gracias por notar eso No había leído esa parte de la pregunta lo suficiente. –

+0

Correcto, no sobrevivirá Excel.SaveAs. Sin embargo, Word permite partes personalizadas. ¿Hay un equivalente en Excel? tal vez un tipo de relación especial? Consulte http://msdn.microsoft.com/en-us/library/bb608618.aspx – user542393

6

Tuve el mismo problema y aquí está mi código para manejarlo, usando Microsoft's Custom XML Parts. (Puede encontrar todas las explicaciones necesarias en mis comentarios en el código).

//Deletes all the previously added parts and adds a new part 
//containing the string argument which has to be in XML format. 


public void addCustomXMLPart(string test) 
{ 
    IEnumerator e = Xlworkbook.CustomXMLParts.GetEnumerator(); 
    e.Reset(); 
    CustomXMLPart p; 
    //The !p.BuiltIn is because before our customXMLPart there are some 
    // Excel BuiltIns of them and if we try to delete them we will get an exception. 
    while (e.MoveNext()) 
    { 
     p = (CustomXMLPart)e.Current; 
     if (p != null && !p.BuiltIn) 
      p.Delete(); 
    } 
    Xlworkbook.CustomXMLParts.Add(test, Type.Missing); 
} 

Sobre el objeto xlworkbook utilizado anteriormente:

using Excel = Microsoft.Office.Interop.Excel; 

Excel.Workbook XlWorkbook = (Excel.Workbook) 
    (Excel.Application)Marshal.GetActiveObject("Excel.Application")).ActiveWorkbook; 
Cuestiones relacionadas