2010-12-14 4 views
6

Sto cercando un modo per archiviare dati XML in un file Excel. I dati dovrebbero essere completamente nascosti all'utente, non dovrebbe essere in una cella o un commento, anche nascosto. Inoltre, i dati devono essere conservati quando l'utente si apre e quindi salva il file con Excel. Non sto cercando un modo per mappare celle a dati XML esterni. I dati XML devono trovarsi all'interno del file xlsx.Qual è il modo migliore per archiviare dati XML in un file Excel

I dati verranno inseriti utilizzando uno strumento C#, non Excel stesso.

risposta

2

Excel è un'applicazione per archiviare, manipolare e visualizzare i dati e, quindi, non è progettato per archiviare dati illeggibili illeggibili. Tuttavia, come hai accennato, puoi usare campi nascosti su un foglio separato per inserire alcune informazioni.

+0

dovrei utilizzare un oggetto OLE incorporato? O una parte personalizzata? – user542393

+0

Qual è lo scopo per la memorizzazione di questo xml nel file? –

6

Il file .xlsx è in realtà solo un archivio di compressione (file zip), quindi se si desidera veramente aggiungere un file nascosto, è sufficiente aggiungere un file .xml all'archivio. In quel modo Excel non avrebbe nemmeno saputo che era lì.

Rinominare un file .xlsx in .zip, estrarlo, aggiungere il file, quindi selezionare i contenuti del file .zip e archiviarli nuovamente. Rinomina in .xlsx e avrai il tuo file .xml nascosto lì dentro. (NOTA: Non zip nella cartella di livello superiore, solo il contenuto)

È possibile farlo in C# utilizzando una libreria zip come SharpZipLib: http://www.sharpdevelop.net/OpenSource/SharpZipLib/

UPDATE: Questo file "nascosti" sarà non essere conservato se l'utente salva il file da Excel. L'idea migliore che posso venire con questo scenario è di invocare il codice come parte di una macro VBA incorporata nel foglio.

Questo link contiene informazioni utili sul manipolare le parti di un pacchetto Office: http://msdn.microsoft.com/en-us/library/aa982683.aspx

Il core.xml e app.xml (nella cartella docProps) contengono le proprietà del documento e potrebbe essere una buona posizione per memorizzare supplementari informazioni xml.

+0

Conserverà i dati XML dopo un 'Salva come ... 'dall'utente? – reinierpost

+0

Non sopravviverà né a Salva né a Salva con nome. Grazie per averlo notato. Non avevo letto abbastanza bene quella parte della domanda. –

+0

Corretto, non sopravviverà a Excel.SaveAs. Tuttavia, Word consente parti personalizzate. Esiste un equivalente in Excel? forse un tipo di relazione speciale? Vedere http://msdn.microsoft.com/en-us/library/bb608618.aspx – user542393

6

Ho avuto lo stesso problema e qui è il mio codice per affrontarlo, utilizzando Microsoft's Custom XML Parts. (Puoi trovare tutte le spiegazioni necessarie nei miei commenti nel codice).

//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); 
} 

Informazioni sull'oggetto xlworkbook usato sopra:

using Excel = Microsoft.Office.Interop.Excel; 

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