获取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 版权协议,转载请附上原文出处链接和本声明。