2015-09-24 15 views
5

Sto creando una serie di cartelle di lavoro Excel utilizzando EPPlus v3.1.3. Quando apro i file appena creati, se lo chiudo senza toccare nulla mi chiede se voglio salvare le mie modifiche. L'unica cosa che ho notato cambia se dico "sì" è che il file app.xml è leggermente alterato - non c'è nessuna differenza visibile nella cartella di lavoro, e il resto dei file XML sono gli stessi. Ho provato entrambi questi approcci:Ha chiesto di salvare le modifiche sul file creato con EPPlus

ExcelPackage p = new ExcelPackage(new FileInfo(filename)); 
p.Save(); 

così come

ExcelPackage p = new ExcelPackage(); 
p.SaveAs(new FileInfo(filename)); 

ed entrambi hanno lo stesso problema. C'è un modo per avere l'output del file app.xml nella sua forma definitiva?

Il motivo per cui questo è un problema è dovuto al fatto che utilizziamo un programma SAS per QC e quando il programma SAS apre i file poiché sono stati emessi direttamente dal programma EPPlus, non preleva i valori dalle celle che hanno formule in loro. Se è aperto e si sceglie "sì" per "vuoi salvare le modifiche", funziona correttamente. Tuttavia, dato che ne stiamo creando diverse centinaia, ciò non è pratico.

Inoltre, sto usando un modello. Il modello sembra normale.

Ciò che è particolarmente strano è che utilizziamo questo sistema da più di un anno, e questa è la prima volta che abbiamo riscontrato questo problema.

C'è qualche modo per aggirare questo? Sul lato C# o SAS?

+0

Hai inavvertitamente disattivato i calcoli delle formule in Excel? Puoi confermare se questo è un problema anche da una macchina diversa? –

+0

I calcoli delle formule sono attivi e la vista protetta è disabilitata. Ho provato su due macchine diverse. – yammerade

risposta

2

Quello che stai vedendo non è inusuale in realtà. Epplus in realtà non genera un file XLSX completo, ma crea il contenuto XML grezzo (tutti i formati di documenti Office 2007 sono basati su xml) e lo inserisce nel file zip che viene rinominato in XLSX. Dal momento che non è stato eseguito attraverso il motore Excel, non è stato completamente formattato per eccellere.

Se si tratta di una semplice scheda tecnica, è probabile che Excel non debba eseguire molti calcoli, ma solo una formattazione di base. Quindi in tal caso non ti chiederà di salvare. Ma anche così, se lo vedrai, cambierà leggermente il file XLSX. Se vuoi davvero vedere cosa sta dietro le quinte, rinomina il file in .zip e guarda i file xml dentro prima e dopo.

Il problema a cui si sta eseguendo è perché non è una semplice esportazione di tabelle Excel deve eseguire calcoli quando viene aperto per la prima volta. Questo potrebbe essere molte cose: formule, filtri automatici, colonne automatiche/altezza delle righe, delineare, ecc. In sostanza, tutto ciò che renderà il foglio un po '"diverso" dopo che excel avrà finito con esso.

Sfortunatamente, non esiste una soluzione facile per questo. Eseguirlo attraverso il DOM di excel in qualche modo sarebbe più semplice, il che ovviamente vanifica lo scopo dell'utilizzo di EPPlus. L'altra cosa che potresti fare è vedere la differenza tra il prima e il dopo dei file xml (e ci sono un sacco di cose in cui dovresti guardare) e imitare ciò che excel avrebbe modificato/aggiunto nella versione del file "dopo" da modifica manuale del contenuto XML. Questa non è un'opzione molto carina a seconda di quanto estesi sarebbero i cambiamenti. Si può vedere come ho fatto in altre situazioni qui:

Create Pivot Table Filters With EPPLUS

Adding a specific autofilter on a column

Set Gridline Color Using EPPlus?

+0

Grazie. Ho pensato che sarebbe stata la risposta, ma speravo ci fosse una soluzione più semplice. Penso che mi limiterò a spostare tutti i calcoli da Excel in modo da non bombardare il nostro sistema di controllo di qualità. – yammerade

+0

@LisaMcCusker Sicuro. Un'altra opzione che ho dimenticato di menzionare è VBA. È possibile spostare la logica incriminata in una macro che si attiva quando il foglio viene aperto per la prima volta in Excel e quindi si ripara senza VBA. Inoltre, non è il modo più pulito per farlo, ma ho pensato di parlarne. Vedi qui: http://stackoverflow.com/questions/26734787/epplus-pivot-table-copy-values-to-new-sheet/26736549#26736549. – Ernie

1

Mi sono imbattuto in questo stesso problema utilizzando EPPlus (versione 4.1.0, fyi) e trovato l'aggiunta del seguente codice prima della chiusura risolto il problema:

p.Workbook.Calculate(); 
p.Workbook.FullCalcOnLoad = false; 
Problemi correlati