Creazione di documento di Excel come allegato in un elenco SharePoint
-
28-09-2019 - |
Domanda
Ho alcuni problemi di aggiunta di un documento Excel come allegato a un elenco personalizzato. Ho fatto un eventreceiver che raccoglie i dati provenienti da altri elenchi e mette i dati in un documento di Excel.
Quello che ho cercato di fare per risolvere il problema:
- testato CreateContentRow (indice, item) in un'applicazione console separata (opere)
- controllato se c'è qualcosa di sbagliato con il recupero dati da altre liste (opere)
- provato da salvare in una libreria di documenti (il file viene salvato senza contenuto)
- provato ad aprire il documento xlsx per sé, se c'è qualcosa di sbagliato con l'XML (senza XML personalizzato aggiunto).
Il codice funziona bene, ma il documento viene salvato, ma è identica al modello, nessun contenuto aggiunto.
using (var memory = new MemoryStream())
{
var binary = template.OpenBinary();
memory.Write(binary, 0, binary.Length);
using (var document = SpreadsheetDocument.Open(memory, true))
{
var workbookPart = document.WorkbookPart;
var worksheetparts = workbookPart.WorksheetParts;
var worksheetpart = worksheetparts.FirstOrDefault();
var sheetData = worksheetpart.Worksheet.GetFirstChild<SheetData>();
var index = 2;
foreach (var item in items)
{
var row = CreateContentRow(index, item);
index++;
sheetData.AppendChild(row);
}
properties.ListItem.Attachments.Add("name" + string.Format("{0:yyyy-MM-dd_HHmmss}", DateTime.Now) + ".xlsx", memory.ToArray());
properties.ListItem.Update();
}
}
sto usando lo stesso approccio su un'altra lista in cui ho generare i documenti .docx lì funziona bene. C'è una grande differenza nel modo in cui avrei dovuto salvare il documento a seconda se .xlsx o .docx?
Quando il debug delle celle e le righe vengono aggiunte al sheetdata, ma non viene salvato. Tutte le idee su come risolvere questo problema?
Soluzione
Al fine di ottenere il contenuto salvato avevo bisogno di aggiungere salvare le istruzioni.
wspart.Worksheet.Save();
document.WorkbookPart.Workbook.Save();
Quando ho aggiunto le linee di sopra prima di aggiungere il tutto attachemnt ha funzionato come dovrebbe.