[DevExpress]透過 RichEditDocumentServer 在 Word檔 中加入自定的「目錄索引」

在前一篇 透過 RichEditDocumentServer 在 Word檔 中加入「目錄索引」 中,

是加入預設的「目錄索引」,但是那個「目錄索引」格式可以自已調整嗎?

如果我們要將預設的「目錄索引」改成以 表格(Table)的方式來呈現是否可以呢? 如下,

所以我們需要取得「目錄索引」的內容,再將新增一個表格,放到檔案之中,最後再將原本的「目錄索引」移除就好了。

//using DevExpress.Office.Utils;
//using DevExpress.XtraRichEdit;
//using DevExpress.XtraRichEdit.API.Native;
//建立 RichEditDocumentServer
RichEditDocumentServer srv = new RichEditDocumentServer();
//讀進 word 檔案
srv.LoadDocument(@"d:\rm.docx");
//取得 Document
Document doc = srv.Document;
doc.BeginUpdate();

//先加入分頁, 因為要把目錄索引放在第1頁
Section newPageSession = doc.InsertSection(doc.Range.Start);
newPageSession.StartType = SectionStartType.NextPage;

//https://documentation.devexpress.com/#DocumentServer/CustomDocument15301
//在最前面加入 目錄索引
string tocCode = @"TOC \o 2-2"; 
Field todField = doc.Fields.Create(doc.Range.Start, tocCode);

//執行更新
todField.Update();

//取出 TOC 的內容
string tocContent = doc.GetText(todField.ResultRange);

//解析出幾個索引,用 \r\n 分隔
string[] tocs = tocContent.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);

//https://www.devexpress.com/Support/Center/Example/Details/E3452
//加入 Table
int rowCount = tocs.Length + 1;
int columnCount = 3;
Table tableTOC = doc.Tables.Create(doc.Range.Start, rowCount, columnCount);
tableTOC.TableLayout = TableLayoutType.Fixed;

tableTOC.PreferredWidthType = WidthType.Fixed;
tableTOC.PreferredWidth = Units.InchesToDocumentsF(3f);

tableTOC.Rows[1].HeightType = HeightType.Exact;
tableTOC.Rows[1].Height = Units.InchesToDocumentsF(0.25f);

// 加入 Table Header
doc.InsertText(tableTOC[0, 0].Range.Start, "序號");
doc.InsertText(tableTOC[0, 1].Range.Start, "索引");
doc.InsertText(tableTOC[0, 2].Range.Start, "頁次");
for(int i=0;i< rowCount-1; i++)
{
	//用 \t 分隔
	string[] indexs = tocs[i].Split('\t');
	//加入內容
	doc.InsertText(tableTOC[i + 1, 0].Range.Start, i.ToString());
	doc.InsertText(tableTOC[i + 1, 1].Range.Start, indexs[0]);
	doc.InsertText(tableTOC[i + 1, 2].Range.Start, indexs[1]);
}

//將原本的 TOC 移掉
doc.Delete(todField.Range);

doc.EndUpdate();

//另存新檔 docx 是使用 OpenXml 哦!
doc.SaveDocument(@"d:\rm_x.docx", DocumentFormat.OpenXml);

Hi, 

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

請大家繼續支持 ^_^