2017-10-18 73 views
9

Staramy się utworzyć domyślny pulpit Excel, który nasi użytkownicy mogą pobrać. Podczas pobierania arkusza Excela chcemy wypełnić arkusz w pliku jego danymi.Nie można zapisać arkusza Excela po dodaniu danych, jeśli skoroszyt zawiera tabelę przestawną.

Używamy EPPlus do manipulowania arkuszem Excel.

Krótko mówiąc, struktura arkusza jest następujący:

  1. Sheet A elementy raportowania (tabele obrotu, wykresy obrotu oraz krajalnice)
  2. Sheet B która zawiera cały zestaw danych
  3. Nazwany zakres zdefiniowany jako =OFFSET(Data!$A$1;0;0;COUNTA(Data!$A:$A);COUNTA(Data!$1:$1)), który po prostu dostosowuje się do rozmiaru zestawu danych, który wstawiamy do tego arkusza.
  4. Bez względu na zakres nazwany, który został załadowany do Zapytania o moc i dodany do skoroszytów Model danych
  5. Wszystkie elementy sprawozdawcze od Sheet A jest skonfigurowany tak, aby załadować dane z Data Model

Ogólnie rzecz biorąc, to działa świetnie, dopóki jesteśmy ręcznie wpychając Sheet B z naszymi danymi. Kiedy staramy się wykorzystywać EPPlus za wypełnienie danych otrzymujemy błąd podczas próby zapisania pliku:

The cachesource is not a worksheet 

metodą prób i błędów, jakie pozbawione arkusza to części wyizolować przyczynę problemu . Podejrzewaliśmy, że mogły to być fragmentatory, użycie Power Query/Data Model lub trik z nazwanym zasięgiem. Jednak żaden z nich nie stanowi problemu - jeśli usuniemy wszystkie tabele przestawne z arkusza, możemy w prosty sposób zapisać skoroszyt. Ku mojemu zaskoczeniu, możemy korzystać z wykresów przestawnych, tylko tabele powodują problem.

Jakieś sugestie, jak uniknąć tego problemu z EPPlus? Na razie kontynuowaliśmy bez użycia tabel przestawnych, gdybyśmy chcieli je w pewnym momencie zwrócić :)

+1

Na podstawie https://github.com/pruiz/EPPlus/blob/master/EPPlus/Table/PivotTable/ExcelPivotCacheDefinition.cs (i komunikatu o błędzie) próbowano użyć źródła pamięci podręcznej jako arkusza roboczego? – mjwills

+0

Szczerze mówiąc, nie mam najmniejszego pojęcia, co to oznacza i jak to zrobić :) –

+0

@mjwills Przeszukałem trochę i znalazłem kilka sztuczek, aby wyłączyć pamięć podręczną tabeli przestawnej. Nie mogę znaleźć niczego, co dotyczy zmiany typu pamięci podręcznej w dowolnym miejscu. Sztuką powinno być odznaczenie "Zapisz dane źródłowe z plikiem", ale opcja ta wydaje się szara w naszym przypadku, gdy tabela przestawna ładuje się z modelu danych. –

Odpowiedz

1

Błąd - "The cachesource is not a worksheet" może wynikać z rozpoznania danych źródłowych w zakresie według Excela jako zakresu w arkusz roboczy.

Możesz zmienić zrzucone dane w zakresie na Arkusz B jako tabelę, używając ws.ListObjects.Add. Gdy tabela przestawna jest odświeżana, powinna automatycznie pobierać wszystkie dane z tabeli.

Proszę również sprawdzić inną alternatywę dostępną na pokrewnym pytaniu - Definiując tabelę zamiast zakresu jako PivotTable 'cacheSource', jeśli to pomaga.

+0

Dziękuję za twoją opinię @IITC Czy mogę cię nieco opracować na temat "Możesz zmienić zrzucone dane w zakresie na Arkusz B [...]" Nie jestem pewien, czy całkowicie za tobą podążam. Jeśli chodzi o zmianę źródła pamięci podręcznej, nie sądzę, aby było to możliwe w przypadku mojej instalacji. Jak wspomniano w jednym z moich komentarzy powyżej, używam Power Query i jego OLAP Cube/Data Model do podłączenia wszystkich wykresów przestawnych i tabel. Wydaje się to znacznie ograniczać moje opcje. –

0

Podczas manipulowania danymi przestawnymi jest wiele issues related with cache. Kiedyś rzuciłem na niego okiem na this other bounty here.

In musi być takie samo z EPPlus. Musisz obsługiwać pamięć podręczną danych Pivot ręcznie, na przykład zrobić here.

I tutaj facet daje complete solution for handling filters with EPPlus.

Mam nadzieję, że to pomaga.

+0

Dziękuję za twoją opinię J. Chomel, pozwól mi rzucić okiem na linki, które podasz i zbadaj je trochę. –