.NET Word模板-根据特殊字符定位替换table或者文本

  • Post author:
  • Post category:其他




获取Word文件中,特殊字符标记中间文字。


        /// <summary>
        ///  获取路径下所有特殊字符包含的数据
        /// </summary>
        /// <param name="tempFile">文件路径</param>
        /// <param name="startstr">开始字符</param>
        /// <param name="endstr">结束字符</param>
        /// <param name="contractID">合同ID</param>
        public void GetWholeString(string tempFile, string startstr, string endstr, int contractID)
        {
            T_UserInputVariableServer name = new T_UserInputVariableServer();
            using (FileStream stream = File.OpenRead(tempFile))
            {
                XWPFDocument doc = new XWPFDocument(stream);
                List<string> ImportString = new List<string>();
                List<T_UserInputVariable> userInputVariable = new List<T_UserInputVariable>();
                //删除历史变量
                name.DeleteList(name.GetListWhere(t => t.contractID == contractID).ToList());
                foreach (XWPFParagraph item in doc.BodyElements)
                {
                    ImportString = MidStrEx(item.Text, startstr, endstr);
                    foreach (var Variable in ImportString)
                    {
                        userInputVariable.Add(new T_UserInputVariable()
                        {
                            inputVariable = $"{startstr}{Variable}{endstr}",
                        });
                    }
                }
                
            }
        }



获取一个字符串中特殊字符

 /// <summary>
        /// 获取一个字符串中特殊字符
        /// </summary>
        /// <param name="sourse">数据源</param>
        /// <param name="startstr">开始特殊字符</param>
        /// <param name="endstr">结束特殊字符</param>
        /// <returns></returns>
        public static List<string> MidStrEx(string sourse, string startstr, string endstr)
        {
            List<string> result = new List<string>();
            string endString = sourse;
            int startindex, endindex;
            try
            {
                for (int i = 1; i < 10000; i++)
                {
                    startindex = endString.IndexOf(startstr);
                    if (startindex == -1)
                        return result;
                    string tmpstr = endString.Substring(startindex + startstr.Length);
                    endindex = tmpstr.IndexOf(endstr);
                    if (endindex == -1)
                        return result;
                    string a = tmpstr.Remove(endindex);
                    result.Add(a);
                    endString = tmpstr.Substring(endindex + 2);
                }
            }
            catch (Exception ex)
            {
                //Log.WriteLog("MidStrEx Err:" + ex.Message);
            }
            return result;
        } 



Json 字符串 转换为 DataTable数据集合

  /// <summary>
        /// Json 字符串 转换为 DataTable数据集合
        /// </summary>
        /// <param name="json"></param>
        /// <returns></returns>
        public DataTable ToDataTableTwo(string json)
        {
            DataTable dataTable = new DataTable();  //实例化
            DataTable result;
            try
            {
                JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
                javaScriptSerializer.MaxJsonLength = Int32.MaxValue; //取得最大数值
                ArrayList arrayList = javaScriptSerializer.Deserialize<ArrayList>(json);
                if (arrayList.Count > 0)
                {
                    foreach (Dictionary<string, object> dictionary in arrayList)
                    {
                        if (dictionary.Keys.Count<string>() == 0)
                        {
                            result = dataTable;
                            return result;
                        }
                        //Columns
                        if (dataTable.Columns.Count == 0)
                        {
                            foreach (string current in dictionary.Keys)
                            {
                                dataTable.Columns.Add(current, dictionary[current] == null ? Type.GetType("System.String") : dictionary[current].GetType());
                            }
                        }
                        //Rows
                        DataRow dataRow = dataTable.NewRow();
                        foreach (string current in dictionary.Keys)
                        {
                            dataRow[current] = dictionary[current];
                        }
                        dataTable.Rows.Add(dataRow); //循环添加行到DataTable中
                    }
                }
            }
            catch (Exception ex)
            {
            }
            result = dataTable;
            return result;
        }



Word模板-根据特殊字符定位替换table或者文本

1、根据word模板中

##文字##

双#号进行获取用户设置的变量

2、针对于用户提供的变量,进行值的匹配(支持table-txt)

3、根据用户模板变量进行 TXT或者table值的替换

因项目未完成,并未进行代码整理。

using ContractService;
using DBModel;
using DBUtility;
using IOSerialize.Serialize;
using Models; 
using NPOI.XWPF.UserModel;
using Spire.Doc;
using Spire.Doc.Documents;
using Spire.Doc.Fields;
using System; 
using System.Collections.Generic; 
using System.Data;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Web;

namespace ClassHelper
{
    public class WordHelper
    {
        /// <summary>
        /// 生成worder文档
        /// </summary>
        /// <param name="tempFile">文件位置</param>
        /// <param name="saveFile">保存位置</param>
        /// <param name="contractID">合同ID</param>
        /// <param name="ProgramID"></param>
        public void CreateContractWord_Doc(string tempFile, string saveFile, int contractID, string ProgramID)
        {
            {
                var doc = new Spire.Doc.Document();
                doc.LoadFromFile(tempFile);
                T_UserInputVariableServer name = new T_UserInputVariableServer();
                T_User_TableJsonServer tableJson = new T_User_TableJsonServer();

                //匹配---文本替换  获取所有数据源SQL
                List<TableSql> RebateSQLTXT = name.SelectSqlTXT(contractID);
                DocReplaceTXT(doc, RebateSQLTXT, ProgramID);

                //自定义---文本替换
                List<T_UserInputVariable> t_UserInputVariable = name.GetListWhere(t => t.Type == 3).ToList();
                DocReplaceListTXT(doc, t_UserInputVariable);

                //自定义---Table 替换 
                List<T_User_TableJsonCount> _TableJsons = tableJson.GetUsertTable(contractID);
                DocReplaceJsonTable(doc, _TableJsons);
                //匹配---Table 替换 
                List<TableSql> RebateSQLTable = name.SelectSqlTable(contractID);

                DocReplaceTable(doc, ProgramID, RebateSQLTable); 
                //查找关键字符串文本
                doc.SaveToFile(saveFile, FileFormat.Docx);
                doc.Close();
            }
            //清除第一行数据,待优化
            {
                using (FileStream stream = File.OpenRead(saveFile))
                {
                    XWPFDocument doc = new XWPFDocument(stream);
                    //遍历段落                
                    var para = doc.Paragraphs[0];
                    foreach (var run in para.Runs)
                    {
                        run.SetText("", 0);
                    }
                    FileStream out1 = new FileStream(saveFile, FileMode.Create);
                    doc.Write(out1);
                    out1.Close();

                }
            }


           

        }

        public void DocReplaceJsonTable(Spire.Doc.Document doc, List<T_User_TableJsonCount> RebateTableJSON)
        {
            JsonHelper jsonHelper = new JsonHelper();
            foreach (var item in RebateTableJSON)
            {
                DataTable dataTable = jsonHelper.ToDataTableTwo(item.DataJson);
                for (int i = 0; i < Convert.ToInt32(item.Count); i++)//根据变量重复次数,进行一一替换
                {
                    TextSelection selection = doc.FindString(item.Variable, true, true);
                    if (selection != null)
                    {
                        Section section = doc.Sections[0];
                        Table table = section.AddTable(true);
                        table = DataSetToTable(table, dataTable);
                        //获取关键字符串所在段落的索引
                        TextRange range = selection.GetAsOneRange();
                        Paragraph paragraph = range.OwnerParagraph;
                        Body body = paragraph.OwnerTextBody;
                        int index = body.ChildObjects.IndexOf(paragraph);
                        //移除段落,插入表格 
                        body.ChildObjects.Remove(paragraph);
                        body.ChildObjects.Insert(index, table);
                    }
                }
            }
        }

        /// <summary>
        /// 将ListSql 查询出数据替换word关键字
        /// </summary>
        /// <param name="doc"></param>
        /// <param name="ProgramID"></param>
        /// <param name="RebateSQLTable"></param>
        public void DocReplaceTable(Spire.Doc.Document doc, string ProgramID, List<TableSql> RebateSQLTable)
        {
            foreach (var item in RebateSQLTable)
            {
                string sql = item.sqlData;
                if (!string.IsNullOrEmpty(item.SqlWhere))
                {
                    sql += $" where {item.SqlWhere}='{ProgramID}' ";
                }
                DataTable dataTable = DbHelperSQL.QueryTable(sql);
                for (int i = 0; i < Convert.ToInt32(item.Count); i++)
                {

                    Section section = doc.Sections[0];
                    TextSelection selection = doc.FindString(item.inputVariable, true, true);

                    if (selection != null)
                    {
                        //获取关键字符串所在段落的索引
                        TextRange range = selection.GetAsOneRange();
                        Paragraph paragraph = range.OwnerParagraph;
                        Body body = paragraph.OwnerTextBody;
                        int index = body.ChildObjects.IndexOf(paragraph);


                        Table table = section.AddTable(true);
                        table = DataSetToTable(table, dataTable);
                        //移除段落,插入表格 
                        body.ChildObjects.Remove(paragraph);
                        body.ChildObjects.Insert(index, table);
                    }
                }
            }
        }
        public void DocReplaceListTXT(Spire.Doc.Document doc, List<T_UserInputVariable> UserVariable)
        {
            foreach (var item in UserVariable)
            { 
                doc.Replace(item.inputVariable, string.IsNullOrEmpty(item.UserVariable)?"":item.UserVariable, false, false);
            }
        }
        /// <summary>
        /// 根据传入 List SQL,将数据填入Document,替换worde关键字
        /// </summary>
        /// <param name="doc"></param>
        /// <param name="RebateSQL"></param>
        /// <param name="ProgramID"></param>
        /// <returns></returns>
        public void DocReplaceTXT(Spire.Doc.Document doc, List<TableSql> RebateSQL, string ProgramID)
        {
            foreach (var item in RebateSQL)
            {
                string sql = item.sqlData;
                if (!string.IsNullOrEmpty(item.SqlWhere))
                {
                    sql += $" where {item.SqlWhere}='{ProgramID}' ";
                }
                DataTable RebateDataSet = DbHelperSQL.Query(sql).Tables[0];

                for (int j = 0; j < RebateDataSet.Columns.Count; j++)
                {
                    //DataColumn dtColumn = RebateDataSet.Columns[j];
                    //string ColumnName = $"##{ dtColumn.ColumnName}##";

                    string str = item.UserVariableData?.ToString();
                    char[] separator = { ',' };
                    string[] arr = str.Split(separator);

                   
                    for (int c = 0; c < RebateDataSet.Rows.Count; c++)
                    {
                        string ColumnName = arr[j];
                        doc.Replace(ColumnName, RebateDataSet.Rows[c][j].ToString(), false, false);
                    }
                }

            }
        }
        /// <summary>
        /// 将DataTable转换为Table
        /// </summary>
        /// <param name="list">请求数据</param>
        /// <returns></returns>
        public Table DataSetToTable(Table table, DataTable dt)
        {
            table.ResetCells(dt.Rows.Count + 1, dt.Columns.Count);
            for (int j = 0; j < dt.Columns.Count; j++)
            {
                DataColumn dtColumn = dt.Columns[j];
                table.Rows[0].Cells[j].AddParagraph().AppendText(dtColumn.ColumnName);
            }

            for (int i = 0; i < dt.Rows.Count; i++)
            {
                for (int j = 0; j < dt.Columns.Count; j++)
                {
                    table.Rows[i + 1].Cells[j].AddParagraph().AppendText(dt.Rows[i][j].ToString());
                }
            }
            return table;
        }



        /// <summary>
        ///  获取路径下所有特殊字符包含的数据
        /// </summary>
        /// <param name="tempFile">文件路径</param>
        /// <param name="startstr">开始字符</param>
        /// <param name="endstr">结束字符</param>
        /// <param name="contractID">合同ID</param>
        public void GetWholeString(string tempFile, string startstr, string endstr, int contractID)
        {
            T_UserInputVariableServer name = new T_UserInputVariableServer();
            using (FileStream stream = File.OpenRead(tempFile))
            {
                XWPFDocument doc = new XWPFDocument(stream);
                List<string> ImportString = new List<string>();
                List<T_UserInputVariable> userInputVariable = new List<T_UserInputVariable>();
                //删除历史变量
                name.DeleteList(name.GetListWhere(t => t.contractID == contractID).ToList());
                foreach (XWPFParagraph item in doc.BodyElements)
                {
                    ImportString = MidStrEx(item.Text, startstr, endstr);
                    foreach (var Variable in ImportString)
                    {
                        userInputVariable.Add(new T_UserInputVariable()
                        {
                            inputVariable = $"{startstr}{Variable}{endstr}",
                        });
                    }
                }
                List<T_UserInputVariable> distinctInsertVariable = userInputVariable
                   .GroupBy(p => p.inputVariable)
                   .Select(g => new T_UserInputVariable
                   {
                       contractID = contractID,
                       Count = g.Count(),
                       Type = 0,
                       inputVariable = g.Key,
                       CreateData = DateTime.Now
                   })
                   .ToList();
                name.InsertList(distinctInsertVariable);
            }
        }
        /// <summary>
        /// 获取一个字符串中特殊字符
        /// </summary>
        /// <param name="sourse">数据源</param>
        /// <param name="startstr">开始特殊字符</param>
        /// <param name="endstr">结束特殊字符</param>
        /// <returns></returns>
        public static List<string> MidStrEx(string sourse, string startstr, string endstr)
        {
            List<string> result = new List<string>();
            string endString = sourse;
            int startindex, endindex;
            try
            {
                for (int i = 1; i < 10000; i++)
                {
                    startindex = endString.IndexOf(startstr);
                    if (startindex == -1)
                        return result;
                    string tmpstr = endString.Substring(startindex + startstr.Length);
                    endindex = tmpstr.IndexOf(endstr);
                    if (endindex == -1)
                        return result;
                    string a = tmpstr.Remove(endindex);
                    result.Add(a);
                    endString = tmpstr.Substring(endindex + 2);
                }
            }
            catch (Exception ex)
            {
                //Log.WriteLog("MidStrEx Err:" + ex.Message);
            }
            return result;
        } 
    }

}



版权声明:本文为weixin_43855255原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。