是否可以在windows docker容器中运行的dotnet核心应用程序中使用EPPlus?

问题描述 投票:2回答:1

我有一个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容器(不幸的是,现在不幸)

c# docker .net-core gdi+ epplus
1个回答
1
投票

我不知道它是否会起作用,但是尝试评论使用System.Drawing.Common的库中的任何方法,例如AutoFitColumns()。这就是导致它在我的linux容器上破坏的原因。


0
投票

您可以构建自己的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以及停止错误所需的库。

图像可能会被削减很多,请注意,这是我第一次成功尝试解决这个问题,其中我在网上发现的其他方法由于公司防火墙限制而没有成功。

© www.soinside.com 2019 - 2024. All rights reserved.