是否可以在 windows docker 容器中的 dotnet 核心应用 运行 中使用 EPPlus?
Is it possible to use EPPlus in dotnet core app running in a windows docker container?
我有一个 dotnet core 2.1 web api,它有一个生成 .xlsx 电子表格的操作。它创建一个浏览器随后可以处理的 FileStreamResult。生成电子表格的代码如下:
using (var excelFile = new ExcelPackage())
using (var worksheet = excelFile.Workbook.Worksheets.Add("Sheet 1"))
{
...
//insert data into worksheet
return new FileStreamResult(new MemoryStream(excelFile.GetAsByteArray()), "application/octet-stream") { FileDownloadName = "Report.xlsx" };
}
在 IIS 中托管它工作正常,并将生成电子表格。
当我在 windows docker 容器中托管应用程序时,特别是图像:microsoft/dotnet:2.1-aspnetcore-runtime-nanoserver-sac2016
我在尝试生成报告时遇到以下异常:
System.TypeInitializationException: The type initializer for 'Gdip'
threw an exception. ---> System.DllNotFoundException: Unable to load
DLL 'gdiplus.dll'
经过一番研究后,我意识到 gdiplus 不存在于 nanoserver 映像中。
是否可以使用 EPPlus 在 nanoserver 映像中托管的 dotnet 核心应用程序上创建电子表格?还是我必须使用另一个库来生成 xlsx?如果可能的话,我想使用 EPPlus。我不能使用 linux 容器(不幸的是现在)
我不知道它是否有效,但请尝试注释掉库中使用 System.Drawing.Common
的任何方法,例如 AutoFitColumns()
。这就是导致它在我的 linux 容器上损坏的原因。
您可以构建自己的 ubtuntu/dotnetcore 图像!我只是为这个问题自己做的。
从命令行:
docker pull ubuntu
docker run -t -t ubuntu:latest /bin/bash -> to open a container shell ->
apt-get update
apt-get install wget
wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
dpkg -i packages-microsoft-prod.deb
apt-get install apt-transport-https
apt-get update
apt-get install dotnet-sdk-2.2
安装解决System.Drawing/EPPlus问题所需的特殊库:
apt-get install libgdiplus
cd /usr/lib
ln -s libgdiplus.so gdiplus.dll
apt-get install libc6-dev libx11-dev
rm -rf /var/lib/apt/lists/*
在 second 命令行中找到容器进程 ID window 并提交镜像:
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4975113bb79 ubuntu:latest "/bin/bash" 9 minutes ago Up 9 minutes infallible_poincare
docker commit d497 custom/imagename:dotnetcore-2.2-custom
docker ps kill d497
docker image rm ubuntu
现在你有一个自定义 ubuntu 图像(与 dotnetcore 使用的图像相同),其中加载了 sdk 和你需要的库来阻止错误。
图像可能会被削减很多,请注意,这是我第一次成功尝试解决这个问题,而我在网上找到的其他方法由于公司防火墙限制等原因没有成功。
我有一个 dotnet core 2.1 web api,它有一个生成 .xlsx 电子表格的操作。它创建一个浏览器随后可以处理的 FileStreamResult。生成电子表格的代码如下:
using (var excelFile = new ExcelPackage())
using (var worksheet = excelFile.Workbook.Worksheets.Add("Sheet 1"))
{
...
//insert data into worksheet
return new FileStreamResult(new MemoryStream(excelFile.GetAsByteArray()), "application/octet-stream") { FileDownloadName = "Report.xlsx" };
}
在 IIS 中托管它工作正常,并将生成电子表格。
当我在 windows docker 容器中托管应用程序时,特别是图像:microsoft/dotnet:2.1-aspnetcore-runtime-nanoserver-sac2016
我在尝试生成报告时遇到以下异常:
System.TypeInitializationException: The type initializer for 'Gdip' threw an exception. ---> System.DllNotFoundException: Unable to load DLL 'gdiplus.dll'
经过一番研究后,我意识到 gdiplus 不存在于 nanoserver 映像中。
是否可以使用 EPPlus 在 nanoserver 映像中托管的 dotnet 核心应用程序上创建电子表格?还是我必须使用另一个库来生成 xlsx?如果可能的话,我想使用 EPPlus。我不能使用 linux 容器(不幸的是现在)
我不知道它是否有效,但请尝试注释掉库中使用 System.Drawing.Common
的任何方法,例如 AutoFitColumns()
。这就是导致它在我的 linux 容器上损坏的原因。
您可以构建自己的 ubtuntu/dotnetcore 图像!我只是为这个问题自己做的。
从命令行:
docker pull ubuntu
docker run -t -t ubuntu:latest /bin/bash -> to open a container shell ->
apt-get update
apt-get install wget
wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
dpkg -i packages-microsoft-prod.deb
apt-get install apt-transport-https
apt-get update
apt-get install dotnet-sdk-2.2
安装解决System.Drawing/EPPlus问题所需的特殊库:
apt-get install libgdiplus
cd /usr/lib
ln -s libgdiplus.so gdiplus.dll
apt-get install libc6-dev libx11-dev
rm -rf /var/lib/apt/lists/*
在 second 命令行中找到容器进程 ID window 并提交镜像:
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4975113bb79 ubuntu:latest "/bin/bash" 9 minutes ago Up 9 minutes infallible_poincare
docker commit d497 custom/imagename:dotnetcore-2.2-custom
docker ps kill d497
docker image rm ubuntu
现在你有一个自定义 ubuntu 图像(与 dotnetcore 使用的图像相同),其中加载了 sdk 和你需要的库来阻止错误。
图像可能会被削减很多,请注意,这是我第一次成功尝试解决这个问题,而我在网上找到的其他方法由于公司防火墙限制等原因没有成功。