[.NET]透過 Aspose.Words 來置換 Word 檔中的文字

在「透過 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)

透過 Aspose.Words 置換Word中的圖片

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^