Spire.Doc Word文档模板数据替换

目录

项目背景介绍

关于Spire.Doc

功能实现

模板文字替换方法

 文档插入附件

指定位置插入电子签名、电子公章等

创建复选框

去除word空白节

table 表格动态添加行并填充数据

模板归档生成效果示例


项目背景介绍

最近做了一个关于医疗机构证件审核的小型OA项目,项目中需要实现对医疗机构相关资料的文件归档功能,包含相关的文字信息、图片信息、表格信息以及pdf附件等文件的处理

关于Spire.Doc

详情参见 Spire.Doc

也可参见文档 .NET office开发组件_蓝晶之心的博客-CSDN博客查看简单介绍 

功能实现

Nuget中安装 FreeSpire.Doc、FreeSpire.PDF、iTextSharp.LGPLv2.Core

创建Spire.Doc 帮助类SpireDocHelper.cs

模板文字替换方法

        /// <summary>
        /// word 模板替换
        /// </summary>
        /// <typeparam name="T"></typeparam> 
        /// <param name="etity"></param>
        /// <param name="doc"></param>
        private static void ReplaceKey<T>(T etity, Spire.Doc.Document doc)
        {
            Type entityType = typeof(T);
            PropertyInfo[] properties = entityType.GetProperties();
            string entityName = entityType.Name;//实体类名称
            foreach (var p in properties)
            {
                string propteryName = "{$" + p.Name + "}";//Word模板中设定的需要替换的标签
                object value = p.GetValue(etity);
                if (value == null)
                {
                    value = "";
                }
                doc.Replace(propteryName, value.ToString(), true, true);
            }
        }

调用示例:

               //Entity 数据信息
                PublicNoticeView viewData = new PublicNoticeView();
                viewData.OrgName = orgInfo.DeptName;
                viewData.PersonName = legalPerson.PersonName;
                viewData.OrgType = orgInfo.DeptType;
                viewData.OrgAddress = orgProfile.OrgAddress;
                viewData.ServiceTarget = orgProfile.ServiceTarget;
                viewData.BedNum = (orgProfile.BedNum ?? 0).ToString();
                viewData.ToothChairNum= (orgProfile.ToothChairNum ?? 0).ToString();
                viewData.DiagnosisItems = diagnosisInfoTxt.ToString().TrimEnd('、');
                viewData.OperationNature = orgProfile.OperationNature;
                //加载文档
                Spire.Doc.Document doc = new Spire.Doc.Document();
                doc.LoadFromFile(@"D:\templete.docx");//加载模板文件路径
                ReplaceKey(viewData, doc);
                //保存替换后的模板文件
                string savePath = @"D:\"+ "newTemplete.docx";
                if (File.Exists(savePath))
                {
                    File.Delete(savePath);//删除原文件
                }
                doc.SaveToFile(savePath, FileFormat.Docx);
                doc.Close();

 文档插入附件

       /// <summary>
        /// 文档插入附件
        /// </summary>
        /// <param name="doc"></param>
        /// <param name="filePath">附件路径</param>
        /// <param name="docRootPath">文件根目录</param>
        private void InsertFile(Spire.Doc.Document doc, string filePath, string docRootPath)
        {
            string fullPath = docRootPath + filePath;
            if (File.Exists(fullPath))
            {
                try
                {
                    string extension = Path.GetExtension(fullPath).ToLower();//获取文件名后缀
                    //图片
                    if (extension == ".png" || extension == ".jpg" || extension == ".jpeg" || extension == ".bmp")
                    {
                        InsertImg(doc, fullPath);
                    }
                    else if (extension == ".doc" || extension == ".docx")
                    {
                        doc.InsertTextFromFile(fullPath, FileFormat.Docx);
                        doc.AddSection();
                    }
                    else if (extension == ".pdf")
                    {
                        InsertPdf(doc, docRootPath, fullPath);
                    }
                }
                catch (Exception ex)
                {
                    logger.Error($"插入附件{fullPath}失败:" + ex.StackTrace);
                }
            }
        }

        /// <summary>
        /// 插入pdf
        /// </summary>
        /// <param name="doc"></param>
        /// <param name="rootPath"></param>
        /// <param name="pdfPath"></param>
        private void InsertPdf(Spire.Doc.Document doc, string rootPath, string pdfPath)
        {
            try
            {
                //由于Spire.Pdf只可以转换前3页内容,因此超过三页内容的pdf使用itextSharp处理单页,再使用Spire.Pdf转换为图片保存
                //Spire.Pdf.PdfDocument docPdf = new Spire.Pdf.PdfDocument();
                //docPdf.LoadFromFile(pdfPath);
                //int pdfPages = docPdf.Pages.Count;
                iTextSharp.text.pdf.PdfReader pdfReaderAll = new iTextSharp.text.pdf.PdfReader(pdfPath);
                int pdfPages = pdfReaderAll.NumberOfPages;
                pdfReaderAll.Close();
                if (pdfPages <= 3)
                {
                    string wordPath = "";
                    PdfHelper.DocToPdf(rootPath, pdfPath, out wordPath);
                    if (!string.IsNullOrEmpty(wordPath))
                    {
                        doc.InsertTextFromFile(wordPath, FileFormat.Docx);
                        doc.AddSection();
                        File.Delete(wordPath);
                    }
                    //docPdf.Close();
                }
                else
                {
                    //docPdf.Close();
                    string newDirPath = rootPath + "\\PdfConvert\\" + DateTime.Now.ToString("yyyyMMdd") + "\\";
                    if (!Directory.Exists(newDirPath))
                    {
                        Directory.CreateDirectory(newDirPath);
                    }
                    iTextSharp.text.pdf.PdfReader pdfReader = new iTextSharp.text.pdf.PdfReader(pdfPath);
                    for (int j = 1; j <= pdfPages; j++)
                    {
                        string pdfNewPath = newDirPath + Guid.NewGuid().ToString() + ".pdf";
                        //保存单页信息为新的pdf
                        iTextSharp.text.Document pdfDoc = new iTextSharp.text.Document();
                        FileStream fs = new FileStream(pdfNewPath, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
                        iTextSharp.text.pdf.PdfWriter pdfWriter = iTextSharp.text.pdf.PdfWriter.GetInstance(pdfDoc, fs);
                        pdfDoc.Open();
                        pdfDoc.NewPage();
                        iTextSharp.text.pdf.PdfContentByte cb = pdfWriter.DirectContent;
                        cb.AddTemplate(pdfWriter.GetImportedPage(pdfReader, j), 0, 0);
                        pdfDoc.Close();
                        pdfWriter.Close();
                        fs.Close();
                        //spire.pdf 读取新的保存的pdf,转换成图片插入word文档
                        Spire.Pdf.PdfDocument docNew = new Spire.Pdf.PdfDocument();
                        docNew.LoadFromFile(pdfNewPath);
                        System.Drawing.Image bmp = docNew.SaveAsImage(0);
                        InsertImg(doc, "", bmp);
                        docNew.Close();
                        File.Delete(pdfNewPath);//删除新的单页pdf文件
                    }
                    pdfReader.Close();
                }
            }
            catch(Exception ex)
            {
                logger.Error($"插入pdf附件{pdfPath}失败:" + ex.StackTrace);
            }  
        }
        /// <summary>
        /// 插入图片
        /// </summary>
        /// <param name="doc"></param>
        /// <param name="imgPath"></param>
        /// <param name="img"></param>
        private void InsertImg(Spire.Doc.Document doc, string imgPath, Image img = null)
        {
            Section section = null;
            Paragraph para = null;
            try
            {
                var pageCount = doc.Sections.Count;
                if (pageCount > 0)
                {
                    section = doc.Sections[pageCount - 1];
                }
                else
                {
                    section = doc.AddSection();
                }
                para = section.AddParagraph();
                Image image = (!string.IsNullOrWhiteSpace(imgPath)) ? ReduceImg(imgPath) : ReduceImg("", img);
                DocPicture docPic = para.AppendPicture(image);
            }
            catch(Exception ex)
            {
                logger.Error($"插入图片{imgPath}失败{ex.StackTrace}");
            }
        }
        /// <summary>
        /// 适当缩小图片高度和宽度
        /// </summary>
        /// <param name="filePath"></param>
        /// <param name="img">图片</param>
        /// <returns></returns>
        private Image ReduceImg(string filePath, Image img = null)
        {
            logger.Info($"图片路径{filePath}");
            Image originImg = (!string.IsNullOrWhiteSpace(filePath)) ? Image.FromFile(filePath) : img;
            int width = originImg.Width;
            int height = originImg.Height;
            logger.Info($"图片宽度{width},图片高度{height}");
            //当图片宽度超过word文档宽度,那么根据比例缩小图片
            if (width > 590)
            {
                int newWidth = 580;
                int newHeight = height * newWidth / width;
                Image newImg = new Bitmap(newWidth, newHeight);
                Graphics g = Graphics.FromImage(newImg);
                g.DrawImage(originImg, 0, 0, newWidth, newHeight);
                return newImg;
            }
            else
            {
                return originImg;
            }
        }

        /// <summary>
        /// 电子签证图片设置
        /// </summary>
        /// <param name="doc">document</param>
        /// <param name="imgPath">电子图片路径</param>
        /// <param name="findText">需要替换的文本</param>
        /// <param name="width">电子图宽度</param>
        /// <param name="height">电子图高度</param>
        /// <param name="hp">HorizontalPosition</param>
        /// <param name="vp">VerticalPosition</param>
        /// <param name="replaceEmpty">是否需要将文本替换为空</param>
        private void SetESign(Spire.Doc.Document doc, string imgPath, string findText, float width, float height, float hp, float vp, bool replaceEmpty = false)
        {
            if (File.Exists(imgPath))
            {
                TextSelection selection = doc.FindString(findText, false, false);
                TextRange range = selection.GetAsOneRange();
                Paragraph para = range.OwnerParagraph;
                DocPicture picture = para.AppendPicture(Image.FromFile(imgPath));
                picture.Width = width;
                picture.Height = height;
                picture.HorizontalPosition = hp;//指定图片位置
                picture.VerticalPosition = vp;
                picture.TextWrappingStyle = TextWrappingStyle.InFrontOfText; //指定文字环绕方式
                picture.TextWrappingType = TextWrappingType.Both;
            }
            if (replaceEmpty)
            {
                doc.Replace(findText, "", true, true);
            }
        }

       

指定位置插入电子签名、电子公章等

       /// <summary>
        /// 电子签证图片设置
        /// </summary>
        /// <param name="doc">document</param>
        /// <param name="imgPath">电子图片路径</param>
        /// <param name="findText">需要替换的文本</param>
        /// <param name="width">电子图宽度</param>
        /// <param name="height">电子图高度</param>
        /// <param name="hp">HorizontalPosition</param>
        /// <param name="vp">VerticalPosition</param>
        /// <param name="replaceEmpty">是否需要将文本替换为空</param>
        private void SetESign(Spire.Doc.Document doc, string imgPath, string findText, float width, float height, float hp, float vp, bool replaceEmpty = false)
        {
            if (File.Exists(imgPath))
            {
                TextSelection selection = doc.FindString(findText, false, false);
                TextRange range = selection.GetAsOneRange();
                Paragraph para = range.OwnerParagraph;
                DocPicture picture = para.AppendPicture(Image.FromFile(imgPath));
                picture.Width = width;
                picture.Height = height;
                picture.HorizontalPosition = hp;//指定图片位置
                picture.VerticalPosition = vp;
                picture.TextWrappingStyle = TextWrappingStyle.InFrontOfText; //指定文字环绕方式
                picture.TextWrappingType = TextWrappingType.Both;
            }
            if (replaceEmpty)
            {
                doc.Replace(findText, "", true, true);
            }
        }

创建复选框

    /// <summary>
    /// 需要生成的checkbox信息
    /// </summary>
    public class CheckBoxInfo
    {
        /// <summary>
        /// 需要替换的文本
        /// </summary>
        public string ReplaceTxt { get; set; }
        /// <summary>
        /// 是否选中
        /// </summary>
        public bool IsChecked { get; set; }
    }


        /// <summary>
        /// 动态创建复选框
        /// </summary>
        /// <param name="doc"></param>
        /// <param name="checkBoxInfos"></param>
        private void CreateCheckBox(Spire.Doc.Document doc, List<CheckBoxInfo> checkBoxInfos)
        {
            foreach (var item in checkBoxInfos)
            {
                string charTxt = item.IsChecked == true ? ((char)82).ToString() : ((char)163).ToString();
                TextSelection selection = doc.FindString(item.ReplaceTxt, true, true);
                TextRange tr = selection.GetAsOneRange();
                tr.CharacterFormat.FontName = "Wingdings 2";
                doc.Replace(selection.SelectedText, charTxt, true, true);
            }
        }

去除word空白节

        /// <summary>
        /// 去除空白节
        /// </summary>
        /// <param name="doc"></param>
        /// <returns></returns>
        private Document RemoveWhiteSec(Spire.Doc.Document doc)
        {
            Spire.Doc.Document docNew = new Spire.Doc.Document();
            foreach (Section section in doc.Sections)
            {
                if (section.Paragraphs.Count > 0)
                {
                    docNew.Sections.Add(section.Clone());
                }
            }
            return docNew;
        }

table 表格动态添加行并填充数据

                    //加载文档
                    Spire.Doc.Document doc = new Spire.Doc.Document();
                    doc.LoadFromFile(@"D:\templete.docx");
                    //数据处理 生成表格数据              
                    Section section = doc.Sections[0];
                    Table tb = section.Tables[0] as Table;//获取第一个表格
                    int rowNum = staffCvDatas.Count();//需要添加的行数
                    //添加行数
                    for (int i = 1; i <= rowNum; i++)
                    {
                        tb.AddRow(true, 9);//添加一行到表格的最后,9列
                        tb.Rows[i].Height = 20;//设置行高
                    }
                    //表格数据填充
                    int currentIndex = 1;//当前table数据索引
                    foreach (var item in staffCvDatas)//注:此处的staffCvDatas是需要处理的数据集合
                    {
                        tb[currentIndex, 0].AddParagraph().AppendText(item.StaffName);
                        tb[currentIndex, 1].AddParagraph().AppendText(item.Sex);
                        tb[currentIndex, 2].AddParagraph().AppendText(item.Age.ToString());
                        tb[currentIndex, 3].AddParagraph().AppendText(item.PositionName);
                        tb[currentIndex, 4].AddParagraph().AppendText(item.Special);
                        tb[currentIndex, 5].AddParagraph().AppendText(item.DeptName);
                      tb[currentIndex,6].AddParagraph().AppendText(item.ProfessionalRange);
                        tb[currentIndex, 7].AddParagraph().AppendText(item.CertNo);
                        tb[currentIndex, 8].AddParagraph().AppendText(item.OrgName);
                        currentIndex++;
                    }
                    string savePath = @"D:\newtemplete.docx";
                    if (File.Exists(savePath))
                    {
                        File.Delete(savePath);//删除原文件
                    }
                    doc.SaveToFile(savePath, FileFormat.Docx);
                    doc.Close();

模板归档生成效果示例

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spire.Doc for Java是一款功能强大的Java Word组件,可以帮助Java开发者快速实现Word文档的创建、读取和编辑等操作。其中,根据模板生成Word文档Spire.Doc for Java的一项重要功能,下面简单介绍一下它的使用方法。 1. 创建模板文档 首先,我们需要创建一个Word模板文档,其中包含需要替换的占位符和样式等信息。可以使用Microsoft Word等工具创建模板文档,并将其保存为docdocx格式。 2. 加载模板文档 在Java代码中,使用Spire.Doc for Java的Document类加载模板文档,代码如下: ```java import com.spire.doc.*; public class LoadTemplate { public static void main(String[] args) { // 创建Document对象 Document doc = new Document(); // 加载模板文档 doc.loadFromFile("template.docx"); } } ``` 其中,loadFromFile方法的参数为模板文档的路径。 3. 替换占位符 接下来,我们需要根据实际需求替换模板文档中的占位符。Spire.Doc for Java提供了replace方法来实现占位符的替换,代码如下: ```java import com.spire.doc.*; public class ReplacePlaceholder { public static void main(String[] args) { // 创建Document对象 Document doc = new Document(); // 加载模板文档 doc.loadFromFile("template.docx"); // 替换占位符 doc.replace("{{name}}", "张三", true, true); doc.replace("{{age}}", "25", true, true); // 保存文档 doc.saveToFile("output.docx", FileFormat.Docx_2013); } } ``` 其中,replace方法的第一个参数为需要替换的占位符,第二个参数为替换后的文本内容,第三个参数表示是否区分大小写,第四个参数表示是否替换整个单词。 4. 设置样式 如果需要设置生成的Word文档的样式,可以使用Spire.Doc for Java提供的各种样式类来实现,例如ParagraphStyle、CharacterFormat等。具体使用方法可以参考Spire.Doc for Java的官方文档。 5. 保存文档 最后,调用Document类的saveToFile方法将生成的Word文档保存到指定路径,代码如下: ```java doc.saveToFile("output.docx", FileFormat.Docx_2013); ``` 其中,第一个参数为保存的文件路径,第二个参数为保存的文档格式,可以选择docdocx、pdf等多种格式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值