轉載地址:https://www.cnblogs.com/wuhuacong/archive/2013/02/05/2893191.html
C#匯出Word,Excel的方法有很多,這次因為公司的業務需求,需要匯出內容豐富(文字,表格,圖片)的報告,以前的方法不好使,所以尋找新的匯出方法,在網上找到了通過模板檔案匯出Word的方法,記錄一下程序.
一:模板的創建
通過模板匯出,肯定需要先創建模板,然后顧名思義就是將模板中提前設定好的占位符,通程序式替換為想輸出的內容即可;
新建word檔案(必須為docx或者dotx檔案),放在程式根目錄下,在需要位置 插入-檔案部件-域,
域名:MacroButton
宏名:DoFieldClick
顯示文字:這個自己設定,為了與模板其他文字區分,可以用"[]"括起來.
需要多少替換內容,添加多少域即可.

二:添加專案
在解決方案中添加專案WordMLHelper,在原專案中添加對WordMLHelper的參考后可以直接呼叫.
WordMLHelper代碼下載
三:呼叫方法
首先確定模板檔案位置和匯出檔案的生成路徑.
private string mubanFile = "muban.docx";
private string outputPath = @"C:\Users\zz\Desktop\test1.docx";
1.打開模板檔案,獲取所有填充域
1 string templatePath = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory 2 , mubanFile); 3 List<TagInfo> tagInfos = wordMLHelper.GetAllTagInfo(File.OpenRead(templatePath));
2.遍歷所有填充域,替換填充域內容
鎖定填充域的話,有兩種方法,一是根據填充域的提示文字,如"[文字]",二是根據填充域的索引,如if(tagInfos[i].Seq==2),則是找到索引為2的填充域
1 for (int i = 0; i < tagInfos.Count; i++)
2 {
3 //填充域有兩種型別,1:段落或圖片,2:表格
4 //對填充域填充時需先判斷填充域型別
5 if (tagInfos[i].Tbl == null)
6 {
7 if (string.Equals(tagInfos[i].TagTips.Trim(), "[文字]"))
8 {
9 TxtInfo txtInfo = new TxtInfo();
10 txtInfo.Content = "已經成功替換";
11 txtInfo.ForeColor = "00ff00";
12 //txtInfo.HightLight = HighlightColor.Blue;
13 tagInfos[i].AddContent(txtInfo);
14 }
15 if (string.Equals(tagInfos[i].TagTips.Trim(), "[圖片]"))
16 {
17 ImgInfo imgInfo = new ImgInfo();
18 imgInfo.ImgPath = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory
19 , "./image/a1.jpg");
20 imgInfo.Width = 200;
21 imgInfo.Height = 200;
22 tagInfos[i].AddContent(imgInfo);
23 }
24 }
25 else
26 {
27 TableStructureInfo tblInfo = tagInfos[i].Tbl;
28 if (tagInfos[i].Seq==2)
29 {
30 for (int j = 0; j < 3; j++)
31 {
32 RowStructureInfo row = new RowStructureInfo();
33
34 for (int k = 0; k < 3; k++)
35 {
36 CellStructureInfo cell = new CellStructureInfo();
37 TxtInfo txtInfo = new TxtInfo();
38 txtInfo.Content = "第" + (j + 1) + "行,第" + (k + 1) + "列";
39 txtInfo.Size = 25;
40 txtInfo.ForeColor = "0000ff";
41 cell.AddContentLine(txtInfo);
42 row.AddCell(cell);
43 }
44 tblInfo.AddRow(row);
45 }
46 }
47
48 }
49 }
3.保存檔案
View Code
四:完成
呼叫方法很簡單,隨著模板的修改,可以快速生成需要格式多樣內容豐富的Word檔案,感謝您的閱讀與評論.
五:補充
參考WordMLHelper.dll,
1.呼叫WordMLHelper的GetAllTagInfo方法(只接受后綴為.docx和.dotx的模板檔案路徑)獲取word標準模板的填充域集合List<TagInfo>;
2.填充域物件(TagInfo)的Tbl屬性(型別為TblStructureInfo)表示表格單元格型別的填充域物件(默認值為null代表該填充域非表格單元格型別),可通過Tbl[rowIndex,cellIndex]的方式獲取表格的單元格,并呼叫單元格(CellStructureInfo)的AddContent和AddContentLine(填充內容后換行)方法填充文本和圖片;
3.Tbl屬性的TblType變數表示該表格是僅含水平表頭(HORIZONTAL_HEADER)還是含水平和垂直表頭(HORIZONTAL_VERTICAL_HEADER),
4.根據需要將文本(TxtInfo物件)、圖片(ImgInfo物件)和表格(TblInfo物件)通過呼叫填充域(TagInfo物件)的AddContent和AddContentLine(填充內容后換行)方法填充到填充域中,
5.TxtInfo、ImgInfo和TblInfo類中含高度、寬度等樣式屬性,
6.若填充內容為不含樣式的純文本內容,則可通過WordMLHelper中的FillContentWithoutStyle方法將文本資訊填充至填充域,
7.若要將不含樣式的純文本內容填充到表格單元格型別(僅含水平表頭)的填充域,則可呼叫WordMLHelper中的FillContentToTable(TagInfo tagInfo, DataTable dt),
8.若要生成不含樣式的純文本內容的表格,則可呼叫WordMLHelper中的FillContentToTable(TagInfo tagInfo, DataTable dt),
9.呼叫WordMLHelper的GenerateWordDocument方法即可生成word檔案,
介面
WordMLHelper:操作模板類
方法如下:
GetAllTagInfo:獲取模板填充域及附加資訊
FillContentToTable:快速填充、生成純文本表格
FillContentWithoutStyle:快速填充純文本內容到填充域
GenerateWordDocument:根據模板生成word檔案
TagInfo:填充域類
屬性如下:
Seq:填充域的序號
TagTips:填充域的提示資訊
Tbl:表格單元格填充域型別物件(默認為null,表示非表格單元格填充域型別)
TxtInfo:文本型別填充內容類
屬性如下:
Size:字體大小
ForeColor: 字體顏色
HightLight: 背景色(高亮)
FontFamily: 字體
Content: 文本內容
ImgInfo:圖片型別填充內容類
屬性如下:
Width: 圖片寬度
Height: 圖片高度
ImgPath: 圖片路徑
TblInfo:表格型別填充內容類
屬性如下:
Width: 表格寬度
Rows: 行集合
方法如下:
AddRow: 填充行
RowInfo: 表格型別填充內容的表格行類
屬性如下:
Cells: 單元格
方法如下:
AddCell: 填充單元格
CellInfo: 表格型別填充內容的單元格類
屬性如下:
Width: 單元格寬度
ColSpan: 列合并數(默認為1)
RowSpan: 行合并數(默認為1)
方法如下:
AddContent: 添加填充內容
AddContentLine: 添加填充內容并換行
TableStructureInfo: 表格單元格型別的填充域類
屬性如下:
TblType: TblType列舉型別,表示表格是僅含水平表頭還是含水平和垂直表頭
Rows: 行集合
方法如下:
AddRow: 填充行
RowStructureInfo: 表格單元格型別的填充域的表格行類
屬性如下:
Index: 該行在模板表格中的行索引(只讀)
Cells: 單元格集合
方法如下:
AddCell: 添加單元格
CellStructureInfo: 表格單元格型別的填充域的單元格類
屬性如下:
Index: wordML中的列索引(大于或等于該單元格物體在行物體中的索引值)(只讀)
ColSpan: 合并列數目(默認為1,即是不合并)(只讀)
RowSpan: 合并行數目(默認為1,即是不合并)(只讀)
Tips: 單元格中的提示內容(只讀)
IsTemplate: 該單元格是否可填寫(只讀)
方法如下:
AddContent: 添加填充內容
AddContentLine: 添加填充內容并換行
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/20470.html
標籤:C#
上一篇:winform前端框架設計
