.net下實現(xiàn)Word動態(tài)填加數(shù)據(jù)打印
更新時間:2007年04月16日 00:00:00 作者:
今天研究了一下.net下實現(xiàn)Word動態(tài)填加數(shù)據(jù)打印的做法,覺得頗有收獲~
以前做過Excel相關(guān)的東西,所以對OFFICE的COM有一些了解,很順利的找到了需要引用的COM和其幫助文檔~具體做法是在引用里添加 COM --------Microsoft word 11.0 object library, 然后引入命名空間:
using WordApplication = Microsoft.Office.Interop.Word.Application;
using Document = Microsoft.Office.Interop.Word.Document;
using Bookmark = Microsoft.Office.Interop.Word.Bookmark;
具體實現(xiàn)代碼:
WordApplication word = null;
/**//// <summary>
/// 實現(xiàn)動態(tài)添加數(shù)據(jù)打印預(yù)覽
/// </summary>
/// <param name="path">word模板路徑</param>
/// <param name="adStu">調(diào)劑學(xué)生相關(guān)信息對象</param>
private void PrintPreview(string path, AdStuInfo adStu)
...{
if (word == null)
...{
word = new WordApplication();
}
object oMissing = System.Reflection.Missing.Value; //這個東西找了好久,不像操作Excel,用Type.mising還不行.
object path1 = (object)path;
Document doc = null;
doc = word.Documents.OpenOld(ref path1, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing);
替換書簽#region 替換書簽
object markName = "報考單位";
Bookmark bm = doc.Bookmarks.get_Item(ref markName);
bm.Range.Text = adStu.SiSch;
markName = "報考專業(yè)";
bm = doc.Bookmarks.get_Item(ref markName);
bm.Range.Text = adStu.SiMa;
markName = "考生姓名1";
bm = doc.Bookmarks.get_Item(ref markName);
bm.Range.Text = adStu.Name;
markName = "考生編號";
bm = doc.Bookmarks.get_Item(ref markName);
bm.Range.Text = adStu.No;
markName = "調(diào)劑專業(yè)";
bm = doc.Bookmarks.get_Item(ref markName);
bm.Range.Text = adStu.AdMa;
markName = "打印時間";
bm = doc.Bookmarks.get_Item(ref markName);
bm.Range.Text = GetDate().ToString();
markName = "考生姓名2";
bm = doc.Bookmarks.get_Item(ref markName);
bm.Range.Text = adStu.Name;
#endregion
word.Visible = true;
doc.PrintPreview();
}
具體解釋: 首先有一個模板.doc文件,在該模板內(nèi)需要添加數(shù)據(jù)的地方設(shè)置成書簽,.net程序所要的事情就是打開該模板,用具體需要添加的值去替換先設(shè)定好的書簽,然后返回Word的打印預(yù)覽頁面,思路很簡單~但是問題也是有滴~~
這個程序是做打印我們學(xué)院研究生辦發(fā)復(fù)試生調(diào)卷函用的,但是表格是從學(xué)校研究生部那弄來的,主要還是在那邊蓋的章~所以就只能用那些表格來打,但是給的表格留的空實在太小,沒法用同樣的字體給打上去,怪就只能怪研究生部根本沒想到我們這會有這個高級的東西~~哈哈~估計一般都是手工填的~~~明天過去不知道具體要怎么弄,估計這東西在打印調(diào)卷函是發(fā)揮不出作用了~~~留著以后肯定有用!
4月16日修改:
幾天前做的仔細想想還是有需要改進的地方.我前面做的只是一個個文檔的填,一個個的打印,考慮資料上百個以后這樣做打印機的打印的效率不高,因為每次只給打印機發(fā)送一個打印任務(wù),它接受下一個任務(wù)是需要時間的,所以我的想法是把需要打印的文檔生成成一個文檔,這樣不但可以保存文檔,還可以只要向打印機發(fā)送一個任務(wù)就可以打印資料了,NB的打印機打印速度是很快的~~
把具體的操作寫下來吧~思路是打開兩個word文檔(當(dāng)然,生成過程中全不可見),一個還是按照前面說的替換書簽,但是不做打印處理,而是復(fù)制到另外一個文檔(該文檔存儲所有已經(jīng)生成好的表格,最后得到的就是這個word文檔,打印或者保存隨便他們).具體的代碼如下:
先在using里引如:
using Range = Microsoft.Office.Interop.Word.Range;
doc.Content.Copy(); //復(fù)制doc里的內(nèi)容,doc是每次做替換書簽的文檔.
object save = false;
doc.Close(ref save, ref oMissing, ref oMissing); //關(guān)閉doc.
Range range = printDoc.Content; //全中printDoc里的全部內(nèi)容,printDoc是目標保存文檔.
range.Collapse(ref oMissing); //確定粘貼的位置,其實這個地方我想放一個有效的參數(shù),把粘貼的位置設(shè)為文檔的末尾,而不是用默認的文檔的最前面,但是幫助文檔是VB寫的,傳了一個Direction:=wdCollapseEnd的東東,我弄半天沒弄出來,虧我還是懂VB的~~傷心~以至于我都忘了傳個空值過去,卡了老半天!謝謝某人和我發(fā)了幾條短信,就一下把我打通了~
range.Paste(); //粘貼到目標位置,一次填寫就完成了.
雖然是這樣,但是在生成目標文檔的時候也是很耗資源的,我看了一下那程序竟然占了100多M的內(nèi)存!!而且~~而且~~我的機器在前兩次實驗都沒頂住!死機了~~當(dāng)時真是在抓狂了~誰知道后來幾次竟然無聲無息的成功!可是想想學(xué)院那機器能扛住么~~哎繼續(xù)優(yōu)化吧!這次把界面也改了一下,上面的生成在一的單獨線程里,以至于主界面不會像死了樣的,而且在主界面上還做了個顯示生成狀態(tài)的Lable,這東西還真管用~后面兩次的實驗,看著已生成數(shù)目超過前兩次死機的數(shù)目~~緊張的心情緩解了~再看著數(shù)目超過100~~高興了~最后慢慢接近完成數(shù)目時~~興奮得抓狂!!!!!哈~~
哎~廢話多了點~有用的就那么幾行代碼~
以前做過Excel相關(guān)的東西,所以對OFFICE的COM有一些了解,很順利的找到了需要引用的COM和其幫助文檔~具體做法是在引用里添加 COM --------Microsoft word 11.0 object library, 然后引入命名空間:
復(fù)制代碼 代碼如下:
using WordApplication = Microsoft.Office.Interop.Word.Application;
using Document = Microsoft.Office.Interop.Word.Document;
using Bookmark = Microsoft.Office.Interop.Word.Bookmark;
具體實現(xiàn)代碼:
WordApplication word = null;
/**//// <summary>
/// 實現(xiàn)動態(tài)添加數(shù)據(jù)打印預(yù)覽
/// </summary>
/// <param name="path">word模板路徑</param>
/// <param name="adStu">調(diào)劑學(xué)生相關(guān)信息對象</param>
private void PrintPreview(string path, AdStuInfo adStu)
...{
if (word == null)
...{
word = new WordApplication();
}
object oMissing = System.Reflection.Missing.Value; //這個東西找了好久,不像操作Excel,用Type.mising還不行.
object path1 = (object)path;
Document doc = null;
doc = word.Documents.OpenOld(ref path1, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing);
替換書簽#region 替換書簽
object markName = "報考單位";
Bookmark bm = doc.Bookmarks.get_Item(ref markName);
bm.Range.Text = adStu.SiSch;
markName = "報考專業(yè)";
bm = doc.Bookmarks.get_Item(ref markName);
bm.Range.Text = adStu.SiMa;
markName = "考生姓名1";
bm = doc.Bookmarks.get_Item(ref markName);
bm.Range.Text = adStu.Name;
markName = "考生編號";
bm = doc.Bookmarks.get_Item(ref markName);
bm.Range.Text = adStu.No;
markName = "調(diào)劑專業(yè)";
bm = doc.Bookmarks.get_Item(ref markName);
bm.Range.Text = adStu.AdMa;
markName = "打印時間";
bm = doc.Bookmarks.get_Item(ref markName);
bm.Range.Text = GetDate().ToString();
markName = "考生姓名2";
bm = doc.Bookmarks.get_Item(ref markName);
bm.Range.Text = adStu.Name;
#endregion
word.Visible = true;
doc.PrintPreview();
}
這個程序是做打印我們學(xué)院研究生辦發(fā)復(fù)試生調(diào)卷函用的,但是表格是從學(xué)校研究生部那弄來的,主要還是在那邊蓋的章~所以就只能用那些表格來打,但是給的表格留的空實在太小,沒法用同樣的字體給打上去,怪就只能怪研究生部根本沒想到我們這會有這個高級的東西~~哈哈~估計一般都是手工填的~~~明天過去不知道具體要怎么弄,估計這東西在打印調(diào)卷函是發(fā)揮不出作用了~~~留著以后肯定有用!
4月16日修改:
幾天前做的仔細想想還是有需要改進的地方.我前面做的只是一個個文檔的填,一個個的打印,考慮資料上百個以后這樣做打印機的打印的效率不高,因為每次只給打印機發(fā)送一個打印任務(wù),它接受下一個任務(wù)是需要時間的,所以我的想法是把需要打印的文檔生成成一個文檔,這樣不但可以保存文檔,還可以只要向打印機發(fā)送一個任務(wù)就可以打印資料了,NB的打印機打印速度是很快的~~
把具體的操作寫下來吧~思路是打開兩個word文檔(當(dāng)然,生成過程中全不可見),一個還是按照前面說的替換書簽,但是不做打印處理,而是復(fù)制到另外一個文檔(該文檔存儲所有已經(jīng)生成好的表格,最后得到的就是這個word文檔,打印或者保存隨便他們).具體的代碼如下:
先在using里引如:
using Range = Microsoft.Office.Interop.Word.Range;
doc.Content.Copy(); //復(fù)制doc里的內(nèi)容,doc是每次做替換書簽的文檔.
object save = false;
doc.Close(ref save, ref oMissing, ref oMissing); //關(guān)閉doc.
Range range = printDoc.Content; //全中printDoc里的全部內(nèi)容,printDoc是目標保存文檔.
range.Collapse(ref oMissing); //確定粘貼的位置,其實這個地方我想放一個有效的參數(shù),把粘貼的位置設(shè)為文檔的末尾,而不是用默認的文檔的最前面,但是幫助文檔是VB寫的,傳了一個Direction:=wdCollapseEnd的東東,我弄半天沒弄出來,虧我還是懂VB的~~傷心~以至于我都忘了傳個空值過去,卡了老半天!謝謝某人和我發(fā)了幾條短信,就一下把我打通了~
range.Paste(); //粘貼到目標位置,一次填寫就完成了.
雖然是這樣,但是在生成目標文檔的時候也是很耗資源的,我看了一下那程序竟然占了100多M的內(nèi)存!!而且~~而且~~我的機器在前兩次實驗都沒頂住!死機了~~當(dāng)時真是在抓狂了~誰知道后來幾次竟然無聲無息的成功!可是想想學(xué)院那機器能扛住么~~哎繼續(xù)優(yōu)化吧!這次把界面也改了一下,上面的生成在一的單獨線程里,以至于主界面不會像死了樣的,而且在主界面上還做了個顯示生成狀態(tài)的Lable,這東西還真管用~后面兩次的實驗,看著已生成數(shù)目超過前兩次死機的數(shù)目~~緊張的心情緩解了~再看著數(shù)目超過100~~高興了~最后慢慢接近完成數(shù)目時~~興奮得抓狂!!!!!哈~~
哎~廢話多了點~有用的就那么幾行代碼~
相關(guān)文章
將FreeTextBox做成控件添加到工具箱中的具體操作方法
以下是對將FreeTextBox做成控件添加到工具箱中的具體操作方法進行了詳細的介紹,需要的朋友可以過來參考下2013-09-09FileUpload上傳圖片前實現(xiàn)圖片預(yù)覽功能(附演示動畫)
FileUpload控件上傳圖片前實現(xiàn)預(yù)覽,很多網(wǎng)友都希望實現(xiàn)這樣的功能,本人總結(jié)了一下,感興趣的朋友可以參考一下,希望對您有幫助2013-01-01jQuery AJax調(diào)用asp.net webservers的實現(xiàn)代碼
代碼是轉(zhuǎn)載來的 本來今天寫的 但是到現(xiàn)在還沒搞懂,慚愧啊2009-12-12asp.net core為IHttpClientFactory添加動態(tài)命名配置
某些時候我們需要為HttpClient動態(tài)配置一些東西, 例如證書等, 例如服務(wù)是一個回調(diào)服務(wù), 而被回調(diào)方采用了自定義的https(即自定義證書),本文就將講述如何實現(xiàn)這種需求2021-06-06VB.NET生成隨機串或隨機數(shù)字的方法總結(jié)
本篇文章主要介紹了VB.NET生成隨機串或隨機數(shù)字的方法,具有一定的參考價值,有需要的可以了解一下。2016-11-11ASP.NET實現(xiàn)基于Forms認證的WebService應(yīng)用實例
這篇文章主要介紹了ASP.NET實現(xiàn)基于Forms認證的WebService應(yīng)用,實例分析了使用Forms進行WebService身份認證的相關(guān)技巧與實現(xiàn)方法,需要的朋友可以參考下2015-05-05asp.net 通過aspnetpager為DataList分頁
今天整了半天才把DataList的分頁搞定,下面把我的設(shè)計過程給大家講講2009-12-12HttpWebRequest和HttpWebResponse用法小結(jié)
在每個系統(tǒng)出寫入報告錯誤代碼(找個合理的理由,比如系統(tǒng)免費升級) -> 自家服務(wù)器接收并處理錯誤報告 -> 反饋用戶(解決掉BUG就行,不要太聲揚)2011-09-09