我有一个dotnet core 2.1 Web API,该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在nanoserver映像中托管的dotnet核心应用程序上创建电子表格?还是我必须使用另一个库来生成xlsx?如果可能的话,我想使用EPPlus。我不能使用linux容器(不幸的是现在还是这样)
答案 0 :(得分:1)
我不知道它是否可以工作,但是尝试注释掉使用struct Properties {
static int roll;
static std::string name;
static std::vector<std::string> vec;
};
int Properties::roll = 1;
std::string Properties::name{};
std::vector < std::string > vec;
int main()
{
Properties::roll = 1;
Properties::name = "Jack";
Properties::vec.push_back("Hellooooo"); // unresolved external symbol "public: static class
return 0;
}
的库中的任何方法,例如System.Drawing.Common
。这就是导致它在我的linux容器上损坏的原因。
答案 1 :(得分:0)
您可以构建自己的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/*
在秒命令行窗口中找到容器进程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以及停止错误所需的库。
该图像可能会被修剪掉,请注意,这是我第一次成功解决此问题的尝试,由于公司防火墙的限制,在网上我发现其他方法均未成功。