我有一个dotnet核心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:'Gdip'的类型初始值设定项引发了异常。 ---> System.DllNotFoundException:无法加载DLL'gdiplus.dll'
经过一些研究后,我意识到gdiplus在纳米服务器图像中不存在。
是否可以使用EPPlus在纳米服务器映像中托管的dotnet核心应用程序上创建电子表格?或者我是否必须使用另一个库来生成xlsx?我想尽可能使用EPPlus。我不能使用linux容器(不幸的是,现在不幸)
我不知道它是否会起作用,但是尝试评论使用System.Drawing.Common
的库中的任何方法,例如AutoFitColumns()
。这就是导致它在我的linux容器上破坏的原因。
您可以构建自己的ubuntu / dotnet核心映像!我只是为这个问题自己做了。
从命令行:
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/*
在第二个命令行窗口中找到容器进程ID并提交映像:
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以及停止错误所需的库。
图像可能会被削减很多,请注意,这是我第一次成功尝试解决这个问题,其中我在网上发现的其他方法由于公司防火墙限制而没有成功。