Come scrivere una cartella di lavoro di Excel in un MemoryStream in .NET?

Come posso scrivere una cartella di lavoro di Excel in un MemoryStream senza prima salvarla nel file system?

Tutte le opzioni all’interno delle opzioni di salvataggio Microsoft.Office.Interop.Excel.WorkBook prendono un nome file.

Ho svolto un lavoro approfondito con il PIA e con la memorizzazione di file Excel in un repository di documenti e lo ho trasmesso al browser, e non sono stato in grado di trovare una soluzione per utilizzare il PIA senza prima scrivere i contenuti sul file system.

Penso che dovrai ingoiare il proiettile e gestire il file system come intermediario. La buona notizia è che si può semplicemente dare al file un nome univoco come un guid o usare un altro metodo tempfilename (non è sicuro se ne esiste uno in .net) e basta cancellare il contenuto quando hai finito.

Questo può essere fatto con Open XML SDK 2.0. Eric White ha un grande articolo su come lavorare con i file OOXML in streaming a Lavorare con documenti Open XML in memoria

Se è necessaria la funzionalità di base di Excel, è ansible creare la cartella di lavoro come stream Html. C’è un’altra domanda su SO che è senza mani .

Questo risolve anche alcuni problemi (che potreste non avere ancora) relativi alla scalabilità della vostra soluzione.

Un’altra opzione sarebbe quella di utilizzare questa libreria gratuita per esportare la cartella di lavoro. Il metodo di salvataggio sulla class della cartella di lavoro può assumere un nome file o uno stream.

L’unico modo per farlo è se tu fossi preparato a creare un object personalizzato che ti permettesse di memorizzare tutti i vari bit e pezzi di dati / formule / vba / links / ole oggetti che avresti voluto conservare, copia dalla tua cartella di lavoro a l’object e quindi mantenere quell’object in un stream di memoria. In affetto usando il tuo object proxy come una via di mezzo.

Non c’è modo (come altri hanno detto) di scrivere un file Excel direttamente nella memoria.

Con il formato OpenXML di Excel 2007, è ansible utilizzare l’evento BeforeSave della cartella di lavoro per disporre di un metodo personalizzato che imposta innanzitutto il parametro Cancel dell’evento BeforeSave su True, quindi serializza il pacchetto xml risultante (che rappresenta il file) in un object in memoria.