GVKun编程网logo

ASP.NET 开源导入导出库 Magicodes.IE Docker 中使用(aspnet导出word)

15

如果您对ASP.NET开源导入导出库Magicodes.IEDocker中使用和aspnet导出word感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解ASP.NET开源导入导出库Magicod

如果您对ASP.NET 开源导入导出库 Magicodes.IE Docker 中使用aspnet导出word感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解ASP.NET 开源导入导出库 Magicodes.IE Docker 中使用的各种细节,并对aspnet导出word进行深入的分析,此外还有关于.NET Core开源导入导出库 Magicodes.IE 2.3发布、.NET 开源导入导出库 Magicodes.IE 2.5发布、ASP.NET Core 实战:使用 Docker 容器化部署 ASP.NET Core + MySQL + Nginx、ASP.NET 开源导入导出库 Magicodes.IE 导出 Excel 教程的实用技巧。

本文目录一览:

ASP.NET 开源导入导出库 Magicodes.IE Docker 中使用(aspnet导出word)

ASP.NET 开源导入导出库 Magicodes.IE Docker 中使用(aspnet导出word)

https://www.cnblogs.com/yyfh/archive/2020/02/15/12310628.html


Magicodes.IE 在 Docker 中使用

更新历史
2019.02.13
【Nuget】版本更新到 2.0.2
【导入】修复单列导入的 Bug,单元测试 “OneColumnImporter_Test”。问题见(https://github.com/dotnetcore/Magicodes.IE/issues/35)。
【导出】修复导出 HTML、Pdf、Word 时,模板在某些情况下编译报错的问题。
【导入】重写空行检查。
2019.02.14
【Nuget】版本更新到 2.1.0
【导出】PDF 导出支持.NET 4.6.1,具体见单元测试







说明

本章主要说明使用 Magicodes.IE,在 Docker 环境中的配置.

要点

  • 通过 Dto 进行 Excel 导出
  • 导出 PDF 数据
  • Docker 配置

示例

导出示例:

Install-Package Magicodes.IE.Excel
Install-Package Magicodes.IE.Pdf
  • 导出 Excel
    [ExcelExporter(Name = "学生信息", TableStyle = "Light10", AutoFitAllColumn = true,
        MaxRowNumberOnASheet = 2)]
    public class StudentExcel
    {

        /// <summary>
        ///     姓名
        /// </summary>
        [ExporterHeader(DisplayName = "姓名")]
        public string Name { get; set; }
        /// <summary>
        ///     年龄
        /// </summary>
        [ExporterHeader(DisplayName = "年龄")]
        public int Age { get; set; }
        /// <summary>
        ///     备注
        /// </summary>
        public string Remarks { get; set; }
        /// <summary>
        ///     出生日期
        /// </summary>
        [ExporterHeader(DisplayName = "出生日期", Format = "yyyy-mm-DD")]
        public DateTime Birthday { get; set; }
    }

        public async Task<IActionResult> ExporterExcel() {
            IExporter exporter = new ExcelExporter();
           
            var result = await exporter.Export(Path.Combine("wwwroot","test.xlsx"), new List<StudentExcel>()
                {
                    new StudentExcel
                    {
                        Name = "MR.A",
                        Age = 18,
                        Remarks = "我叫MR.A,今年18岁",
                        Birthday=DateTime.Now
                    },
                    new StudentExcel
                    {
                        Name = "MR.B",
                        Age = 19,
                        Remarks = "我叫MR.B,今年19岁",
                        Birthday=DateTime.Now
                    },
                    new StudentExcel
                    {
                        Name = "MR.C",
                        Age = 20,
                        Remarks = "我叫MR.C,今年20岁",
                        Birthday=DateTime.Now
                    }
                });
            return File("test.xlsx", "application/ms-excel", result.FileName);
        }
  • 导出 PDF

    [PdfExporter(Name = "学生信息")]
    public class StudentPdf
    {
        /// <summary>
        ///     姓名
        /// </summary>
        [ExporterHeader(DisplayName = "姓名")]
        public string Name { get; set; }
        /// <summary>
        ///     年龄
        /// </summary>
        [ExporterHeader(DisplayName = "年龄")]
        public int Age { get; set; }
        /// <summary>
        ///     备注
        /// </summary>
        public string Remarks { get; set; }
        /// <summary>
        ///     出生日期
        /// </summary>
        [ExporterHeader(DisplayName = "出生日期", Format = "yyyy-mm-DD")]
        public DateTime Birthday { get; set; }
    }

        public async Task<IActionResult> ExporterPdf() {
            var exporter = new PdfExporter();
            var result = await exporter.ExportListByTemplate(Path.Combine("wwwroot", "test.pdf"), new List<StudentPdf>()
            {
                 new StudentPdf
                    {
                        Name = "MR.A",
                        Age = 18,
                        Remarks = "我叫MR.A,今年18岁",
                        Birthday=DateTime.Now
                    },
                    new StudentPdf
                    {
                        Name = "MR.B",
                        Age = 19,
                        Remarks = "我叫MR.B,今年19岁",
                        Birthday=DateTime.Now
                    },
                    new StudentPdf
                    {
                        Name = "MR.C",
                        Age = 20,
                        Remarks = "我叫MR.C,今年20岁",
                        Birthday=DateTime.Now
                    }
            });
            return File("test.pdf", "application/pdf", result.FileName);
        }

通过上述代码我们创建了一个导出示例,
具体特性属性可以看一下前两篇文章 基础教程之导出 Excel 、基础教程之导出 Pdf 收据

Dockerfile 配置

FROM ccr.ccs.tencentyun.com/magicodes/aspnetcore-runtime:latest AS base
# 安装libgdiplus库,用于Excel导出
#RUN apt-get update && apt-get install -y libgdiplus libc6-dev
#RUN ln -s /usr/lib/libgdiplus.so /usr/lib/gdiplus.dll

#RUN apt-get update && apt-get install -y fontconfig
WORKDIR /src
RUN ls
COPY /src/Magicodes.IE.Exporter/simsun.ttc /usr/share/fonts/simsun.ttc

WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/core/sdk:latest AS build
WORKDIR /src
COPY ["Magicodes.IE.Exporter.csproj", "src/Magicodes.IE.Exporter/"]
RUN dotnet restore "src/Magicodes.IE.Exporter/Magicodes.IE.Exporter.csproj"
COPY . .
WORKDIR "src/Magicodes.IE.Exporter"
RUN dotnet build "Magicodes.IE.Exporter.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "Magicodes.IE.Exporter.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from= publish /app/publish .
ENTRYPOINT ["dotnet", "Magicodes.IE.Exporter.dll"]
# 安装libgdiplus库,用于Excel导出
RUN apt-get update && apt-get install -y libgdiplus libc6-dev
RUN ln -s /usr/lib/libgdiplus.so /usr/lib/gdiplus.dll
# 安装fontconfig库,用于Pdf导出
RUN apt-get update && apt-get install -y fontconfig
COPY /simsun.ttc /usr/share/fonts/simsun.ttc

注意,以上基础镜像使用:(ccr.ccs.tencentyun.com/magicodes/aspnetcore-runtime:latest) , 该镜像 GitHub 地址:(https://github.com/xin-lai/aspnetcore-docker)。

推荐理由:

  • 加快镜像构建和拉取速度,加速 CI\CD 构建以及提高开发体验
  • 时区默认设置为东八区,见 “ENV TZ=Asia/Shanghai”
  • 默认安装了 libgdiplus 等库,以便支持 Excel 导入导出
  • 目前提供了腾讯云的公共镜像和 hub.docker 的公共镜像,大家可以按需

Reference

https://github.com/dotnetcore/Magicodes.IE

https://github.com/hueifeng/BlogSample/tree/master/src/Magicodes.IE.Exporter

.NET Core开源导入导出库 Magicodes.IE 2.3发布

.NET Core开源导入导出库 Magicodes.IE 2.3发布

在2.3这一版本的更新中,我们迎来了众多的使用者、贡献者,在这个里程碑中我们也添加并修复了一些功能。对于新特点的功能我将在下面进行详细的描述,当然也欢迎更多的人可以加入进来,再或者也很期待大家来提issues或者PR,您的一个issue或者PR将是我们前进的动力。

  • 公式导出 #88

公式导出目前已经在Excel模板导出中支持,我们可以通过如上代码片段的格式进行将公式应用到我们的Excel导出模板中.

{{Formula::AVERAGE?params=G4:G6}}{{Formula::SUM?params=G4:G6&G4}}
  • 增加分栏、分sheet、追加rows导出 #74

在该版本中我们支持使用链式编程导出我们的Excel,从而起到追加分栏等作用。

在多个DTO导出中我们可以通过如下代码片段将我们的Excel分栏导出

exporter.Append(list1).SeparateByColumn().Append(list2).ExportAppendData(filePath);

导出形式如下所示:

header 1 header 2 header1
row 1 col 1 row 1 col 2 row1
row 2 col 1 row 2 col 2 row2

我们还可以通过多个DTO进行多Sheet的导出,如下代码片段所示:

exporter.Append(list1).SeparateBySheet().Append(list2).ExportAppendData(filePath);

当然不仅仅是这样,我们还可以对行进行追加导出,同时我们可以选择导出额外的Header信息或者不导出

exporter.Append(list1).SeparateByRow().Append(list2).ExportAppendData(filePath);
header 1 header 2 header1
row 1 col 1 row 1 col 2 row1
row 2 col 1 row 2 col 2 row2
row 2 col 1 row 2 col 2 row2

或者我们可以这样加入Header信息

exporter.Append(list1).SeparateByRow().AppendHeaders().Append(list2).ExportAppendData(filePath);
header 1 header 2 header1

.NET 开源导入导出库 Magicodes.IE 2.5发布

.NET 开源导入导出库 Magicodes.IE 2.5发布

今天我们发布了2.5版本,这当然也离不开大家对Magicodes.IE的支持,今天我也是跟往常一样列举了该版本一些重要的更新内容。

当然也要说一下,在这个版本中我们设计了全新的LOGO

Excel导出

  • Excel导出支持HeaderRowIndex #164

ExcelExporterAttribute导出特性类中添加HeaderRowIndex属性,方便导出时去指定从第一行开始导出。

  • 增加Excel枚举导出对DescriptionAttribute的支持 #168

在导出枚举类型时起初我们可以通过ValueMapping和导出枚举本身的字符串名称,在现在我们可以通过
DescriptionAttribute、
DisplayAttribute,
DisplayNameAttribute
实现Text值导出

enum Sex{  /// <summary>  /// 男  /// </summary>  [Description("男")]  boy = 1,  /// <summary>  /// 女  /// </summary>  [Description("女")]  girl = 2}
  • TableStyle修改为枚举类型

在这之前我们将TableStyle属性放在了ExporterAttribute基础特性中,起初我们的TableStyle属性为字符串,
但是带给了我们不必要的麻烦,很难让使用者去查找这些样式名称,所以此处我们将其换成了枚举类型,方便使用者从列表中
进行查找相关样式

 [ExcelExporter(Name = "测试", TableStyle = TableStyles.Light10)]

Excel导入

  • Excel生成导入模板支持内置数据验证#167

对于内置数据验证的支持可通过IsInterValidation属性开启,并且需要注意的是仅
支持MaxLengthAttribute、
MinLengthAttribute、
StringLengthAttribute、
RangeAttribute

支持对内置数据验证的开启操作。

支持对输入提示的展示操作。

示例代码如下所示:

 public class GenerateStudentImportSheetDataValidationDto {  /// <summary>  ///  序号  /// </summary>  [ImporterHeader(Name = "序号", IsInterValidation = true)]  [Range(minimum: 0, maximum: 20, ErrorMessage = "序号最大为20")]  pu.........

ASP.NET Core 实战:使用 Docker 容器化部署 ASP.NET Core + MySQL + Nginx

ASP.NET Core 实战:使用 Docker 容器化部署 ASP.NET Core + MySQL + Nginx

原文: ASP.NET Core 实战:使用 Docker 容器化部署 ASP.NET Core + MySQL + Nginx

 一、前言

  在之前的文章(ASP.NET Core 实战:Linux 小白的 .NET Core 部署之路)中,我介绍了如何在 Linux 环境中安装 .NET Core SDK / .NET Core Runtime、Nginx、MySQL,以及如何将我们的 ASP.NET Core MVC 程序部署到 Linux 上,同时,使用 supervisor  守护程序守护我们的 .NET Core 程序。如果,你有看过那篇文章,并且和我一样是个 Linux 小白用户的话,可能第一感觉就是,把 .NET Core 项目部署在 IIS 上也挺好。

  将 .NET Core 项目部署到 Linux 上如此复杂,就没有简单的部署方式吗?

  你好,有的,Docker 了解一下~~~

  PS:这里的示例代码还是采用之前的毕业设计项目,在这篇文章发布的时候,我已经在程序的仓库中添加了对于 Docker 的支持,你可以下载下来,自己尝试一下,毕竟,实践出真知。

   代码仓储:https://github.com/Lanesra712/Danvic.PSU

 二、Step by Step

  1、安装 Docker & Docker Compose

  在代码交付的过程中,偶尔会遇到这样的问题,在本地测试是好的,但是部署到测试环境、生产环境时就出这样那样的问题,同时,因为本地与测试环境、生产环境之间存在差异,我们可能无法在本地复现这些问题,那么,有没有一种工具可以很好的解决这一问题呢?随着历史的车轮不断前行,容器技术诞生了。

  Docker,作为最近几年兴起的一种虚拟化容器技术,他可以将我们的运行程序与操作系统做一个隔离,例如这里我们需要运行 .NET Core 程序,我们不再需要关心底层的操作系统是什么,不需要在每台需要需要运行程序的机器上安装程序运行的各种依赖,我们可以通过程序打包成镜像的方式,将应用程序和该程序的依赖全部置于一个镜像文件中,这时,只要别的机器上有安装 Docker,就可以通过我们打包的这个镜像来运行这个程序。

  1.1、卸载 Docker

  在安装 Docker 之前,我们应该确定当前的机器上是否已经安装好了 Docker,为了防止与现在安装的 Docker CE 发生冲突,这里我们先卸载掉以前版本的 Docker,如果你确定你的机器上并没有安装 Docker 的话此步可以跳过。

  在 Linux 中可以使用 \ 加 Enter 在输入很长很长的语句时进行换行,这里和后面的命令都是采用这样的方式。

sudo yum remove docker \
  docker-client \
  docker-client-latest \
  docker-common \
  docker-latest \
  docker-latest-logrotate \
  docker-logrotate \
  docker-engine

  1.2、添加 yum 源

  在安装 Docker CE 的方式上,我是采用将 Docker CE 的源添加到 yum 源中,之后我们就可以直接使用 yum install 安装 Docker CE,整个的安装过程如下。

# 安装工具包从而可以让我们在 yum 中添加别的仓储源
sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2

# 设置 docker ce 的稳定库地址
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

# 安装 docker ce
sudo yum install docker-ce docker-ce-cli containerd.io

  当我们安装好 Docker 之后,我们就可以使用 docker 命令验证我们是否在机器上成功安装了 Docker,同时,也可以使用 docker --version 命令查看我们安装的 Docker CE 版本。

  1.3、设置开机自启

  当 Docker 已经在我们的机器上安装完成后,我们就可以将 Docker 设置成机器的自启服务,这样,如果出现服务器重启的情况下,我们的 Docker 也可以随服务器的重启自动启动 Docker 服务。

# 启动 Docker 服务并允许开机自启
sudo systemctl start docker

# 查看当前 dokcer 的运行情况
sudo systemctl status docker

  1.4、Hello World

  就像我们在学习一门新的语言时,运行的第一句代码,几乎都是打印出 Hello World,而在 Docker Hub 中,也有这么一个镜像,在无数的 Docker 教程中,安装完 Docker 后,第一件事就是拉取这个镜像文件,“告诉” Docker,我来了。

  Docker Hub 是存放镜像的仓库,里面包含了许多的镜像文件,因为服务器在国外的原因,下载的速度可能不理想,像国内的阿里云、腾讯云也有提供对于 Docker 镜像的加速器服务,你可以按需使用,当然,你也可以创建属于你的私有镜像仓库。

docker run hello-world

  docker run 命令,它会在我们的本地镜像库中先寻找这个镜像,然后运行。如果在本地没有找到的话,则会自动使用 docker pull 从 Docker Hub 中寻找,能找到的话,则会自动下载到本地,然后运行,找不到的话,这条命令也就运行失败了。

  1.5、安装 Docker Compose

  在实际的项目开发中,我们可能会有多个应用镜像,例如在本篇文章的示例中,为了在 Docker 中运行我们的程序,我们需要三个镜像:应用程序自身镜像、MySQL Server 镜像、以及 Nginx 镜像,为了将我们的程序启动起来,我们需要手敲各个容器的启动参数,环境变量,容器命名,指定不同容器的链接参数等等一系列的操作,又多又烦,可能某一步操作失败后程序就无法正常运行。而当我们使用了 Docker Compose 之后,我们就可以把这些命令一次性写在 docker-compose.yml 配置文件中,以后每次启动我们的应用程序时,只需要通过 docker compose 命令就可以自动帮我们完成这些操作。

# 从 github 下载 docker compose 二进制文件
sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 对下载的二进制文件应用可执行权限
sudo chmod +x /usr/local/bin/docker-compose

# 查看 docker compose 版本
docker-compose --version

  2、构建程序镜像

  当我们在服务器上安装好 docker 和 docker compose 之后,就可以开始构建我们的程序镜像了。首先我们需要对我们的运行程序添加对于 Docker 的支持。你可以自己手动在 MVC 项目中添加 Dockerfile 文件,或是通过右键添加 Docker 支持。

  Dockerfile 就像一个执行的清单,它告诉 Docker,我们这个镜像在构建和运行时需要按照什么样的命令运行。打开 VS 为我们自动创建的 Dockerfile,可以看到清晰的分成了四块的内容。

  我们知道,.NET Core 程序的运行需要依赖于 .NET Core Runtime(CoreCLR),因此,为了使我们的程序可以运行起来,我们需要从 hub 中拉取 runtime ,并在 此基础上构建我们的应用镜像。同时,为了避免因为基础的环境的不同造成对程序的影响,这里的 Runtime 需要同程序开发时的 .NET Core SDK 版本保持一致,所以这里我使用的是 .NET Core 2.1 Runtime。

  一个镜像中包含了应用程序及其所有的依赖,与虚拟机不同的是,容器中的每个镜像最终是共享了宿主机的操作系统资源,容器作为用户空间中的独立进程运行在主机操作系统上。

  PS:图片版权归属于微软的技术文档,如有侵权,请联系我删除,源文件地址:什么是 Docker?

  镜像可以看成一个个小型的“虚拟主机”,这里我们在镜像中创建了一个 /app 路径作为我们程序在镜像中的工作目录,同时,将 80 端口暴露给 Docker,从而可以使我们在镜像外面通过端口访问到当前镜像中的运行的程序。

FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

  因为我们的应用是一个多层架构的单体应用,最终的 MVC 项目依赖于解决方案中的各个类库以及我们从 Nuget 中下载的各种第三方组件,在部署时,需要将这些组件打包成 dll 引用。所以,这里我们需要使用 .NET Core SDK 中包含的 .NET Core CLI 进行还原和构建。

  就像在下面的代码中,我们在镜像的内部创建了一个 /src 的路径,将当前解决方案下的类库都复制到这个目录下,之后通过 dotnet restore 命令还原我们的主程序所依赖的各个组件。当我们还原好依赖的组件后,就可以使用 dotnet build 命令生成 Release版本的 dll 文件,同时输出到之前创建的 /app 路径下。

FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /src
COPY ["PSU.Site/PSU.Site.csproj", "PSU.Site/"]
COPY ["03_Logic/PSU.Domain/PSU.Domain.csproj", "03_Logic/PSU.Domain/"]
COPY ["03_Logic/PSU.Repository/PSU.Repository.csproj", "03_Logic/PSU.Repository/"]
COPY ["01_Entity/PSU.Entity/PSU.Entity.csproj", "01_Entity/PSU.Entity/"]
COPY ["02_Infrastructure/PSU.Utility/PSU.Utility.csproj", "02_Infrastructure/PSU.Utility/"]
COPY ["04_Rule/PSU.Model/PSU.Model.csproj", "04_Rule/PSU.Model/"]
COPY ["02_Infrastructure/PSU.EFCore/PSU.EFCore.csproj", "02_Infrastructure/PSU.EFCore/"]
COPY ["04_Rule/PSU.IService/PSU.IService.csproj", "04_Rule/PSU.IService/"]
COPY ["Controllers.PSU/Controllers.PSU.csproj", "Controllers.PSU/"]
RUN dotnet restore "PSU.Site/PSU.Site.csproj"
COPY . .
WORKDIR "/src/PSU.Site"
RUN dotnet build "PSU.Site.csproj" -c Release -o /app

  上面一步可以看成我们在使用 VS 生成 Release 版本的解决方案,当生成没有出错之后,我们就可以进行程序的发布。

FROM build AS publish
RUN dotnet publish "PSU.Site.csproj" -c Release -o /app

  当已经生成发布文件之后,按照我们平时部署在 Windows 上的过程,这时就可以通过 IIS 部署运行了,因此,构建我们应用镜像的最后一步就是通过 dotnet 命令执行我们的程序。

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "PSU.Site.dll"]

  似乎到这一步构建程序镜像就结束了,按照这样流程做的话,就需要我们将整个的解决方案上传到服务器上了,可是,很多时候,我们仅仅是把我们在本地发布好的项目上传到服务器上,这与我们现在的构建流程具有很大的不同,所以这里我们来修改 Dockerfile 文件,从而符合我们的发布流程。

  从上面分析 Dockerfile 的过程中不难看出,在服务器上构建镜像的第二步、第三步就是我们现在在开发环境中手动完成的部分,所以这里,我们只需要对这部分进行删除即可,修改后的 Dockerfile 如下。

FROM microsoft/dotnet:2.1-aspnetcore-runtime
WORKDIR /app
COPY . /app 
EXPOSE 80
ENTRYPOINT ["dotnet","PSU.Site.dll"]

  在修改后的 Dockerfile 中,可以看到,我们删去了 build 和 release 的过程,选择直接将我们 Dockerfile 路径下的文件拷贝到镜像中的 /app 路径下,然后直接执行 dotnet 命令,运行我们的程序。

  为了确保 Dockerfile 与发布后的文件处于同一路径下,这里我们需要使用 VS 修改 Dockerfile 的属性值,确保会复制到输出的目录下,这里选择如果较新则复制即可。

  3、编写 docker-compose.yml

  当我们构建好应用的镜像,对于 Nginx 和 MySQL 我们完全可以从 hub 中拉取下来,再执行一些配置即可。所以,我们现在就可以编写 docker compose 文件,来定义我们的应用镜像运行时需要包含的依赖以及每个镜像的启动顺序。

  右键选中 MVC 项目,添加一个 docker-compose.yml 文件,同样的,需要修改该文件的属性,以便于该文件可以复制到输出目录下。注意,这里的文件名和上文的 Dockerfile 都是特定的,你不能做任何的修改。如果你的电脑上已经安装了 Docker for Windows,你也可以使用 VS,右键添加,选中容器业务流程协调程序支持自动对 docker compose 进行配置。

  在 yml 文件中,我定义了三个镜像:psu.site、docker.mysql、docker.nginx。三个镜像的定义中有许多相同的地方,都设置了自动重启(restart),以及都处于同一个桥接网络下(psu-net)从而达到镜像间的通信。

  docker.mysql 是 MySQL 的镜像,我们通过环境变量 MYSQL_ROOT_PASSWORD 设置了 MySQL 的数据库连接密码,并通过挂载卷的方式将镜像中的数据库文件持久化到我们的服务器本地路径中。同时,将镜像的 3306 端口映射到服务器的 3306 端口上。

  psu.site 则是我们的程序镜像,采用位于 /usr/wwwroot/psu/ 路径下的 Dockerfile 文件进行构建的,因为主程序的运行需要依赖于数据库,所以这里采用 depends_on 属性,使我们的应用镜像依赖于 docker.mysql 镜像,即,在 docker.mysql 启动后才会启动应用镜像。

  docker.nginx 则是我们的 nginx 镜像,这里将镜像中的 80 端口和 443 端口都映射到服务器 IP 上,因为我们需要配置 Nginx 从而监听我们的程序,所以通过挂载卷的方式,将本地的 nginx.conf 配置文件用配置映射到镜像中。同时,因为我们在构建应用镜像的 Dockerfile 文件时,对外暴露了 80 端口,所以这里就可以通过 links 属性进行监听(如果构建时未暴露端口,你可以在 docker compose 文件中通过 Expose 属性暴露镜像中的端口)。

  Nginx 的配置文件如下,这里特别需要注意文件的格式,缩进,一点小错误都可能导致镜像无法正常运行。如果你和我一样将 nginx.conf 放到程序运行路径下的,别忘了修改文件的属性。

server {
    listen 80;
	
    location / {
      proxy_pass http://psu.site;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Host $http_host;
      proxy_cache_bypass $http_upgrade;
    }
}

  一个完整的 docker compose 文件如下,包含了三个镜像以及一个桥接网络。

version: ''3.7''

services:
  docker.mysql:
    image: mysql
    ports:
      - "3306:3306"
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=123456@sql
    volumes:
      - /usr/mysql:/var/lib/mysql
    networks:
      - psu-net

  psu.site:
    build: /usr/wwwroot/psu/
    restart: always
    depends_on:
      - docker.mysql
    networks:
      - psu-net

  docker.nginx:
    image: nginx
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    links:
      - psu.site
    networks:
      - psu-net

networks:
  psu-net:
    driver: bridge

  这里需要注意,所有有用到镜像间的通信的地方,我们都需要使用镜像名进行指代,例如上面的 nginx 的配置文件中,我们需要将监听的地址改为镜像名称,以及,我们需要修改程序的数据库访问字符串的服务器地址,修改后的数据库连接字符串如下所示。

"ConnectionStrings": {
    "SQLConnection": "server=docker.mysql;database=PSU.Site;user=root;password=123456@sql;port=3306;persistsecurityinfo=True;"
  }

  4、发布部署程序

  当我们构建好 docker compose 文件后就可以把整个文件上传到服务器上进行构建 docker 镜像了。这里我将所有的部署文件放在服务器的 /usr/wwwroot/psu/ 路径下,这时我们就可以通过 docker compose 命令进行镜像构建。

  定位到部署文件在的位置,我们可以直接使用下面的命令进行镜像的(重新)构建,启动,并链接一个服务相关的容器,整个过程都会在后台运行,如果你希望看到整个过程的话,你可以去掉 -d 参数。

# 执行镜像构建,启动
docker-compose up -d

  当 up 命令执行完成后,我们就可以通过 ps 命令查看正在运行的容器,若有的容器并没有运行起来,则可以使用 logs 查看容器的运行日志从而进行排错。

# 查看所有正在运行的容器
docker-compose ps

# 显示容器运行日志
docker-compose logs

 三、总结

    本章主要是介绍了如何通过 docker 容器,完整的部署一个可实际使用的 .NET Core 的单体应用,相比于之前通过 Linux 部署 .NET Core 应用,可以看到整个步骤少了很多,也简单很多。文中涉及到了一些 docker 的命令,如果你之前并没有接触过 docker 的话,可能需要你进一步的了解。当我们将程序打包成一个镜像之后,你完全可以将镜像上传到私有镜像仓库中,或是直接打包成镜像的压缩文件,这样,当需要切换部署环境时,只需要获取到这个镜像之后即可快速完成部署,相比之前,极大的方便了我们的工作。

ASP.NET 开源导入导出库 Magicodes.IE 导出 Excel 教程

ASP.NET 开源导入导出库 Magicodes.IE 导出 Excel 教程

要点

  • 导出特性
  • 如何导出 Excel 表头
  • 如何导出数据、如何进行数据的切割、如何使用筛选器

导出特性

ExporterAttribute

  • Name: 名称 (当前 Sheet 名称)
  • HeaderFontSize:头部字体大小
  • FontSize:正文字体大小
  • MaxRowNumberOnASheet:Sheet 最大允许的行数,设置了之后将输出多个 Sheet
  • TableStyle:表格样式风格
  • AutoFitAllColumnbool 自适应所有列
  • Author:作者
  • ExporterHeaderFilter:头部筛选器

ExporterHeaderAttribute

  • DisplayName: 显示名称
  • FontSize: 字体大小
  • IsBold: 是否加粗
  • Format: 格式化
  • IsAutoFit: 是否自适应
  • IsIgnore: 是否忽略

主要步骤

1. 安装包 Magicodes.IE.Excel

Install-Package Magicodes.IE.Excel

2. 导出 Excel 表头

  • 通过数组导出
     public async Task ExportHeader()
        {
            IExporter exporter = new ExcelExporter();

            var filePath = "h.xlsx";
            var arr = new[] { "Name1", "Name2", "Name3", "Name4", "Name5", "Name6" };
            var sheetName = "Test";
            var result = await exporter.ExportHeaderAsByteArray(arr, sheetName);
            result.ToExcelExportFileInfo(filePath);

        }
  • 通过 DTO 导出
        public async Task ExportHeader()
        {
            IExporter exporter = new ExcelExporter();

            var filePath = "h.xlsx";
            var result = await exporter.ExportHeaderAsByteArray<Student>( new Student());
            result.ToExcelExportFileInfo(filePath);

        }

3. 导出 Excel

  • 基础导出
      
        public class Student
        {
            /// <summary>
            ///     姓名
            /// </summary>
            public string Name { get; set; }
            /// <summary>
            ///     年龄
            /// </summary>
            public int Age { get; set; }
        }

        public async Task Export()
        {
            IExporter exporter = new ExcelExporter();
            var result = await exporter.Export("a.xlsx", new List<Student>()
                {
                    new Student
                    {
                        Name = "MR.A",
                        Age = 18
                    },
                    new Student
                    {
                        Name = "MR.B",
                        Age = 19
                    },
                    new Student
                    {
                        Name = "MR.B",
                        Age = 20
                    }
                });
        }


通过如上代码我们可以将 Excel 导出,如下图所示

  • 特性导出示例

        public async Task Export()
        {
            IExporter exporter = new ExcelExporter();
            var result = await exporter.Export("test.xlsx", new List<Student>()
                {
                    new Student
                    {
                        Name = "MR.A",
                        Age = 18,
                        Remarks = "我叫MR.A,今年18岁",
                        Birthday=DateTime.Now
                    },
                    new Student
                    {
                        Name = "MR.B",
                        Age = 19,
                        Remarks = "我叫MR.B,今年19岁",
                        Birthday=DateTime.Now
                    },
                    new Student
                    {
                        Name = "MR.C",
                        Age = 20,
                        Remarks = "我叫MR.C,今年20岁",
                        Birthday=DateTime.Now
                    }
                });
        }
        /// <summary>
        ///     学生信息
        /// </summary>
        [ExcelExporter(Name = "学生信息", TableStyle = "Light10", AutoFitAllColumn = true, MaxRowNumberOnASheet = 2))]
        public class Student
        {
            /// <summary>
            ///     姓名
            /// </summary>
            [ExporterHeader(DisplayName = "姓名")]
            public string Name { get; set; }
            /// <summary>
            ///     年龄
            /// </summary>
            [ExporterHeader(DisplayName = "年龄")]
            public int Age { get; set; }
            /// <summary>
            ///     备注
            /// </summary>
            public string Remarks { get; set; }
            /// <summary>
            ///     出生日期
            /// </summary>
            [ExporterHeader(DisplayName = "出生日期", Format = "yyyy-mm-DD")]
            public DateTime Birthday { get; set; }
        }


通过如上代码我们可以将 Excel 导出,如下图所示

  1. ExcelExporter 特性可以设置导出的全局设置,比如表格样式,Sheet 名称,自适应列等等具体参照 导出特性
  2. ExporterHeader 特性我们可以对表头名称、样式等等进行设置 具体参照 导出特性
  3. ExcelExporter MaxRowNumberOnASheet 属性对数据进行拆分,通过该属性指定 Sheet 数据长度从而实现自动切割
  • 表头筛选器
        /// <summary>
        ///     学生信息
        /// </summary>
        [ExcelExporter(Name = "学生信息", TableStyle = "Light10", AutoFitAllColumn = true, MaxRowNumberOnASheet = 2,ExporterHeaderFilter = typeof(ExporterStudentHeaderFilter))]
        public class Student
        {
            /// <summary>
            ///     姓名
            /// </summary>
            [ExporterHeader(DisplayName = "姓名")]
            public string Name { get; set; }
            /// <summary>
            ///     年龄
            /// </summary>
            [ExporterHeader(DisplayName = "年龄")]
            public int Age { get; set; }
            /// <summary>
            ///     备注
            /// </summary>
            public string Remarks { get; set; }
        }

        
        public class ExporterStudentHeaderFilter : IExporterHeaderFilter
        {
            /// <summary>
            /// 表头筛选器(修改名称)
            /// </summary>
            /// <param name="exporterHeaderInfo"></param>
            /// <returns></returns>
            public ExporterHeaderInfo Filter(ExporterHeaderInfo exporterHeaderInfo)
            {
                if (exporterHeaderInfo.DisplayName.Equals("姓名"))
                {
                    exporterHeaderInfo.DisplayName = "name";
                }
                return exporterHeaderInfo;
            }
        }

通过如上代码片段我们实现 IExporterHeaderFilter 接口,IExporterHeaderFilter 以便支持多语言、动态控制列展示等场景

Reference

https://github.com/dotnetcore/Magicodes.IE

原文出处:https://www.cnblogs.com/yyfh/p/12218673.html

今天的关于ASP.NET 开源导入导出库 Magicodes.IE Docker 中使用aspnet导出word的分享已经结束,谢谢您的关注,如果想了解更多关于.NET Core开源导入导出库 Magicodes.IE 2.3发布、.NET 开源导入导出库 Magicodes.IE 2.5发布、ASP.NET Core 实战:使用 Docker 容器化部署 ASP.NET Core + MySQL + Nginx、ASP.NET 开源导入导出库 Magicodes.IE 导出 Excel 教程的相关知识,请在本站进行查询。

本文标签: