Zwrocenie xlsx do Response

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 ??

0

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

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-us/library/system.io.memorystream.getbuffer(v=vs.110).aspx

Dodatkowo możesz mieć problem z kodowaniem.

0

Po zmianie na

fileData = result.ToArray(); 

Niestety nadal to samo :(

0

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

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).

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