我主要是將現(xiàn)有的模板填入數(shù)據(jù)保存文檔即可。主題是TABLE填值,檢索TABLE主要是通過(guò)下標(biāo),如:
WordDoc.Tables[6]
其中WordDoc的類(lèi)型是Word.Document,就是當(dāng)前操作的word文檔,上面的代碼是獲取當(dāng)前文檔中的第六個(gè)表格,這里要注意一下,
我們慣性會(huì)認(rèn)為是第七個(gè)表格,但這就是微軟的不同,沒(méi)有采用數(shù)組索引的方式,如果當(dāng)初數(shù)組也這么設(shè)計(jì),下標(biāo)從1開(kāi)始,我們學(xué)習(xí)的時(shí)候不知道省多少事。
開(kāi)發(fā)過(guò)程中遇到了一個(gè)小難題就是合并單元格(縱向),沒(méi)有設(shè)計(jì)橫向的合并,現(xiàn)將合并的代碼貼出來(lái)備用:

/**//// <summary>
/// 縱向單元格合并
/// 說(shuō)明:如合并了第一行第一列和第二行第一列兩個(gè)單元格,則單元格cell(2, 1)已經(jīng)不存在,繼續(xù)操作會(huì)有異常,
/// 只有通過(guò)cell(1, 1)來(lái)獲取合并后的單元格
/// /<summary>
/// <param name="table"></param>
/// <param name="startRowIndex"></param>
/// <param name="columnIndex"></param>
private static void verticalCellMerge(Word.Table table, int startRowIndex, int columnIndex)


{
string previousText = table.Cell(startRowIndex++, columnIndex).Range.Text; // 保存對(duì)比文字
int previousRowIndex = startRowIndex - 1; // 因剛已經(jīng)+1了,所以再減回去
for (int i = startRowIndex; i <= table.Rows.Count; ++i) // 遍歷所有行的columnIndex列,發(fā)現(xiàn)相同的合并,從起始行的下一行開(kāi)始對(duì)比

{
string currentText = table.Cell(i, columnIndex).Range.Text;
if (previousText.Equals(currentText))

{
table.Cell(previousRowIndex, columnIndex).Merge(table.Cell(i, columnIndex)); // 合并先前單元格和當(dāng)前單元格
table.Cell(previousRowIndex, columnIndex).Range.Text = currentText; // 因?yàn)楹喜⒑蟛](méi)有將單元格內(nèi)容去除,需要手動(dòng)修改
table.Cell(previousRowIndex, columnIndex).Select();
WordApp.Selection.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter; // 水平居中顯示
table.Cell(previousRowIndex, columnIndex).VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter; // 垂直居中
}
else

{
previousText = currentText; // 將對(duì)比文字替換為當(dāng)前的內(nèi)容
previousRowIndex = i; // 檢索到不同的內(nèi)容,將當(dāng)前行下標(biāo)置為先前行下標(biāo),用于合并
}
}
}


/**//// <summary>
/// 橫向單元格合并
/// 注意:在合并單元格后必須將縱列數(shù)減去1
/// 如第一行第一列和第一行第二列合并后,原第一行第三列將變成第一行第二列,這就是在合并后i不加1的原因
/// </summary>
/// <param name="WordApp"></param>
/// <param name="table"></param>
/// <param name="startColumnIndex"></param>
/// <param name="rowIndex"></param>
private static void horizontalCellMerge(Word.Application WordApp, Word.Table table, int startColumnIndex, int rowIndex)


{
string previousText = table.Cell(rowIndex, startColumnIndex).Range.Text; // 保存對(duì)比文字
int previousColumnIndex = startColumnIndex++; // 保存先前對(duì)比列下標(biāo)
int colCount = table.Columns.Count;
for (int i = startColumnIndex; i <= colCount;) // 遍歷所有行的columnIndex列,發(fā)現(xiàn)相同的合并,從起始行的下一行開(kāi)始對(duì)比

{
string currentText = table.Cell(rowIndex, i).Range.Text;
if (previousText.Equals(currentText))

{
table.Cell(rowIndex, previousColumnIndex).Merge(table.Cell(rowIndex, i)); // 合并先前單元格和當(dāng)前單元格
table.Cell(rowIndex, previousColumnIndex).Range.Text = currentText; // 因?yàn)楹喜⒑蟛](méi)有將單元格內(nèi)容去除,需要手動(dòng)修改
table.Cell(rowIndex, previousColumnIndex).Select();
WordApp.Selection.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter; // 水平居中顯示
table.Cell(rowIndex, previousColumnIndex).VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter; // 垂直居中
--colCount;
}
else

{
previousText = currentText; // 將對(duì)比文字替換為當(dāng)前的內(nèi)容
previousColumnIndex = i++; // 檢索到不同的內(nèi)容,將當(dāng)前行下標(biāo)置為先前行下標(biāo),用于合并
}
}
}方法注釋已經(jīng)很詳細(xì)就不再贅述。
最后遇到的問(wèn)題是無(wú)格式的段落檢索,因?yàn)樵谏蓤?bào)告的時(shí)候需要在某些段落后填寫(xiě)測(cè)試的結(jié)論,這下又把我難住了,最終終于發(fā)現(xiàn)了bookmark這個(gè)東東,起始我對(duì)word并不熟悉,都不知道它有書(shū)簽的功能。順便就愛(ài)你個(gè)檢索書(shū)簽的方法貼出來(lái):

/**//// <summary>
/// 在整個(gè)文檔中根據(jù)書(shū)簽名檢索書(shū)簽對(duì)象
/// </summary>
/// <param name="name"></param>
private static Word.Bookmark getBookmarkByName(string name)


{
foreach (Word.Bookmark bm in WordDoc.Bookmarks)

{
if (bm.Name.Equals(name))
return bm;
}
return null;
}
}
例:
Word.Bookmark bm = getBookmarkByName(bookmarkName);
bm.Range.Text = "你好"; // 將檢索到書(shū)簽的內(nèi)容替換為“你好”這就是這次用C#做word報(bào)表的全部問(wèn)題,貌似都是小問(wèn)題。
最后需要看具體的word操作demo代碼請(qǐng)?jiān)L問(wèn)MSDN,貼個(gè)網(wǎng)址:
http://msdn.microsoft.com/zh-cn/library/78whx7s6(VS.80).aspx