关于生成PDF和Excel文件的最简单方法

导出Excel需要导入EPPlus包

导入命名空间

using OfficeOpenXml;

示例代码如下

/// <summary>
/// 请求接口直接下载Excel
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<IActionResult> GetExcel()
{
    string fileName = $"{Guid.NewGuid()}.xlsx";
    var stream = new MemoryStream();
    ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
    using (ExcelPackage package = new ExcelPackage(stream))
    {
        // 添加worksheet
        ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("DeliveryReceiptSignLog");
        //添加头
        //worksheet.Cells.Style.ShrinkToFit = true;//单元格自动适应大小
        worksheet.Cells[1, 1].Value = "跟踪码";
        worksheet.Cells[1, 2].Value = "收款金额";
        worksheet.Cells[1, 3].Value = "收款方式";
        worksheet.Cells[1, 4].Value = "POS流水号";
        worksheet.Cells[1, 5].Value = "终端号";
        worksheet.Column(1).Width = 25;
        worksheet.Column(2).Width = 25;
        worksheet.Column(3).Width = 25;
        worksheet.Column(4).Width = 25;
        worksheet.Column(5).Width = 25;
        worksheet.Column(2).Style.Numberformat.Format = "¥#,##0.00";//金额格式
        //从第二行第三列到第一万行第三列,三列被设置为下拉框
        var unitmeasure = worksheet.DataValidations.AddListValidation(worksheet.Cells[2, 3, 10000, 3].Address);
        unitmeasure.Formula.Values.Add("现金");
        unitmeasure.Formula.Values.Add("刷卡");
        int rowCount = 1;//行
        int cellCount = 0;//列
        //添加数据(循环可改为数据集)
        for (int i = 1; i <= 20; i++)
        {
            rowCount++;
            worksheet.Cells[rowCount, ++cellCount].Value = i;
            worksheet.Cells[rowCount, ++cellCount].Value = i;
            worksheet.Cells[rowCount, ++cellCount].Value = unitmeasure.Formula.Values[1];
            worksheet.Cells[rowCount, ++cellCount].Value = i;
            worksheet.Cells[rowCount, ++cellCount].Value = i;
            cellCount = 0;//重置
        }
        worksheet.Protection.IsProtected = true;//设置是否进行锁定
        worksheet.Protection.SetPassword("123456");//设置密码
        worksheet.Protection.AllowAutoFilter = false;//下面是一些锁定时权限的设置
        worksheet.Protection.AllowDeleteColumns = false;
        worksheet.Protection.AllowDeleteRows = false;
        worksheet.Protection.AllowEditScenarios = false;
        worksheet.Protection.AllowEditObject = false;
        worksheet.Protection.AllowFormatCells = false;
        worksheet.Protection.AllowFormatColumns = false;
        worksheet.Protection.AllowFormatRows = false;
        worksheet.Protection.AllowInsertColumns = false;
        worksheet.Protection.AllowInsertHyperlinks = false;
        worksheet.Protection.AllowInsertRows = false;
        worksheet.Protection.AllowPivotTables = false;
        worksheet.Protection.AllowSelectLockedCells = false;
        worksheet.Protection.AllowSelectUnlockedCells = false;
        worksheet.Protection.AllowSort = false;
        package.Save();
    }
    stream.Position = 0;
    return await Task.FromResult(File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", fileName));
}

.NET Core导出PDF需要导入iTextSharp.LGPLv2.Core

导入命名空间

using iTextSharp.text;
using iTextSharp.text.pdf;

Controller代码如下

/// <summary>
/// 直接获取文件(PDF)
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<IActionResult> GetPDF()
{
    string fileName = $"{Guid.NewGuid()}.pdf";
    DataEntity data = new DataEntity();
    data.TaskName = "SHXH0514huangjinjin05142020/09/14-3";
    data.SiteName = "浦东配送站";
    var users = new List<User>()
    {
        new User
        {
            Id=1,
            OrderNo="200911SHDF01634290",
            Route="SHXH10b",
            FromToTime="2020-09-13 13:33:00 14:33:00",
            Address="上海 上海市 黄浦区南京东路街道9999999999999",
            Remark="(生日快乐)",
            Count=1,
            Amount=0.01M
        },
        new User
        {
            Id=2,
            OrderNo="210831SHKF01938125",
            Route="SHCN#2a",
            FromToTime="2021-09-03 10:00:00 10:30:00",
            Address="上海 上海市 徐汇区田林路140号",
            Remark="",
            Count=1,
            Amount=0.00M+6
        }
    };

    data.users = users;
    byte[] file = PDFHelper.GetPDF(data);
    if (file.Length>0)
    {
        var stream = new MemoryStream(file);
        return await Task.FromResult(File(stream, "application/pdf", fileName));
    }
    return null;
}

PDFHelper.GetPDF代码全篇

需导入命名空间

using iTextSharp.text;
using iTextSharp.text.pdf;

调用

// data为DataEntity类型,底部有结构类
byte[] file = PDFHelper.GetPDF(data);

// 重载后的方法调用
List<string> columns = new List<string>
{
    "序号",
    "跟踪代码",
    "线路",
    "配送时间",
    "地址",
    "备注",
    "商品数",
    "应收金额"
};
byte[] file = PDFHelper.GetPDF(data, columns);
public static class PDFHelper
{
    /// <summary>
    /// 返回字节
    /// </summary>
    /// <param name="data"></param>
    /// <returns></returns>
    public static byte[] GetPDF(DataEntity data)
    {
        //生成pdf
        Document document = new Document();
        //var fileStream = new MemoryStream();
        string fileName = "测试.pdf";
        var fileStream = File.Create(fileName);//C:\\Users\\Tianci\\Desktop\\PDF\\
        PdfWriter pw = PdfWriter.GetInstance(document, fileStream);
        document.Open();
        //指定字体文件,IDENTITY_H:支持中文
        string fontpath = @"C:\Windows\Fonts\SIMHEI.TTF";
        BaseFont customfont = BaseFont.CreateFont(fontpath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
        //设置字体颜色样式
        var baseFont = new Font(customfont)
        {
            //System.Drawing.Color.Black
            Color = new BaseColor(0,0,0),  //设置字体颜色
            Size = 8  //字体大小
        };

        #region 头部
        //定义table行列数据
        //PdfPTable tableRow_1 = new PdfPTable(1);  //生成只有一列的行数据
        //tableRow_1.DefaultCell.Border = Rectangle.NO_BORDER;  //无边框
        //tableRow_1.WidthPercentage = 100;
        //tableRow_1.DefaultCell.MinimumHeight = 80f; //高度
        //float[] headWidths_1 = new float[] { 3000f }; //宽度
        //tableRow_1.SetWidths(headWidths_1);


        //定义字体样式
        var headerStyle = new Font(customfont)
        {
            Color = new BaseColor(0,0,0),//System.Drawing.Color.Black
            Size = 18,
        };
        //var Row_1_Cell_1 = new PdfPCell(new Paragraph("配送任务单", headerStyle));
        //Row_1_Cell_1.HorizontalAlignment = Element.ALIGN_CENTER;//居中
        //tableRow_1.AddCell(Row_1_Cell_1);


        var head = new Paragraph("配送任务单", headerStyle);
        head.IndentationLeft = 200f;

        var headerStyle2 = new Font(customfont)
        {
            Color = new BaseColor(0,0,0),//System.Drawing.Color.Black
            Size = 10,
        };
        var para = new Paragraph(string.Format("任务名称:{0}            站点:{1}", data.TaskName, data.SiteName), headerStyle2);

        para.IndentationLeft = -30f;

        var placeholder = new Paragraph("   ", headerStyle2);//上方文字与表格相隔间距

        PdfPTable tableRow_2 = new PdfPTable(8);
        tableRow_2.TotalWidth = 580f;
        tableRow_2.LockedWidth = true;
        tableRow_2.DefaultCell.Border = Rectangle.NO_BORDER;
        tableRow_2.WidthPercentage = 100;
        tableRow_2.DefaultCell.MinimumHeight = 80f;
        //float[] headWidths_2 = new float[] { 100f, 300f, 120f, 300f, 540f, 300f, 100f, 200f };
        float[] headWidths_2 = new float[] { 50f, 120f, 60f, 150f, 220f, 140f, 50f, 70f };//搭配TotalWidth和LockedWidth使用

        tableRow_2.SetWidths(headWidths_2);

        var Row_2_Cell_1 = new PdfPCell(new Paragraph("序号", baseFont));
        Row_2_Cell_1.HorizontalAlignment = Element.ALIGN_CENTER;//文字居中
        Row_2_Cell_1.BackgroundColor = BaseColor.LightGray;
        tableRow_2.AddCell(Row_2_Cell_1);

        var Row_2_Cell_2 = new PdfPCell(new Paragraph("跟踪代码", baseFont));
        Row_2_Cell_2.HorizontalAlignment = Element.ALIGN_CENTER;
        Row_2_Cell_2.BackgroundColor = BaseColor.LightGray;
        tableRow_2.AddCell(Row_2_Cell_2);

        var Row_2_Cell_3 = new PdfPCell(new Paragraph("线路", baseFont));
        Row_2_Cell_3.HorizontalAlignment = Element.ALIGN_CENTER;
        Row_2_Cell_3.BackgroundColor = BaseColor.LightGray;
        tableRow_2.AddCell(Row_2_Cell_3);

        var Row_2_Cell_4 = new PdfPCell(new Paragraph("配送时间", baseFont));
        Row_2_Cell_4.HorizontalAlignment = Element.ALIGN_CENTER;
        Row_2_Cell_4.BackgroundColor = BaseColor.LightGray;
        tableRow_2.AddCell(Row_2_Cell_4);

        var Row_2_Cell_5 = new PdfPCell(new Paragraph("地址", baseFont));
        Row_2_Cell_5.HorizontalAlignment = Element.ALIGN_CENTER;
        Row_2_Cell_5.BackgroundColor = BaseColor.LightGray;
        tableRow_2.AddCell(Row_2_Cell_5);

        var Row_2_Cell_6 = new PdfPCell(new Paragraph("备注", baseFont));
        Row_2_Cell_6.HorizontalAlignment = Element.ALIGN_CENTER;
        Row_2_Cell_6.BackgroundColor = BaseColor.LightGray;
        tableRow_2.AddCell(Row_2_Cell_6);

        var Row_2_Cell_7 = new PdfPCell(new Paragraph("商品数", baseFont));
        Row_2_Cell_7.HorizontalAlignment = Element.ALIGN_CENTER;
        Row_2_Cell_7.BackgroundColor = BaseColor.LightGray;
        tableRow_2.AddCell(Row_2_Cell_7);

        var Row_2_Cell_8 = new PdfPCell(new Paragraph("应收金额", baseFont));
        Row_2_Cell_8.HorizontalAlignment = Element.ALIGN_CENTER;
        Row_2_Cell_8.BackgroundColor = BaseColor.LightGray;
        tableRow_2.AddCell(Row_2_Cell_8);

        document.Add(head);
        document.Add(placeholder);
        document.Add(para);
        document.Add(placeholder);
        //document.Add(tableRow_1);
        document.Add(tableRow_2);
        #endregion

        #region 填充List数据


        Type t = new User().GetType();//获得该类的Type

        for (int i = 0; i < data.users.Count; i++)
        {
            PdfPTable tableRow_3 = new PdfPTable(8);
            tableRow_3.TotalWidth = 580f;
            tableRow_3.LockedWidth = true;
            tableRow_3.DefaultCell.Border = Rectangle.NO_BORDER;
            tableRow_3.WidthPercentage = 100;
            tableRow_3.DefaultCell.MinimumHeight = 80f;
            //float[] headWidths_3 = new float[] { 100f, 300f, 120f, 300f, 540f, 300f, 100f, 200f };
            float[] headWidths_3 = new float[] { 50f, 120f, 60f, 150f, 220f, 140f, 50f, 70f };
            tableRow_3.SetWidths(headWidths_3);
            foreach (PropertyInfo pi in t.GetProperties())//遍历属性值
            {
                var value = pi.GetValue(data.users[i]).ToString();
                var txt = new Paragraph(value, baseFont);
                var cell = new PdfPCell(txt);
                tableRow_3.AddCell(cell);
            }
            document.Add(tableRow_3);
        }

        #endregion

        //页脚
        PDFFooter footer = new PDFFooter();
        footer.OnEndPage(pw, document);
        document.Close();
        fileStream.Close();
        fileStream.Dispose();
        return GetFileStream(fileName);
    }

    /// <summary>
    /// 带列名可简化列
    /// </summary>
    /// <param name="data"></param>
    /// <param name="columns"></param>
    /// <returns></returns>
    public static byte[] GetPDF(DataEntity data, List<string> columns)
    {
        // 生成pdf
        Document document = new Document();
        string fileName = "测试.pdf";
        var fileStream = File.Create(fileName);
        PdfWriter pw = PdfWriter.GetInstance(document, fileStream);
        document.Open();
        // 指定字体文件,IDENTITY_H:支持中文
        string fontpath = @"C:\Windows\Fonts\SIMHEI.TTF";
        BaseFont customfont = BaseFont.CreateFont(fontpath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
        // 设置字体颜色样式
        var baseFont = new Font(customfont)
        {
            // System.Drawing.Color.Black
            Color = new BaseColor(0, 0, 0),  // 字体颜色
            Size = 8  // 字体大小
        };

        #region 头部

        // 定义字体样式
        var headerStyle = new Font(customfont)
        {
            Color = new BaseColor(0, 0, 0),
            Size = 18,
        };

        var head = new Paragraph("配送任务单", headerStyle);
        head.IndentationLeft = 200f;

        var headerStyle2 = new Font(customfont)
        {
            Color = new BaseColor(0, 0, 0),
            Size = 10,
        };
        var para = new Paragraph(string.Format("任务名称:{0}            站点:{1}", data.TaskName, data.SiteName), headerStyle2);

        para.IndentationLeft = -30f;

        var placeholder = new Paragraph("   ", headerStyle2);// 上方文字与表格相隔间距

        PdfPTable tableRow_2 = new PdfPTable(8);
        tableRow_2.TotalWidth = 580f;
        tableRow_2.LockedWidth = true;
        tableRow_2.DefaultCell.Border = Rectangle.NO_BORDER;
        tableRow_2.WidthPercentage = 100;
        tableRow_2.DefaultCell.MinimumHeight = 80f;
        float[] headWidths_2 = new float[] { 50f, 120f, 60f, 150f, 220f, 140f, 50f, 70f };// 搭配TotalWidth和LockedWidth使用

        tableRow_2.SetWidths(headWidths_2);

        for (int i = 0; i < columns.Count; i++)
        {
            var Row_2_Cell_i = new PdfPCell(new Paragraph(columns[i], baseFont));
            Row_2_Cell_i.HorizontalAlignment = Element.ALIGN_CENTER;// 文字居中
            Row_2_Cell_i.BackgroundColor = BaseColor.LightGray;
            tableRow_2.AddCell(Row_2_Cell_i);
        }

        document.Add(head);
        document.Add(placeholder);
        document.Add(para);
        document.Add(placeholder);
        //document.Add(tableRow_1);
        document.Add(tableRow_2);
        #endregion

        #region 填充List数据


        Type t = new User().GetType();// 获得该类的Type

        for (int i = 0; i < data.users.Count; i++)
        {
            PdfPTable tableRow_3 = new PdfPTable(8);
            tableRow_3.TotalWidth = 580f;
            tableRow_3.LockedWidth = true;
            tableRow_3.DefaultCell.Border = Rectangle.NO_BORDER;
            tableRow_3.WidthPercentage = 100;
            tableRow_3.DefaultCell.MinimumHeight = 80f;
            //float[] headWidths_3 = new float[] { 100f, 300f, 120f, 300f, 540f, 300f, 100f, 200f };
            float[] headWidths_3 = new float[] { 50f, 120f, 60f, 150f, 220f, 140f, 50f, 70f };
            tableRow_3.SetWidths(headWidths_3);
            foreach (PropertyInfo pi in t.GetProperties())// 遍历属性值
            {
                var value = pi.GetValue(data.users[i]).ToString();
                var txt = new Paragraph(value, baseFont);
                var cell = new PdfPCell(txt);
                tableRow_3.AddCell(cell);
            }
            document.Add(tableRow_3);
        }

        #endregion

        // 页脚
        PDFFooter footer = new PDFFooter();
        footer.OnEndPage(pw, document);
        document.Close();
        fileStream.Close();
        fileStream.Dispose();
        return GetFileStream(fileName);
    }

    /// <summary>
    /// 文件转成字节
    /// 并删除文件
    /// 返回字节
    /// </summary>
    /// <param name="filePath"></param>
    /// <returns></returns>
    public static byte[] GetFileStream(string filePath)
    {
        var byteBuffer = File.ReadAllBytes(filePath);
        if (byteBuffer.Length > 0)
        {
            if (File.Exists(filePath))
            {
                File.Delete(filePath);
            }
            return byteBuffer;
        }
        return null;
    }
    public class PDFFooter : PdfPageEventHelper
    {
        // write on top of document
        public override void OnOpenDocument(PdfWriter writer, Document document)
        {
            base.OnOpenDocument(writer, document);
            PdfPTable tabFot = new PdfPTable(new float[] { 1F });
            tabFot.SpacingAfter = 10F;
            PdfPCell cell;
            //tabFot.TotalWidth = 300F;
            cell = new PdfPCell(new Phrase("Header"));
            tabFot.AddCell(cell);
            tabFot.WriteSelectedRows(0, -1, 150, document.Top, writer.DirectContent);
        }

        // write on start of each page
        public override void OnStartPage(PdfWriter writer, Document document)
        {
            base.OnStartPage(writer, document);
        }

        // write on end of each page
        public override void OnEndPage(PdfWriter writer, Document document)
        {
            base.OnEndPage(writer, document);

            var footFont = FontFactory.GetFont("Lato", 12 * 0.667f, new BaseColor(60, 60, 60));//*
        }

        //write on close of document
        public override void OnCloseDocument(PdfWriter writer, Document document)
        {
            base.OnCloseDocument(writer, document);
        }
    }
}

public class User
{
    public int Id { get; set; }

    public string OrderNo { get; set; }

    public string Route { get; set; }

    public string FromToTime { get; set; }

    public string Address { get; set; }

    public string Remark { get; set; }

    public int Count { get; set; }

    public decimal Amount { get; set; }
}

public class DataEntity
{
    public string TaskName { get; set; }

    public string SiteName { get; set; }

    public List<User> users = new List<User>();
}

散会!!!


被这风吹散的人说Ta爱的不深,被这雨淋湿的人说Ta不会冷