实现列表数据导出PDF功能

安装Nuget包

QuestPDF

核心代码

public static string ExportPdf(List<LogLoginListDto> list)
{
    TextStyle titleStyle = TextStyle.Default.FontSize(36).SemiBold().FontColor(Colors.Blue.Medium);
    string fileName = string.Concat("LogLogin-", DateTime.Now.ToString("yyyyMMddHHmmss") + ".pdf");

    var tempath = Path.Combine(App.DirectoryConfig.PdfExportPath, "LogLogin", DateTime.Now.ToString("yyyy"), DateTime.Now.ToString("MM"), DateTime.Now.ToString("dd"));
    
    var folderPath = Path.Combine(App.WebHostEnvironment.WebRootPath, tempath);
    if (!Directory.Exists(folderPath))
    {
        Directory.CreateDirectory(folderPath);
    }

    string path_file = Path.Combine(folderPath, fileName);
    string logo_path = Path.Combine(App.WebHostEnvironment.WebRootPath, "logo.jpg");

    //整合对象
    Document.Create(container =>
    {
        container.Page(page =>
        {
            page.Size(PageSizes.A4);
            page.Margin(2, Unit.Centimetre);
            //字体默认大小20号字体
            page.DefaultTextStyle(x => x.FontSize(20));

            //页眉部分
            page.Header()
                  .Row(row =>
                  {
                      row.RelativeItem().Column(column =>
                      {
                          column.Item().AlignCenter().Text("登录日志信息").FontFamily("simhei").Style(TextStyle.Default.FontSize(22).FontColor(Colors.Blue.Medium));
                          column.Item().AlignLeft().AlignBottom().Height(50).Width(50).Image(logo_path);
                          column.Item().AlignRight().AlignTop().Text("编号:______________").FontFamily("simhei").Style(TextStyle.Default.FontSize(12));
                      });
                  });
            //内容部分
            page.Content()
                .PaddingVertical(1, Unit.Centimetre)
                .Column(x =>
                {
                    //表格
                    x.Item().Table(table =>
                    {
                        //设置表头的列参数占比
                        table.ColumnsDefinition(columns =>
                        {
                            columns.ConstantColumn(60);
                            columns.RelativeColumn();
                            columns.RelativeColumn();
                            columns.RelativeColumn();
                            columns.RelativeColumn();
                            columns.RelativeColumn();
                            columns.RelativeColumn();
                            columns.RelativeColumn();
                            columns.RelativeColumn(2);
                        });

                        // 表头
                        table.Header(header =>
                        {
                            header.Cell().AlignCenter().Text("编号").FontFamily("simhei").Style(TextStyle.Default.FontSize(12));
                            header.Cell().AlignCenter().Text("用户名称").FontFamily("simhei").Style(TextStyle.Default.FontSize(12));
                            header.Cell().AlignCenter().Text("IP").FontFamily("simhei").Style(TextStyle.Default.FontSize(12));
                            header.Cell().AlignCenter().Text("登录地点").FontFamily("simhei").Style(TextStyle.Default.FontSize(12));
                            header.Cell().AlignCenter().Text("浏览器").FontFamily("simhei").Style(TextStyle.Default.FontSize(12));
                            header.Cell().AlignCenter().Text("操作系统").FontFamily("simhei").Style(TextStyle.Default.FontSize(12));
                            header.Cell().AlignCenter().Text("操作状态").FontFamily("simhei").Style(TextStyle.Default.FontSize(12));
                            header.Cell().AlignCenter().Text("操作信息").FontFamily("simhei").Style(TextStyle.Default.FontSize(12));
                            header.Cell().AlignCenter().Text("登录时间").FontFamily("simhei").Style(TextStyle.Default.FontSize(12));
                            header.Cell().ColumnSpan(9).PaddingVertical(4).BorderBottom(1).BorderColor(Colors.Black);
                        });


                        for (int i = 0; i < list.Count; i++)
                        {
                            table.Cell().Element(CellStyle).AlignCenter().Text(list[i].ID.ToString()).FontFamily("simsun").Style(TextStyle.Default.FontSize(10));
                            table.Cell().Element(CellStyle).AlignCenter().Text(list[i].UserName).FontFamily("simsun").Style(TextStyle.Default.FontSize(10));
                            table.Cell().Element(CellStyle).AlignCenter().Text(list[i].Ipaddr).FontFamily("simsun").Style(TextStyle.Default.FontSize(10));
                            table.Cell().Element(CellStyle).AlignCenter().Text(list[i].LoginLocation).FontFamily("simsun").Style(TextStyle.Default.FontSize(10));
                            table.Cell().Element(CellStyle).AlignCenter().Text(list[i].Browser).FontFamily("simsun").Style(TextStyle.Default.FontSize(10));
                            table.Cell().Element(CellStyle).AlignCenter().Text(list[i].Os).FontFamily("simsun").Style(TextStyle.Default.FontSize(10));
                            table.Cell().Element(CellStyle).AlignCenter().Text(list[i].Status == "1" ? "失败" : "成功").FontFamily("simsun").Style(TextStyle.Default.FontSize(10));
                            table.Cell().Element(CellStyle).AlignCenter().Text(list[i].Msg).FontFamily("simsun").Style(TextStyle.Default.FontSize(10));
                            table.Cell().Element(CellStyle).AlignCenter().Text(list[i].LoginTime.ToString("yyyy-MM-dd HH:mm:ss")).FontFamily("simsun").Style(TextStyle.Default.FontSize(10));
                        }
                        static IContainer CellStyle(IContainer container)
                        {
                            return container.BorderBottom(1).PaddingVertical(4);
                        }

                    });
                });

            //页脚部分
            page.Footer()
                .AlignCenter()
                .Text(x =>
                {
                    x.Span("第").FontFamily("simsun").FontSize(12);
                    x.CurrentPageNumber().FontSize(12);
                    x.Span("页").FontFamily("simsun").FontSize(12);
                });
        });
    }).GeneratePdf(path_file);


    string filePath ="http://" + App.HttpContext.Request.Host + "/" + tempath.Replace("\\", "/") + "/" + fileName;

    return filePath;
}

界面效果

Bug

多页的时候,前一页的数据行若某一列数据展示不下时,会出现下一页的第一条数据和上一页最后一条数据相同的情况,除特殊列数据分开展示以外,其余列数据相同。

posted @ 2024-12-06 15:57  相遇就是有缘  阅读(62)  评论(0)    收藏  举报