在「透過 Aspose.Words 置換Word中的圖片」中,先事先建立好 文繞圖 的 Word 範本檔,
透過 NPOI 另存 Word 後,那個 Word 檔就壞了,如下圖,
硬開起來後,發現我的文繞圖的Style不見了,如下圖,
只好改由 Aspose.Words 來置換 Word 檔中的文字(還好原本的NPOI也是做Replace而已)。
本來想直接用 doc.Range.Replace(oldString, newString, false, false) 去做 Replace ,
但如果要換的文字中有換行,就會引發 「The replace string cannot contain special or break characters.」的錯誤。
所以就依官網的方式,新增另一個類別(InsertDocumentAtReplaceHandler),再透過 DocumentBuilder 來處理換行的問題,如下,
public class InsertDocumentAtReplaceHandler : IReplacingCallback
{
string _newValue = string.Empty;
public InsertDocumentAtReplaceHandler(string newValue)
{
_newValue = newValue;
}
ReplaceAction IReplacingCallback.Replacing(ReplacingArgs e)
{
DocumentBuilder builder = new DocumentBuilder((Aspose.Words.Document)e.MatchNode.Document);
builder.MoveTo(e.MatchNode);
builder.Write(_newValue);
e.Replacement = "";
return ReplaceAction.Replace;
}
}
置換的測試程式如下,
DataTable dt = new DataTable("MyTable");
dt.Columns.Add("OWNER_TYPE", typeof(string));
dt.Columns.Add("OWNER_NM", typeof(string));
dt.Columns.Add("BIRTH_DATE", typeof(string));
dt.Columns.Add("OWNER_ADDR", typeof(string));
for (int i = 0; i < 6; i++)
{
dt.Rows.Add(i.ToString(), "OWNER_NM0堃" + i.ToString()
, "BIRTH_DATE" + i.ToString()
, "OWNER_ADDR" + i.ToString() + Environment.NewLine + "after NewLine"
);
}
Aspose.Words.License license = new Aspose.Words.License();
license.SetLicense("你的license檔.lic");
Aspose.Words.Document doc = new Aspose.Words.Document(@"d:\t1.docx");
for (int i = 0; i < dt.Rows.Count; i++)
{
foreach (DataColumn dc in dt.Columns)
{
string columnName = dc.ColumnName;
string oldValue = string.Format("#FLD_{0}{1}#", columnName, i);
string newValue = (string)dt.Rows[i][columnName];
Regex regex = new Regex(oldValue);
// 如果要置換上去的文字內容有特別的符號,如換行,就會有exception
// The replace string cannot contain special or break characters.
// int value = doc.Range.Replace(oldValue, newValue, false, false);
int value = doc.Range.Replace(regex, new InsertDocumentAtReplaceHandler(newValue), false);
}
}
doc.Save(@"d:\t1Result.docx");
結果如下,
參考資料
Range.Replace Method (Regex, IReplacingCallback, Boolean)
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^