2015-02-10 15 views
9

Generiamo una serie di rapporti su fogli di calcolo Excel utilizzando EPPlus.Quando si tenta di chiudere un foglio di calcolo, Excel chiede all'utente se salvare le modifiche

In genere il codice più o meno così:

var workbookFile = new FileInfo(reportFile); 
using (var excel = new ExcelPackage(workbookFile)) 
{ 
    var wb = excel.Workbook; 
    var ws = wb.GetCleanWorksheet("Report"); 
    ws.Select(); 

    // write data to sheet 
    ws.Cells[1, 1].Value = "foo"; 

    excel.Save(); 
} 

Quando l'utente apre il foglio, tutto sembra a posto. Quando provano a chiudere il foglio di calcolo senza aver apportato alcuna modifica, Excel chiederà loro se vogliono salvare le modifiche. Questo non è un grosso problema ma è fastidioso e un po 'preoccupante.

Ho aperto i fogli di calcolo nello strumento di produttività SDK OpenXML e in questo passano la convalida.

+1

https://epplus.codeplex.com/discussions/230017 –

+2

Grazie per la ricerca di questo. Vuoi fare una rapida risposta così posso accettarla? (A meno che qualcuno non voglia fare una risposta più approfondita che generi i risultati della formula in cache e inserirli direttamente nell'XML ...) – Coxy

+0

Ti chiederà sempre di salvare le modifiche anche se non ce ne sono se hai celle collegate che prendono valori da un altro documento. Conta l'aggiornamento della cella come variazione di valore, e se alcuni altri casi non ricordo. – helena4

risposta

6

Ecco una risposta a una domanda simile risposta da supporto Microsoft all'indirizzo http://support.microsoft.com/kb/213428 "per forzare una cartella di lavoro per chiudere senza salvare le modifiche, digitare il seguente codice in un modulo di Visual Basic di quella cartella di lavoro:

Sub Auto_Close ()

ThisWorkbook.Saved = true

End Sub

Perché la proprietà Saved è impostata su true, Excel risponde come se la cartella di lavoro è è già stato salvato e non sono state apportate modifiche dall'ultimo salvataggio. "

Spero che questo aiuti.

2

Una soluzione sarebbe quella di eseguire uno stile ninja open-save-close con Interop Excel dopo aver salvato il file con EPPlus. Qualcosa di simile:

using Excel = Microsoft.Office.Interop.Excel; 

var workbookFile = new FileInfo(reportFile); 
using (var excel = new ExcelPackage(workbookFile)) 
{ 
    var wb = excel.Workbook; 
    var ws = wb.GetCleanWorksheet("Report"); 
    ws.Select(); 

    // write data to sheet 
    ws.Cells[1, 1].Value = "foo"; 

    excel.Save(); 
} 
Excel.Application _Excel = null; 
Excel.Workbook WB = null; 
try 
{ 

    _Excel = new Microsoft.Office.Interop.Excel.Application(); 
    WB = _Excel.Workbooks.Open(reportFile); 
    _Excel.DisplayAlerts = false; 
    WB.Close(true); 
} 
catch (Exception ex) 
{ 
    WB.Close(false); 
} 
finally 
{ 
    GC.Collect(); 
    GC.WaitForPendingFinalizers(); 
    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(WB); 
    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(_Excel); 
} 
+0

Le risposte tue e @thatkindofmatt dipendono da Interop :( –

+0

Non sono sicuro di poterlo superare senza aprire effettivamente Excel in base al commento del link nel post originale .... forse la soluzione migliore sarebbe non usare le formule. .. – Tyress

2

io non sono sicuro di EPPLus, ma l'Excel Interop ti permettono di tacere coloro avvisi.

var xlApp = new Excel.Application(); 
xlApp.DisplayAlerts = false; 

Excel sceglierà la risposta predefinita.

+0

Sarebbe bello .. ma al giorno d'oggi per eseguire Interop nel server è necessario modificare alcune proprietà di sicurezza ... anche Microsoft consiglia di non usarlo :( –

1

Prova ad eseguire l'aggiornamento alla versione più recente. A partire dalla versione 4.0.4.0 questo non sembra essere un problema con i fogli semplici. La sintassi è un po 'diverso però:

var workbookFile = new FileInfo(reportfile); 
using (var excel = new ExcelPackage(workbookFile)) 
{ 
    ExcelWorksheet ws = excel.Workbook.Worksheets.Add("Report"); 
    ws.Cells[1, 1].Value = "foo"; 
    excel.Save(); 
} 

Excel non mi chiede di salvare nulla (a meno che non posso cambiare qualcosa). Si noti che poiché il file non è stato eseguito tramite DOM di Excels, il comportamento che si vede è in qualche modo previsto nelle cartelle di lavoro complesse, perché Excel applicherà la propria formattazione, ma non la vedo più nei fogli semplici.

1

Disattivare "DisplayAlerts" durante la chiusura. Questo può essere fatto con uno script VBA integrato. Basta aggiungere seguente codice (workbook è la cartella di lavoro corrente):

workbook.CreateVBAProject(); 
workbook.CodeModule.Name = "DisplayAlertsOff"; 
StringBuilder sb = new StringBuilder(); 
sb.AppendLine("Sub CloseBook()"); 
sb.AppendLine(" Application.DisplayAlerts = False"); 
sb.AppendLine(" ActiveWorkbook.Close"); 
sb.AppendLine(" Application.DisplayAlerts = True"); 
sb.AppendLine("End Sub"); 
workbook.CodeModule.Code = sb.ToString(); 
Problemi correlati