程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C# 利用WORD模板和標簽(bookmark) 批量生成WORD,

C# 利用WORD模板和標簽(bookmark) 批量生成WORD,

編輯:C#入門知識

C# 利用WORD模板和標簽(bookmark) 批量生成WORD,


前言:

由於對C#操作WORD不熟悉,也就留下這麼一篇水文,別吐糟...=_=|||

利用Microsoft.Office.Interop.Word (2003版也就11版)——因為部分客戶端還是用Office2003,所以保險起見應該引入低一點的版本

我的需求很簡單,從DataTable裡面循環取數據批量生成Word文檔,解決方案是利用Word模板.dot插入書簽並保存為程序使用的模板,

用C#打開word模板修改書簽的值並批量生成Word.

遇到的問題:

我的思路是打開模板,然後循環修改書簽內容,每循環一次生成一個.doc,實際上遇到的問題是當第二次給書簽賦值(比如bookMark.Range.Text="2013-4-24")發現是+=的操作,也就是循環第二次書簽的值是"2013-4-242013-4-24",我的理解是因為模板沒有關閉,所以對書簽實際上是進行了兩次【插入】的操作,而非我們理解的【賦值】,一個可以實現的做法是先關閉dot再打開重新進行一次賦值,但是由於耗時超長所以我毫不猶豫拋棄這種做法,平均下來幾乎一秒鐘才生成一個WORD,當然Win764bit效率要低一點。——因為我後來才發現生成的軟件在32bit 的xp運行效率比62bit 的WIN7高不少,而我在虛擬機運行的效率竟然比32bit 的宿主xp更快,可能虛擬機只裝了office2003和framework2.0的緣故,即便如此,在xp下效率還是很低。問題回到如何不關閉模板文件的情況下,循環插入生成WORD。

解決方案:

[csharp] view plaincopy
  1. object[] oBookMark = new object[8];  
  2.             oBookMark[0] = "Date";//省略賦值  用來記錄書簽名稱  
  3.    Word.Range[] rng = new Word.Range[8];  
  4.    string[] bookMarkName = new string[8];  
  5.             for (int i = 0; i < 8; i++)  
  6.             {  
  7.                 rng[i] = oDoc.Bookmarks.get_Item(ref oBookMark[i]).Range;//獲取書簽對象賦值給我們已經定義的數組用來下面循環體的插入  
  8.                 bookMarkName[i] = oDoc.Bookmarks.get_Item(ref oBookMark[i]).Name;//獲取書簽名稱好書簽對象賦值給我已經定義好的rng和oBookMark  
  9.             }  
  10.   
  11. //循環體  
  12.  for (int i = dt.Rows.Count-1; i >= 0; i--)  
  13.             {  
  14.                 rng[0].Text = dt.Rows[i]["日期"].ToString();//賦值多個書簽0~8  
  15.                 for (int j = 0; j < 8; j++)  
  16.                 {  
  17.                     oDoc.Bookmarks.Add(bookMarkName[j], rng[j]);//此處直接插入即可,替代了原來的書簽,位置不變...囧  
  18.                     //也就是說Add操作實際上並不是隨意插入書簽,而是替代了原有書簽,這樣子每次就可以重新賦值了  
  19.                 }  
  20. //這裡保存oDoc 用Save方法  
  21. }  


思路獲取書簽對象和書簽名稱賦值給我們已經定義的oBook和rng,然後做一個插入的操作,而非修改文檔本身的書簽值

 

 

這個方法跟剛剛搜到的文章《如何利用書簽向word文檔讀取或寫入數據[C#]》提及的“由於附值以後書簽自動消除,為了以後便於修改,需要把書簽再自動生成一個”

似乎是一樣的實現,也懶得細想,另外我還利用Selection.InsertFile方法把生成的文檔合並為一個文件(由於這個方法只能附加文件而不能從doc對象中提取頁面進行附加,所以又有了大量的打開Word操作,兩個Word.exe在後台進行,看著也蛋疼,果不其然的使程序更加耗時間),但是一個文件多個頁面還是比多個單頁的文檔討人喜歡。還是歡迎吐糟吧。。=_=||||


C語言裡面,這個符號(->)是什,怎使用?

這是結構體指針中的一個符號,給你寫個程序解釋一下吧,例如:
#include<stdio.h>
struct STU //定義一個結構體
{
int num;
}stu;
int main()
{
struct STU *p; //定義一個結構體指針
p=stu; //p指向stu這個結構體變量
stu.num=100; //給結構體成員num附個初值
printf("%d",p->num); //輸出stu中的num的值
return;
}
看到了吧,->的作法就是在引用結構體中的變量!!
形式如:p->結構體成員(如p->num)
他的作用相當於stu.num或(*p).num
不知道這樣解釋你明不明白、、、、、不懂了call我,O(∩_∩)O~
望采納。
 

C語言裡面,這個符號(->)是什,怎使用?

這是結構體指針中的一個符號,給你寫個程序解釋一下吧,例如:
#include<stdio.h>
struct STU //定義一個結構體
{
int num;
}stu;
int main()
{
struct STU *p; //定義一個結構體指針
p=stu; //p指向stu這個結構體變量
stu.num=100; //給結構體成員num附個初值
printf("%d",p->num); //輸出stu中的num的值
return;
}
看到了吧,->的作法就是在引用結構體中的變量!!
形式如:p->結構體成員(如p->num)
他的作用相當於stu.num或(*p).num
不知道這樣解釋你明不明白、、、、、不懂了call我,O(∩_∩)O~
望采納。
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved