2014-11-13 13 views
6

Sto lavorando con un'applicazione console/WebJob che utilizza la libreria EPPlus per lavorare con file di Excel (.xlsx). La mia applicazione apre fondamentalmente un set di cartelle di lavoro e le unisce insieme come un unico file.EPPlus, l'esecuzione in Azure produce "Si è verificato un errore generico in GDI +"

L'applicazione funziona correttamente localmente, ma non in Azure. Secondo lo StackTrace, l'errore si verifica all'interno della libreria EEPlus quando si tenta di salvare un'immagine (presumo che ciò avvenga per spostare le immagini da una cartella di lavoro a un'altra).

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) 

Il codice originale, che produce l'errore aperta chiedendo ConvertTo.

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; 

Dopo aver letto diverse domande sulla questione ho cercato di modificarlo utilizzando un manuale di conversione e il salvataggio di un MemoryStream. Tuttavia sto ancora ricevendo l'errore.

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; 

Sono davvero bloccato su cosa provare dopo. L'eccezione non produce così tanto da fare, e sento di aver già provato tutti i suggerimenti là fuori: controllo delle autorizzazioni di file e cartelle (la mia app utilizza la cartella temp, che credo sia sicura), evitare il riutilizzo di flussi e presto.

Per favore fatemi sapere se avete bisogno di ulteriori informazioni e sarò lieto di metterlo.

+0

a corto di memoria dovrebbe essere la vostra considerazione superiore, questo codice non è esattamente frugale con esso. Un'immagine stupida nel file .doc successivo. –

+0

Bene, credete che sarebbe il caso in entrambi i casi (modificato e non modificato)? Posso vedere come il mio esempio modificato potrebbe correre quel rischio, ma entrambi gli esempi si bloccano nello stesso identico modo. –

+0

Beh, perché no, entrambi divorano memoria e presumibilmente entrambi elaborano lo stesso file .xlsx. Non si può davvero tralasciare alcun dettaglio sul file specifico in cui questo fallisce. –

risposta

0

Io di solito uso EPPlus in questo modo:

  1. Afferra un template.xlsx ho formattato in precedenza
  2. aggiungere dati ad esso (utilizzando C# e EPPlus)
  3. Ritorna il nuovo xlsx per l'utente

recentemente ho avuto lo stesso errore:

A generic error occurred in GDI+ 

Come è stato risolto:

mio template.xlsx stava usando Excel fotocamera strumento: vale a dire, c'era una fotografia in uno dei fogli che stava per essere incollati in un altro foglio.

Questo funziona bene localmente (nel mio computer) ma non in Azure ... Non so perché.

Ma se rimuovere l'istantanea funziona

Problemi correlati