2015-09-24 33 views
5

Tworzę serię skoroszytów programu Excel przy użyciu programu EPPlus v3.1.3. Kiedy otworzę nowo utworzone pliki, jeśli zamknę je bez dotykania czegokolwiek, zapytam, czy chcę zapisać moje zmiany. Jedyne, co zauważyłem, zmienia się, jeśli powiem "tak", że plik app.xml jest nieco zmieniony - nie ma widocznej różnicy w skoroszycie, a pozostałe pliki XML są takie same. Próbowałem obu tych podejść:Monit o zapisanie zmian w pliku utworzonym za pomocą programu EPPlus

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

jak

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

i oba mają ten sam problem. Czy istnieje sposób na wydrukowanie pliku app.xml w jego ostatecznym formularzu?

Powodem jest to, że używamy programu SAS do kontroli jakości, a gdy program SAS otwiera pliki, ponieważ zostały one bezpośrednio wyprowadzone z programu EPPlus, to nie pobiera wartości z komórek, które mają wzory w nich. Jeśli jest otwarty i "tak" jest wybrane dla "czy chcesz zapisać zmiany", działa poprawnie. Jednak, gdy tworzymy kilkaset z nich, nie jest to praktyczne.

Ponadto używam szablonu. Szablon wygląda normalnie.

Szczególnie dziwne jest to, że używamy tego systemu przez ponad rok i po raz pierwszy napotkaliśmy ten problem.

Czy jest jakiś sposób obejścia tego? Zarówno po stronie C#, jak i SAS?

+0

Czy przypadkowo wyłączyłeś obliczenia formuły w programie Excel? Czy możesz potwierdzić, czy jest to problem również z innego komputera? –

+0

Obliczenia formuł są włączone, a widok chroniony wyłączony. Próbowałem na dwóch różnych maszynach. – yammerade

Odpowiedz

2

To, co widzisz, nie jest niczym niezwykłym. Epplus w rzeczywistości nie generuje pełnego pliku XLSX - raczej tworzy surową zawartość XML (wszystkie formaty dokumentów pakietu Office 2007 są oparte na xml) i umieszcza ją w pliku zip, którego nazwa została zmieniona na XLSX. Ponieważ nie został uruchomiony przez silnik programu Excel, nie został w pełni sformatowany, aby mógł go polubić.

Jeśli jest to prosty arkusz danych, to istnieje szansa, że ​​Excel nie musi wykonywać wielu obliczeń - wystarczy podstawowe formatowanie. W takim przypadku nie będzie cię prosił o zapisanie. Ale nawet jeśli to zrobisz, zobaczysz, że zmienia trochę plik XLSX. Jeśli naprawdę chcesz zobaczyć, co dzieje się za kulisami zmień nazwę pliku na .zip i spójrz na pliki xml wewnątrz i przed.

Problem, na który się natknąłeś, polega na tym, że nie jest to zwykły eksport tabeli. Excel musi po raz pierwszy uruchomić obliczenia. Może to być wiele rzeczy - formuły, autofiltry, automatyczna adiustacja wysokości kolumn/rzędów, konturowanie itp. Zasadniczo wszystko, co sprawi, że arkusz będzie wyglądał trochę inaczej po zakończeniu programu Excel, zostanie z nim zrobione.

Niestety, nie ma łatwego rozwiązania. Uruchamianie go w DOM-ie programu excel byłoby jak najprostsze, co oczywiście pokonuje cel używania EPPlus. Inną rzeczą, którą możesz zrobić, to zobaczyć różnicę pomiędzy plikami przed i po plików xml (a jest ich tam sporo, na które musiałbyś popatrzeć) i naśladować, co excel zmieniłby/dodałby w wersji "po" pliku przez ręczna edycja zawartości XML. To nie jest bardzo ładna opcja w zależności od tego, jak duże zmiany będą. Można zobaczyć, jak mam to zrobić w innych sytuacjach tutaj:

Create Pivot Table Filters With EPPLUS

Adding a specific autofilter on a column

Set Gridline Color Using EPPlus?

+0

Dzięki. Pomyślałem, że to będzie odpowiedź, ale miałem nadzieję, że istnieje prostsze obejście. Myślę, że po prostu przestawię wszystkie obliczenia z Excela, więc nie zbombardujemy naszego systemu QC. – yammerade

+0

@LisaMcCusker Pewnie. Inną opcją, o której zapomniałem wspomnieć, jest VBA. Można przesunąć logikę obraźliwą do makra, które wystrzeli, gdy arkusz otworzy się po raz pierwszy w programie Excel, a następnie ponownie się wyświetli bez VBA. Również nie najczystszy sposób na to, ale pomyślałem, że wspomnę o tym. Zobacz tutaj: http://stackoverflow.com/questions/26734787/epplus-pivot-table-copy-values-to-new-sheet/26736549#26736549. – Ernie

1

wpadłem na tej samej kwestii korzystania EPPlus (wersja 4.1.0, fyi) i znaleziono dodanie następującego kodu przed zamknięciem. Naprawiono problem:

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