之前在做一個C#項目需要對word文檔的表格進行數據填充,然后代碼調用打印。如何用C#對word文檔填充文字網上已經很多實例了,我就不多重復了,只提一點,找不到“文字型窗體域”的(我反正是找一下午沒找到),可以網上下一個有文字型窗體域的word模板,復制黏貼就可以了。這里重點說針對表格的插入圖片,這個網上找不到,完全我自己摸索出來的。有更好的方法歡迎指正。
using Spire.Doc;
using Spire.Doc.Documents;
using Spire.Doc.Fields;//需要引用spire.doc的dll文件,網上很容易搜到
class Docx
{
private string filePath="C:\\Users\Administrator\\Desktop\\機動車考試成績單.doc";
private DocPicture dp;//doc圖片
private Document Doc;//模板文件
private byte[] head;//存儲人物頭像的byte數組
//讀取word文檔
private void ReadDoc()
{
Doc = new Document(filePath, FileFormat.Docx);//讀取word文檔模板
head=ReadHead();//如何讀取圖片獲取byte[]此處就不寫詳細代碼了,網上有范例,我的另一遍博客里也有教程
}
//填充word文檔
private void FillDoc()
{
dp = Doc.Sections[0].Tables[0].Rows[0].Cells[4].Paragraphs[0].AppendPicture(head);
//此處說說具體的參數
//Section[0]————word文檔頁數列表, [0]表示取第一頁
//Tables[0]————當前頁的表格列表,當一頁存在多個表格時,按照從上往下的順序排列,[0]表示取第一個表格
//Rows[0]————當前所取表格的行的列表,按照從上往下的順序排列,[0]表示取第一行
//Cell[4]————當前表格所取行的格子列表,按照從左往右順序排列,[4]表示取第五格,對於一個大格橫跨多行的,取該格子最上部所在行的行數
//Paragraphs[0]————取當前格的段落,默認0不用管它
//終上所述,上面代碼表意思就是,取第一頁的第一個表格的第一行的第五個格子,將頭像圖片插入進去
dp1.Height = 122; //設置圖像的高
dp1.Width = 100;//設置圖像的寬
dp1.VerticalPosition = 2; //設置圖像的停靠位置方式
dp1.TextWrappingStyle = TextWrappingStyle.InFrontOfText;//設置圖像的文字環繞方式
}
//打印word文檔
private void Print()
{
PrintDialog dialog = new PrintDialog();
dialog.AllowCurrentPage = true;
dialog.AllowSomePages = true;
dialog.UseEXDialog = true;
try
{
Doc.PrintDialog = dialog;
dialog.Document = Doc.PrintDocument;
dialog.Document.Print();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
題外話,如果涉及批量的填充打印的話,反復創建Document實例再讀取模板其實是一件很耗費性能的事,這里推薦使用document.clone();方法
開局只需讀取一次doc模板,每次需要填充打印時,只需對doc模板調用.clone()方法,然后對克隆的模板進行填充,打印,釋放。
不過要注意,當文檔里的一頁上的表格超過五個時,無法克隆,調用.clone()方法時會失敗,也許是因為用的spire.doc是免費版的關系?
