不懂事的小男孩

word模板导出的几种方式:第二种:C#通过模板导出Word(文字,表格,图片) 占位符替换

原文出处:https://www.cnblogs.com/ilefei/p/3508463.html

一:模板的创建   (注意文件后缀只能是.docx或.doct)

在需要位置 插入-文档部件-域,

  域名:MacroButton
  宏名:DoFieldClick
  显示文字:这个自己设置,为了与模板其他文字区分,可以用"[]"括起来.
  需要多少替换内容,添加多少域即可.

二:添加项目                                 

 

  在解决方案中添加项目WordMLHelper,在原项目中添加对WordMLHelper的引用后可以直接调用.(见头部出处)

三:调用方法                      

  首先确定模板文件位置和导出文件的生成路径.

 

        private string mubanFile = "muban.docx";
        private string outputPath = @"test1.docx";
  string templatePath = System.Web.HttpContext.Current.Request.MapPath(mubanFile );

  //mvc读取文件路径跟原文出处不一样

 List<TagInfo> tagInfos = wordMLHelper.GetAllTagInfo(System.IO.File.OpenRead(templatePath));//打开模板文件,获取所有填充域
                for (int i = 0; i < tagInfos.Count; i++)
                {
                    //填充域有两种类型,1:段落或图片,2:表格
                    //对填充域填充时需先判断填充域类型
                    if (tagInfos[i].Tbl == null)
                    {
                        if (string.Equals(tagInfos[i].TagTips.Trim(), "[NO]"))
                        {
                            TxtInfo txtInfo = new TxtInfo();
                            txtInfo.Content = info.NO;////////NO;--info实体类
                            txtInfo.ForeColor = "000000";
                            txtInfo.Size = 32;
                            txtInfo.HightLight = HighlightColor.None;
                            txtInfo.underlineStyle = UnderlineStyle.Single;
                            tagInfos[i].AddContent(txtInfo);
                        }

                    }
                    else
                    {
                        TableStructureInfo tblInfo = tagInfos[i].Tbl;
                        if (tagInfos[i].Seq == 2)//整个表格创建
                        {
                            for (int j = 0; j < 3; j++)
                            {
                                RowStructureInfo row = new RowStructureInfo();

                                for (int k = 0; k < 3; k++)
                                {
                                    CellStructureInfo cell = new CellStructureInfo();
                                    TxtInfo txtInfo = new TxtInfo();
                                    txtInfo.Content = "第" + (j + 1) + "行,第" + (k + 1) + "列";
                                    txtInfo.Size = 25;
                                    txtInfo.ForeColor = "0000ff";
                                    cell.AddContentLine(txtInfo);
                                    row.AddCell(cell);
                                }
                                tblInfo.AddRow(row);
                            }
                        }

                    }
                }
                if (!string.IsNullOrEmpty(saveFile))
                {
                    templatePath = System.Web.HttpContext.Current.Request.MapPath(tempFile);
                    wordMLHelper.GenerateWordDocument(System.IO.File.OpenRead(templatePath)
                        , System.Web.HttpContext.Current.Request.MapPath(saveFile)
                        , tagInfos);

                    Assistance.RemoveAllTmpFile();// 删除所有临时文件
                    //Response.Redirect(Request.Url.AbsoluteUri);
                }

  四、导出结果文档如果原来有下滑线,则在引用的项目中添加枚举类(在HighlightColor枚举下添加)

public enum UnderlineStyle
    {
        Single=0,
        Words,
        Double,
        Thick,
        Dotted,
        DottedHeavy,
        Dash,
        DashedHeavy,
        DashLong,
        DashLongHeavy,
        DotDash,
        DashDotHeavy,
        DotDotDash,
        DashDotDotHeavy,
        Wave,
        WavyHeavy,
        WavyDouble,
        None,
    }

  添加下滑线枚举变量(在TxtInfo类中)

   public UnderlineStyle underlineStyle = UnderlineStyle.None;

  在WordMLHelper类中的AssembleTxtRun方法中添加判断:

 if (txtInfo.underlineStyle!=UnderlineStyle.None)
                {
                    Underline underline = new Underline();
                    underline.Val = (UnderlineValues)((int)txtInfo.underlineStyle);
                    rPr.AppendChild(underline);
                }
                txtRun.AppendChild(rPr);//在上面插入下滑线的判断

  其他内容参照原出处

 对word已有表格更新操作:

if (tagInfos[i].Seq == 0)
                    {
                        TxtInfo txtInfo;
                        var cell2 = tblInfo.Rows[2].Cells[1];//通过表格索引修改,word文档不需要操作,注意:word中不能含相同名称否则会报索引大小错误
  ,同名可通过修改word中的同名文字然后用代码替换回来 txtInfo = new TxtInfo(); txtInfo.Content = newRow["RecordType1"].ToString();//////// cell121.AddContentLine(new TxtInfo() { Content = "" }); cell121.AddContentLine(new TxtInfo() { Content = "☑ A", Size = 24 }); cell121.AddContentLine(new TxtInfo() { Content = "☐ B", Size = 24 }); cell121.AddContentLine(new TxtInfo() { Content = "☐ C", Size = 24 }); } }

  

posted on 2019-04-10 16:49  不懂事的小男孩  阅读(1267)  评论(0编辑  收藏  举报