2014-11-13 10 views
6

Pracuję z aplikacją konsolową/WebJob, która wykorzystuje bibliotekę EPPlus do pracy z plikami-Excel (.xlsx). Moja aplikacja zasadniczo otwiera zestaw skoroszytów i łączy je razem jako jeden plik.EPPlus, działający na Azure, generuje "Ogólny błąd wystąpił w GDI +"

Aplikacja działa poprawnie lokalnie, ale nie na Azure. Według StackTrace błąd występuje wewnątrz biblioteki EEPlus podczas próby zapisania obrazu (zakładam, że robi się to w celu przeniesienia obrazów z jednego skoroszytu do drugiego).

Unhandled Exception: System.ApplicationException: A generic error occurred in GDI+. 
---> System.Runtime.InteropServices.ExternalException: A generic error occurred in GDI+. 
at System.Drawing.Image.Save(Stream stream, ImageCodecInfo encoder, EncoderParameters encoderParams) 
at System.Drawing.Image.Save(Stream stream, ImageFormat format) 
at OfficeOpenXml.Drawing.ExcelPicture..ctor(ExcelDrawings drawings, XmlNode node) 
at OfficeOpenXml.Drawing.ExcelDrawing.GetDrawing(ExcelDrawings drawings, XmlNode node) 
at OfficeOpenXml.Drawing.ExcelDrawings.AddDrawings() 
at OfficeOpenXml.Drawing.ExcelDrawings..ctor(ExcelPackage xlPackage, ExcelWorksheet sheet) 
at OfficeOpenXml.ExcelWorksheets.Add(String Name, ExcelWorksheet Copy) 

Oryginalny kod, który wywołuje błąd nazywając ConvertTo otwarty.

Part = drawings.Part.Package.GetPart(UriPic); 
FileInfo f = new FileInfo(UriPic.OriginalString); 
ContentType = GetContentType(f.Extension); 
_image = Image.FromStream(Part.GetStream()); 
ImageConverter ic=new ImageConverter(); 
var iby=(byte[])ic.ConvertTo(_image, typeof(byte[])); 
var ii = _drawings._package.LoadImage(iby, UriPic, Part); 
ImageHash = ii.Hash; 

Po przeczytaniu kilku pytań w tej sprawie Próbowałem zmodyfikować go za pomocą ręcznej konwersji i zapisania w MemoryStream. Jednak wciąż dostaję błąd.

Part = drawings.Part.Package.GetPart(UriPic); 
FileInfo f = new FileInfo(UriPic.OriginalString); 
ContentType = GetContentType(f.Extension); 
_image = Image.FromStream(Part.GetStream()); 

byte[] iby; 
using (MemoryStream ms = new MemoryStream()) 
{ 
    _image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); 
    iby = ms.ToArray();     
} 

var ii = _drawings._package.LoadImage(iby, UriPic, Part); 
ImageHash = ii.Hash; 

Naprawdę utknąłem na czym spróbować. Wyjątek nie daje tak wiele do zrobienia i wydaje mi się, że już wypróbowałem wszystkie sugestie: Sprawdzanie uprawnień do folderów i plików (moja aplikacja używa folderu tymczasowego, który moim zdaniem jest bezpieczny), unikając ponownego wykorzystywania strumieni i wkrótce.

Proszę dać mi znać, jeśli potrzebujesz dodatkowych informacji i chętnie go podam.

+0

Running out of memory powinien być twój top uwagę, ten kod nie jest dokładnie oszczędny z nim. Nieskalany obraz w pliku .doc dalej. –

+0

Czy uważasz, że tak jest w obu przypadkach (zmodyfikowane i niezmodyfikowane)? Widzę, jak mój zmodyfikowany przykład może uruchomić to ryzyko, ale oba przykłady ulegają awarii w dokładnie taki sam sposób. –

+0

Cóż, dlaczego nie, obie pożerają pamięć i prawdopodobnie oba przetwarzają ten sam plik .xlsx. Nie można naprawdę pominąć żadnych szczegółów dotyczących konkretnego pliku, który się nie powiedzie. –

Odpowiedz

0

I zazwyczaj korzystają EPPlus w ten sposób:

  1. chwycić template.xlsx już wcześniej sformatowana
  2. Dodaj do niego dane (przy użyciu C# i EPPlus)
  3. Powrót nowy xlsx użytkownikowi

niedawno miałem ten sam błąd:

A generic error occurred in GDI+ 

Jak to zostało rozwiązane:

My template.xlsx używał Excel Camera Narzędzie, to znaczy nie było migawka w jednym z arkuszy, który był wklejony w innym arkuszu.

Działa to dobrze lokalnie (w moim komputerze), ale nie na Azure ... Nie wiem dlaczego.

Ale jeśli usunąć migawkę to działa

Powiązane problemy