Zwrocenie xlsx do Response

Odpowiedz Nowy wątek
2014-09-25 11:33
owen1990
0

Hej

Używam biblioteki NPOI do generowania xlsx. Natrafiłem na problem ale nie moge znaleźć rozwiazania. Czy ktoś pomoże ?


IWorkbook wb = WorkbookFactory.Create(stream);
FileStream sw = File.Create("D:\\Pliki\\upload\\cc.xlsx");
wb.Write(sw);
sw.Close();

using (MemoryStream result = new MemoryStream())
{
      wb.Write(result);
      fileData = result.GetBuffer();
}

HttpContext.Current.Response.Clear();
HttpContext.Current.Response.Buffer = false;
HttpContext.Current.Response.ContentType = "application/application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
HttpContext.Current.Response.AppendHeader("content-disposition", "attachment; filename=ExcelFileName.xlsx");
HttpContext.Current.Response.OutputStream.Write(fileData , 0, fileData .Length);
HttpContext.Current.Response.Flush();
HttpContext.Current.Response.Close();

Problem polega na tym że do ścieżki D:\Pliki\upload\cc.xlsx plik można normalnie otworzyć bez błędów, natomiast jako response zwroci mi plik który zawiera błedy zawartości pliku. Poniżej lista informacji po naprawie pliku przez excel:

Removed Part: /xl/sharedStrings.xml part with XML error. (Strings) Deklaracja text/xml może znajdować się tylko na samym początku wejścia. Line 1, column 24712.
Replaced Part: /xl/worksheets/sheet4.xml part with XML error. Deklaracja text/xml może znajdować się tylko na samym początku wejścia. Line 1, column 34601.

Ktoś miałby pomysł dlaczego w response zwraca mi zle plik excel ??

application/application/vnd.openxmlformats-officedocument.spreadsheetml.sheet? Chyba o jedno application za daleko. - ŁF 2014-09-25 12:42

Pozostało 580 znaków

2014-09-25 12:44
ŁF
0

Masz źródłowy i wynikowy plik xlsx. Porównaj ich zawartość.


Pozostało 580 znaków

2014-09-25 19:00
0
fileData = result.GetBuffer();

Zamiań na:

fileData = result.ToArray();

I powinno być dobrze.

Dodatkowe informacje:

Note that the buffer contains allocated bytes which might be unused. For example, if the string "test" is written into the MemoryStream object, the length of the buffer returned from GetBuffer is 256, not 4, with 252 bytes unused. To obtain only the data in the buffer, use the ToArray method; however, ToArray creates a copy of the data in memory.

Źródło: http://msdn.microsoft.com/en-[...]ream.getbuffer(v=vs.110).aspx

Dodatkowo możesz mieć problem z kodowaniem.


Yubby dibby dibby dibby dibby dibby dibby dum..
edytowany 1x, ostatnio: DibbyDum, 2014-09-25 19:02

Pozostało 580 znaków

2014-09-25 23:16
Owen1990
0

Po zmianie na

fileData = result.ToArray(); 

Niestety nadal to samo :(

Pozostało 580 znaków

2014-09-28 21:10
0

Spróbuj bezpośrednio:
wb.Write(HttpContext.Current.Response.OutputStream);
Spróbuj nie zapisywać wcześniej do pliku jeśli nie zadziała.


░█░█░█░█░█░█░█░█░█░█░█░

Pozostało 580 znaków

2014-09-29 11:50
ŁF
0

napiszę jeszcze raz, bo najwyraźniej nie zauważyłeś tego. Porównaj plik źródłowy, poprawnie się otwierający, z plikiem ściągniętym. Zrób to narzędziem umożliwiającym porównanie hex lub w jakiś inny przyjazny programiście sposób. Na podstawie różnic prawdopodobnie dojdziesz, co się zmieniło (np. że z UTF-8 zrobiło się UTF-16).


Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0