基于NPOI 将数据填充到Word模板,包含图片的插入

Nuget安装依赖库 NPOI (版本2.6.2)

效果图

image.png


image.png

核心代码

/// <summary>
/// 修改字符串
/// </summary>
/// <param name="doc"></param>
/// <param name="data">key:占位符,value:替换占位符的字符吕</param>
public void UpStr(XWPFDocument doc, Dictionary<string, string> data)
{
    if (doc == null || data == null || data.Count < 1)
    {
        return;
    }
    foreach (XWPFTable table in doc.Tables)//遍历所有表格数据
    {
        foreach (XWPFTableRow row in table.Rows)
        {
            foreach (XWPFTableCell cell in row.GetTableICells())
            {

                foreach (var para in cell.Paragraphs)
                {
                    string oldText = para.ParagraphText;
                    foreach (KeyValuePair<string, string> kv in data)
                    {
                        if (oldText.Contains(kv.Key))
                        {
                            para.ReplaceText(kv.Key, kv.Value);
                        }
                    }
                }
            }
        }
    }

    foreach (var para in doc.Paragraphs)//遍历所有表格以外的数据
    {
        string oldText = para.ParagraphText;
        foreach (KeyValuePair<string, string> kv in data)
        {
            if (oldText.Contains(kv.Key))
            {
                para.ReplaceText(kv.Key, kv.Value);
            }
        }
    }
}

/// <summary>
/// 在指定位置 插入图片
/// </summary>
/// <param name="doc"></param>
/// <param name="data">key:占位符,value:替换占位符的字符串</param>
/// <param name="fs">图片的文件流</param>
/// <param name="placeholder">图片的占位符</param>
/// <param name="width">图片显示的宽度</param>
/// <param name="height">图片显示的高度</param>
public void UpImage(XWPFDocument doc, FileStream fs, string placeholder, int width, int height)
{
    if (doc == null || fs == null || fs.Length < 1)
    {
        return;
    }
    foreach (XWPFTable table in doc.Tables)//遍历所有表格数据
    {
        foreach (XWPFTableRow row in table.Rows)
        {
            foreach (XWPFTableCell cell in row.GetTableICells())
            {
                foreach (var para in cell.Paragraphs)
                {
                    if (para.ParagraphText.Contains(placeholder))
                    {
                        para.Runs[0].AddPicture(fs, 5, "imageName", width, height);
                        para.ReplaceText(placeholder, "");
                    }
                }
            }
        }
    }

    foreach (var para in doc.Paragraphs)//遍历所有表格以外的数据
    {
        if (para.ParagraphText.Contains(placeholder))
        {
            para.Runs[0].AddPicture(fs, 5, "imageName", width, height);
            para.ReplaceText(placeholder, "");
        }
    }
    fs.Dispose();
}

方法调用

// 获取图片
string imagePath = @"F:\image.png";
// 读取图片
FileStream fs = new FileStream(imagePath, FileMode.Open, FileAccess.Read);

var template = @"F:\model.docx";
var outPath = @"F:\outPath.docx";
using (FileStream stream = new FileStream(template, FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
    XWPFDocument doc = new XWPFDocument(stream);
    Dictionary<string, string> data = new Dictionary<string, string>
    {
        {"$[lqwvje]$","罗分明" }
    };
    UpStr(doc, data);
    UpImage(doc, fs, "$[image]$", 160 * 9525, 100 * 9525);

    using (FileStream stream2 = new FileStream(outPath, FileMode.OpenOrCreate, FileAccess.ReadWrite))
    {
        doc.Write(stream2);
    }
    doc.Dispose();
}

本文来自 www.luofenming.com