为啥 AWS Lambda 环境中的 EPPlus Excel 库会引发“'Gdip' 的类型初始化程序引发异常”

Posted

技术标签:

【中文标题】为啥 AWS Lambda 环境中的 EPPlus Excel 库会引发“\'Gdip\' 的类型初始化程序引发异常”【英文标题】:Why Does EPPlus Excel Library in AWS Lambda Environment Throw "The type initializer for 'Gdip' threw an exception"为什么 AWS Lambda 环境中的 EPPlus Excel 库会引发“'Gdip' 的类型初始化程序引发异常” 【发布时间】:2021-12-26 05:28:05 【问题描述】:

将此问题发布给遇到相同问题的其他人。我的回答如下。

我创建了一个 AWS Lambda 方法,该方法接收一系列用于生成报告的查询参数。使用优秀的EPPlus 库将报告数据保存在 Excel 文件中。当我在开发环境中运行代码时,它可以毫无问题地执行。在我将代码部署到 AWS 并通过 URL 调用它后,我得到以下异常:

“Gdip”的类型初始化器抛出异常

为什么在部署后会出现这种情况,但在开发环境中却能正常运行?

【问题讨论】:

【参考方案1】:

我能够确定的是,在尝试自动调整列宽以适合其中一个工作表中提供的数据时会发生错误。 EPPlus 为范围提供了一个 AutoFitColumns 方法,该方法将根据范围中最宽的数据调整列的大小。一旦我将这行代码确定为异常的来源,一切就都说得通了。

我尚未确认这一点,但我假设 EPPlus 循环遍历范围内每个单元格中的文本,并从 System.Drawing 命名空间调用 .Net Graphics.MeasureString 方法以确定呈现文本的宽度。一旦确定了最宽的字符串,就会相应地设置列宽。

问题在于 GDI+ API 在 AWS lambda 环境中似乎不可用。我相信您可以将libgdiplus 添加到您的AWS Lambda 环境中(请参阅论坛讨论here 和here)。但是,我没有尝试更改配置,而是选择启用自动换行的默认列宽。

【讨论】:

以上是关于为啥 AWS Lambda 环境中的 EPPlus Excel 库会引发“'Gdip' 的类型初始化程序引发异常”的主要内容,如果未能解决你的问题,请参考以下文章

aws 如何从生产环境中的 lambda 函数访问 ECS 服务

AWS Lambda环境中的自定义软件

无法为执行AWS :: CloudFormation :: CustomResource的aws lambda函数设置环境变量

为啥 aws lambda 调用客户端错误地返回 ClientExecutionTimeoutException?

为啥 AWS Lambda 函数在回调函数执行之前完成?

为啥我的 AWS Lambda 脚本返回“实例”而不是实例 ID?