c# - EPPlus,在 Azure 中运行生成 "A generic error occurred in GDI+"

标签 c# azure epplus

我正在使用控制台应用程序/WebJob,它利用 EPPlus 库来处理 Excel 文件 (.xlsx)。我的应用程序基本上打开一组工作簿并将它们合并为一个文件。

应用程序在本地运行良好,但在 Azure 中运行不佳。根据 StackTrace,当尝试保存图像时,错误发生在 EEPlus 库内部(我假设这是为了将图像从一个工作簿移动到另一个工作簿)。

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)

原始代码,在调用 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;

在阅读了有关此事的几个问题后,我尝试使用手动转换并保存到 MemoryStream 来修改它。但是我仍然收到错误。

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;

我真的不知道下一步该尝试什么。该异常不会产生太多继续,我觉得我已经尝试了所有建议:检查文件夹和文件权限(我的应用程序使用临时文件夹,我认为这是安全的),避免重用流和很快。

如果您需要任何其他信息,请告诉我,我很乐意提供。

最佳答案

由于内部依赖于 System.Drawing 库,使用当前版本的 EPPlus 无法实现这一点。

请参阅此处了解有关该主题的官方帖子: https://github.com/JanKallman/EPPlus/issues/427

这里还有一些其他有趣的读物:https://photosauce.net/blog/post/5-reasons-you-should-stop-using-systemdrawing-from-aspnet

似乎唯一的方法是识别 EPP 中依赖于 System.Drawing 的函数并解决它们。或者调整 EPP 以使用不同的图形库。

这可能是您开始确定可以避免的部分的良好开端:https://github.com/JanKallman/EPPlus/search?q=%22using+system.drawing%3B%22&unscoped_q=%22using+system.drawing%3B%22

关于c# - EPPlus,在 Azure 中运行生成 "A generic error occurred in GDI+",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26905314/

相关文章:

c# - EPPlus - 从工作表中获取文件名

c# - C# 中的服务器托管错误

c# - 如何根据日期自动运行 SQL 查询?

c# - 如何停止 Parallel.ForEach 循环?

azure - 将类型化对象添加到 Azure 中的 MessageQueue

c# - 如何从使用 EPPLUS 生成的 excel 中获取列

c# - C# for .NET 和 C# for mono 有什么真正的区别吗?

azure - 为什么Azure VM有DVD驱动器?

azure - Azure 上的打包/发布错误

c# - 使用 EPPlus 库将公式替换为 Excel 中的值