使用 c# 使用 open xml 替换单词 table 中的标记
Replace token inside word table using open xml using c#
我有一个要求,我要根据计数将单词 table 克隆到多个 table 中,然后插入到 word 文档中。如果我有 5 条记录,它应该使用现有的 table 克隆添加五个 table 并替换 table 中的令牌。它添加了 5 tables 但它用最后一条记录替换了所有五个 tables 的内容所以所有五个 tables 都具有与最后一行相同的数据。
//Main code
string tableInnerText = tblMain.InnerText;
List<string> fieldsList = GetFieldList(tableInnerText, repeatedTableListName);
var parentParagraph = printBookmarkStart.Parent;
tbl[0].Remove();
for (int rowIndex = 0; rowIndex < dt.Rows.Count; rowIndex++)
{
if (pageBreak.ToUpper() == "YES" && rowIndex > 0)
{
_wordDoc.MainDocumentPart.Document.Body.InsertAfter(new Paragraph(new Run(new Break() { Type = BreakValues.Page })), parentParagraph);
}
tblMainTmp = (Table)tblMain.Clone();
_wordDoc.MainDocumentPart.Document.Body.InsertAfter<Table>(tblMainTmp, parentParagraph);
_wordDoc.MainDocumentPart.Document.Save();
UpdateRepeatedTable(dt.Rows[rowIndex], dt, rowIndex, fieldsList, repeatedTableListName);
}
[...]
private void UpdateRepeatedTable(DataRow dr, DataTable dt, int dataRowIndex, List<string> tableColumnsList, string repeatedTableListName)
{
try
{
DataTable dtFunction = GetFunctionDataTable(tableColumnsList, repeatedTableListName);
for (int j = 0; j < tableColumnsList.Count; j++)
{
string dtColumnName = ParseRelatedListFieldName(tableColumnsList[j], repeatedTableListName, true);
string dtColumnValue = dr[dtColumnName].ToString();
string formatValue = string.Empty;
string replaceValue = dtColumnValue;
//TODO: Check if fields a function field
DataRow[] findRow = dtFunction.Select(string.Format("FieldName='{0}'", tableColumnsList[j]));
bool bIsCheckBoxField = false;
if (findRow.Length > 0)
{
bIsCheckBoxField = (findRow[0]["FunctionName"].ToString().ToUpper() == "CHECKBOX" ? true : false);
formatValue = findRow[0]["Format"].ToString();
replaceValue = GetFunctionValue(dt, 0, findRow[0], ""/*, null*/);
}
_clsLog.WriteMessage("Replacing " + tableColumnsList[j] + " with " + replaceValue, ClsLog.LogType.Log);
SearchAndReplacer.SearchAndReplace(_wordDoc, tableColumnsList[j], replaceValue, true);
if (bIsCheckBoxField == true)
{
ProcessStandardFieldCheckBox(/*wordApp,*/ dtColumnValue, formatValue);
}
}
}
catch (Exception ex)
{
_clsLog.WriteMessage(ex);
}
}
http://www.ericwhite.com/blog/search-and-replace-text-in-an-open-xml-wordprocessingml-document/
我可以在 open-xml-powertools 中使用 DocumentAssembler (http://www.ericwhite.com/blog/documentassembler-developer-center/) 解决这个问题,这是 Eric White 的建议。
DocumentAssembler 正在为处理重复内容、表格、匹配条件的文档提供真实选项。
我有一个要求,我要根据计数将单词 table 克隆到多个 table 中,然后插入到 word 文档中。如果我有 5 条记录,它应该使用现有的 table 克隆添加五个 table 并替换 table 中的令牌。它添加了 5 tables 但它用最后一条记录替换了所有五个 tables 的内容所以所有五个 tables 都具有与最后一行相同的数据。
//Main code
string tableInnerText = tblMain.InnerText;
List<string> fieldsList = GetFieldList(tableInnerText, repeatedTableListName);
var parentParagraph = printBookmarkStart.Parent;
tbl[0].Remove();
for (int rowIndex = 0; rowIndex < dt.Rows.Count; rowIndex++)
{
if (pageBreak.ToUpper() == "YES" && rowIndex > 0)
{
_wordDoc.MainDocumentPart.Document.Body.InsertAfter(new Paragraph(new Run(new Break() { Type = BreakValues.Page })), parentParagraph);
}
tblMainTmp = (Table)tblMain.Clone();
_wordDoc.MainDocumentPart.Document.Body.InsertAfter<Table>(tblMainTmp, parentParagraph);
_wordDoc.MainDocumentPart.Document.Save();
UpdateRepeatedTable(dt.Rows[rowIndex], dt, rowIndex, fieldsList, repeatedTableListName);
}
[...]
private void UpdateRepeatedTable(DataRow dr, DataTable dt, int dataRowIndex, List<string> tableColumnsList, string repeatedTableListName)
{
try
{
DataTable dtFunction = GetFunctionDataTable(tableColumnsList, repeatedTableListName);
for (int j = 0; j < tableColumnsList.Count; j++)
{
string dtColumnName = ParseRelatedListFieldName(tableColumnsList[j], repeatedTableListName, true);
string dtColumnValue = dr[dtColumnName].ToString();
string formatValue = string.Empty;
string replaceValue = dtColumnValue;
//TODO: Check if fields a function field
DataRow[] findRow = dtFunction.Select(string.Format("FieldName='{0}'", tableColumnsList[j]));
bool bIsCheckBoxField = false;
if (findRow.Length > 0)
{
bIsCheckBoxField = (findRow[0]["FunctionName"].ToString().ToUpper() == "CHECKBOX" ? true : false);
formatValue = findRow[0]["Format"].ToString();
replaceValue = GetFunctionValue(dt, 0, findRow[0], ""/*, null*/);
}
_clsLog.WriteMessage("Replacing " + tableColumnsList[j] + " with " + replaceValue, ClsLog.LogType.Log);
SearchAndReplacer.SearchAndReplace(_wordDoc, tableColumnsList[j], replaceValue, true);
if (bIsCheckBoxField == true)
{
ProcessStandardFieldCheckBox(/*wordApp,*/ dtColumnValue, formatValue);
}
}
}
catch (Exception ex)
{
_clsLog.WriteMessage(ex);
}
}
http://www.ericwhite.com/blog/search-and-replace-text-in-an-open-xml-wordprocessingml-document/
我可以在 open-xml-powertools 中使用 DocumentAssembler (http://www.ericwhite.com/blog/documentassembler-developer-center/) 解决这个问题,这是 Eric White 的建议。
DocumentAssembler 正在为处理重复内容、表格、匹配条件的文档提供真实选项。