• MiniWord .NET Word模板引擎,藉由Word模板和数据简单、快速生成文件。


    Github / Gitee

    QQ群(1群) : 813100564 / QQ群(2群) : 579033769

    视频教学


    介绍

    MiniWord .NET Word模板引擎,藉由Word模板和数据简单、快速生成文件。

    image

    Getting Started

    安装

    快速入门

    模板遵循“所见即所得”的设计,模板和标签的样式会被完全保留

    var value = new Dictionary<string, object>(){["title"] = "Hello MiniWord"};
    MiniSoftware.MiniWord.SaveAsByTemplate(outputPath, templatePath, value);
    

    image

    输入、输出

    • 输入系统支持模版路径或是Byte[]
    • 输出支持文件路径、Byte[]、Stream
    SaveAsByTemplate(string path, string templatePath, Dictionary<string, object> value)
    SaveAsByTemplate(string path, byte[] templateBytes, Dictionary<string, object> value)
    SaveAsByTemplate(this Stream stream, string templatePath, Dictionary<string, object> value)
    SaveAsByTemplate(this Stream stream, byte[] templateBytes, Dictionary<string, object> value)
    

    标签

    MiniWord 使用类似 Vue, React 的模版字串 {{tag}},只需要确保 tag 与 value 参数的 key 一样(大小写敏感),系统会自动替换字串。

    文本

    {{tag}}
    
    代码例子
    var value = new Dictionary<string, object>()
    {
        ["Name"] = "Jack",
        ["Department"] = "IT Department",
        ["Purpose"] = "Shanghai site needs a new system to control HR system.",
        ["StartDate"] = DateTime.Parse("2022-09-07 08:30:00"),
        ["EndDate"] = DateTime.Parse("2022-09-15 15:30:00"),
        ["Approved"] = true,
        ["Total_Amount"] = 123456,
    };
    MiniWord.SaveAsByTemplate(path, templatePath, value);
    
    模版

    image

    导出

    image

    图片

    标签值为 MiniWordPicture 类别

    代码例子
    var value = new Dictionary<string, object>()
    {
        ["Logo"] = new MiniWordPicture() { Path= PathHelper.GetFile("DemoLogo.png"), Width= 180, Height= 180 }
    };
    MiniWord.SaveAsByTemplate(path, templatePath, value);
    
    模版

    image

    导出

    image

    列表

    标签值为 string[] 或是 IList类别

    代码例子
    var value = new Dictionary<string, object>()
    {
        ["managers"] = new[] { "Jack" ,"Alan"},
        ["employees"] = new[] { "Mike" ,"Henry"},
    };
    MiniWord.SaveAsByTemplate(path, templatePath, value);
    
    模版

    image

    导出

    image

    表格

    标签值为 IEmerable>类别

    代码例子
    var value = new Dictionary<string, object>()
    {
        ["TripHs"] = new Liststring, object>>
        {
            new Dictionary<string, object>
            {
                { "sDate",DateTime.Parse("2022-09-08 08:30:00")},
                { "eDate",DateTime.Parse("2022-09-08 15:00:00")},
                { "How","Discussion requirement part1"},
                { "Photo",new MiniWordPicture() { Path = PathHelper.GetFile("DemoExpenseMeeting02.png"), Width = 160, Height = 90 }},
            },
            new Dictionary<string, object>
            {
                { "sDate",DateTime.Parse("2022-09-09 08:30:00")},
                { "eDate",DateTime.Parse("2022-09-09 17:00:00")},
                { "How","Discussion requirement part2 and development"},
                { "Photo",new MiniWordPicture() { Path = PathHelper.GetFile("DemoExpenseMeeting01.png"), Width = 160, Height = 90 }},
            },
        }
    };
    MiniWord.SaveAsByTemplate(path, templatePath, value);
    
    模版

    image

    导出

    image

    其他

    POCO or dynamic 参数

    v0.5.0 支持 POCO 或 dynamic parameter

    var value = new { title = "Hello MiniWord" };
    MiniWord.SaveAsByTemplate(outputPath, templatePath, value);
    

    字体FontColor和HighlightColor

    var value = new
    {
        Company_Name = new MiniWordColorText { Text = "MiniSofteware", FontColor = "#eb70AB" },
        Name = new MiniWordColorText { Text = "Jack", HighlightColor = "#eb70AB" },
        CreateDate = new MiniWordColorText { Text = new DateTime(2021, 01, 01).ToString(), HighlightColor = "#eb70AB", FontColor = "#ffffff" },
        VIP = true,
        Points = 123,
        APP = "Demo APP",
    };
    

    我们可以尝试使用 MiniWodrHyperLink 类,用模板测试替换为超链接。

    MiniWordHyperLink 提供了两个主要参数。

    • Url: HyperLink URI 目标路径
    • 文字:超链接文字
    var value = new 
    {
        ["Name"] = new MiniWordHyperLink(){
            Url = "https://google.com",
            Text = "測試連結!!"
        },
        ["Company_Name"] = "MiniSofteware",
        ["CreateDate"] = new DateTime(2021, 01, 01),
        ["VIP"] = true,
        ["Points"] = 123,
        ["APP"] = "Demo APP",
    };
    MiniWord.SaveAsByTemplate(path, templatePath, value);
    

    例子

    ASP.NET Core 3.1 API Export

    using Microsoft.AspNetCore.Builder;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Hosting;
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Net;
    using MiniSoftware;
    
    public class Program
    {
        public static void Main(string[] args) => CreateHostBuilder(args).Build().Run();
    
        public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder => webBuilder.UseStartup());
    }
    
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services) => services.AddMvc();
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            app.UseStaticFiles();
            app.UseRouting();
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=api}/{action=Index}/{id?}");
            });
        }
    }
    
    public class ApiController : Controller
    {
        public IActionResult Index()
        {
            return new ContentResult
            {
                ContentType = "text/html",
                StatusCode = (int)HttpStatusCode.OK,
                Content = @"
    DownloadWordFromTemplatePath
    DownloadWordFromTemplateBytes
    "
    }; } static Dictionary<string, object> defaultValue = new Dictionary<string, object>() { ["title"] = "FooCompany", ["managers"] = new Liststring, object>> { new Dictionary<string, object>{{"name","Jack"},{ "department", "HR" } }, new Dictionary<string, object> {{ "name", "Loan"},{ "department", "IT" } } }, ["employees"] = new Liststring, object>> { new Dictionary<string, object>{{ "name", "Wade" },{ "department", "HR" } }, new Dictionary<string, object> {{ "name", "Felix" },{ "department", "HR" } }, new Dictionary<string, object>{{ "name", "Eric" },{ "department", "IT" } }, new Dictionary<string, object> {{ "name", "Keaton" },{ "department", "IT" } } } }; public IActionResult DownloadWordFromTemplatePath() { string templatePath = "TestTemplateComplex.docx"; Dictionary<string, object> value = defaultValue; MemoryStream memoryStream = new MemoryStream(); MiniWord.SaveAsByTemplate(memoryStream, templatePath, value); memoryStream.Seek(0, SeekOrigin.Begin); return new FileStreamResult(memoryStream, "application/vnd.openxmlformats-officedocument.wordprocessingml.document") { FileDownloadName = "demo.docx" }; } private static Dictionary<string, Byte[]> TemplateBytesCache = new Dictionary<string, byte[]>(); static ApiController() { string templatePath = "TestTemplateComplex.docx"; byte[] bytes = System.IO.File.ReadAllBytes(templatePath); TemplateBytesCache.Add(templatePath, bytes); } public IActionResult DownloadWordFromTemplateBytes() { byte[] bytes = TemplateBytesCache["TestTemplateComplex.docx"]; Dictionary<string, object> value = defaultValue; MemoryStream memoryStream = new MemoryStream(); MiniWord.SaveAsByTemplate(memoryStream, bytes, value); memoryStream.Seek(0, SeekOrigin.Begin); return new FileStreamResult(memoryStream, "application/vnd.openxmlformats-officedocument.wordprocessingml.document") { FileDownloadName = "demo.docx" }; } }

    常见问题

    模版字串没有生效

    建议 {{tag}} 复制重新整串复制贴上,有时打字 word 在底层 {{}}会被切开变成{{Tag}} 如图片

    image

  • 相关阅读:
    235. 二叉搜索树的最近公共祖先
    Day 14:2938. 区分黑球和白球
    记一次线上偶发慢查排查过程_es资源初始化耗时
    Python趣味操作推荐
    浏览器发送请求的方法
    Halcon (3):窗体常用语法使用
    ​力扣解法汇总791. 自定义字符串排序
    ClickHouse各种MergeTree的关系与作用
    不支持TLS的设备如何实现游客登录加密通信方案
    攻防世界WEB练习-favorite_number
  • 原文地址:https://www.cnblogs.com/ITWeiHan/p/16728541.html