關於pageoffice寫入寫出例子(抄襲)


 

PageOffice--實現用戶自定義Word模板

導讀: 在涉及到word文檔生成的項目中,一般采用編程將數據填充到word模板中生成文件的實現方式,如果模板由開發人員自己設計,那么編程填充數據是相對容易實現的;但如果用戶希望可以自己修改模板或自己定義新模板,並且又不需要開發人員針對新模板重寫代碼,那么應該使用怎樣的技術來實現這種需求呢?本文就此問題展開論述。

在實際的開發過程中,針對導出生成word文檔的需求,都是用程序填充數據到word模板中來實現的。所謂模板也就是標記了數據位置和字體段落樣式的Word文件。一般來說,模板中的數據可以分為兩種:一種是一對一的,一個數據在模版中對應一個數據位置,比如一個模板只需要使用“部門、姓名、原因、天數、日期”5個數據,每個數據只需要在文件中使用一次,如下圖模板所示:

1710

用戶定義模板時可以使用全部數據,也可以使用5個數據中的任意4個、3個甚至1個,但模板中數據標簽的數量總是這個集合的子集。

另一種是一對多,一個數據在同一個模版中可以使用一次,也可以使用多次。例如下圖的介紹信的模板,每一個數據都需要在文件中出現兩次。

1711

如果一個項目系統中所有的模板都是固定的,那么只需要在系統開發過程中由開發人員和用戶一起把模板做好,之后,開發人員根據業務邏輯編寫程序,給模板中的數據位置填充具體的數據即可實現,但在實際的應用中,很多時候不是這樣的,最終用戶還是希望能自己隨時新建和修改模板,以滿足不斷變化的業務需求,如果每次模板的變化都需要和開發人員一起來完成,那么這個項目就永遠不會完工。
為了滿足用戶的這一需求,在項目中就需要提供一個模板制作和管理的模塊,又為了讓程序可以控制和識別用戶定義模板中的數據位置,那么就需要開發人員來制作一個約定,讓最終用戶在新建或編輯模板時必須按照約定來制作模板。那么應該如何約定呢? PageOffice提供的解決方案就是使用書簽和特殊格式的文本來對文檔中需要插入數據的位置做標記。

第一種方法使用書簽來標記數據位置。Word文檔中插入書簽的方法:把光標定位到需要標記數據位置的地方,點Word菜單中的“插入”-“書簽”,就會彈出一個標題為“書簽”的對話框,輸入新書簽的名稱,書簽名可以包含數字但中間不能有空格,用PageOffice開發的時候不推薦使用中文命名書簽名。注意:如果新插入位置或新對象采用的是已有的書簽名,原有的書簽將自動取消,所以使用書簽來標記數據位置的話,肯定是一個數據對應模板中一個位置的一對一模式。
在使用PageOffice開發的過程中,為了避免出現與用戶自己定義的書簽出現沖突,要求插入的書簽名稱必須以“PO_”開頭。注意是字母o,不是數字0。書簽名是不區分大小寫的也可以寫成“po_”。在PageOffice的概念里提到的數據區域,本質上就是書簽,但是只有“po_”開頭的書簽才叫數據區域(DataRegion),請大家注意這點。

第二種方法就是使用特殊格式的文本來標記數據位置,比如說:【合同日期】、【##合同日期##】、[合同日期]……等等。使用書簽標記數據位置有一個明顯的缺點,同一個書簽名稱在一個word文檔中只能出現一次,也就是說一個數據區域在文檔中肯定是唯一的,但是很多時候模版中需要多處位置使用同樣的數據變量,例如上面舉例使用的“合同日期”可能就需要在一個合同中多個位置出現,使用數據區域肯定是無法滿足需求的,但是使用特殊格式的文本來標記就沒有這種限制了。

在PageOffice的概念里,這種【合同日期】、【##合同日期##】、[合同日期]……等等特殊格式的文本都可以被認為是數據標簽(DataTag),同一個數據標簽可以在一份文件中多個位置出現多次,動態填充數據標簽生成文件的時候,同一個數據標簽都會被同樣的數據替換。

注意:【合同日期】和【##合同日期##】是兩個不同的數據標簽,同一個數據標簽一定要是文本格式完全一致,比如:【##合同日期##】和【##合同日期##】雖然字體顏色和大小都不一樣,但是文本內容是完全一樣的,就被認為是同一個數據標簽,所以在模版制作的時候定義數據標簽是很簡單的,只需要插入同樣格式的文本就可以了。

雖然以上的兩點約定已經定好了,但是讓用戶在編輯模版的時候使用office自身的功能來制作和編輯模版,還是步驟繁瑣、困難重重,制作的模板也容易出現一些問題,為此,PageOffice提供了定義模板的接口,由開發人員使用程序預先定義好用戶可以使用的數據區域和數據標簽,當用戶編輯模版的時候,給用戶彈出一個數據區域和數據標簽的選擇窗口,用戶只需要選擇使用這些數據區域和數據標簽插入到word模版中,設置好數據的段落格式、字體、樣式、顏色等等。這樣以來,不但處理好了約定的問題,而且使得用戶自定義模板的操作更加簡單快捷。

一、 使用PageOffice提供的編輯模版功能:

PageOffice給開發人員提供了定義模版的接口DefineDataRegion和DefineDataTag方法,

  • PageOffice.WordWriter.WordDocument.Template.DefineDataRegion
  • PageOffice.WordWriter.WordDocument.Template.DefineDataTag

  1. 使用DefineDataRegion定義數據區域,例如Java代碼如下:
  1.  
    WordDocument doc = new WordDocument();
  2.  
    doc.getTemplate().defineDataRegion( "Name", "[ 姓名 ]");
  3.  
    doc.getTemplate().defineDataRegion( "Address", "[ 地址 ]");
  4.  
    doc.getTemplate().defineDataRegion( "Tel", "[ 電話 ]");
  5.  
    doc.getTemplate().defineDataRegion( "Phone", "[ 手機 ]");
  6.  
    doc.getTemplate().defineDataRegion( "Sex", "[ 性別 ]");
  7.  
    doc.getTemplate().defineDataRegion( "Age", "[ 年齡 ]");
  8.  
    doc.getTemplate().defineDataRegion( "Email", "[ 郵箱 ]");
  9.  
    doc.getTemplate().defineDataRegion( "QQNo", "[ QQ號 ]");
  10.  
    doc.getTemplate().defineDataRegion( "MSNNo", "[ MSN號 ]");

或者用ASP.NET開發的話,代碼如下:

  1.  
    PageOffice.WordWriter.WordDocument doc = new PageOffice.WordWriter.WordDocument();
  2.  
    doc.Template.DefineDataRegion( "Name", "[ 姓名 ]");
  3.  
    doc.Template.DefineDataRegion( "Address", "[ 地址 ]");
  4.  
    doc.Template.DefineDataRegion( "Tel", "[ 電話 ]");
  5.  
    doc.Template.DefineDataRegion( "Phone", "[ 手機 ]");
  6.  
    doc.Template.DefineDataRegion( "Sex", "[ 性別 ]");
  7.  
    doc.Template.DefineDataRegion( "Age", "[ 年齡 ]");
  8.  
    doc.Template.DefineDataRegion( "Email", "[ 郵箱 ]");
  9.  
    doc.Template.DefineDataRegion( "QQNo", "[ QQ號 ]");
  10.  
    doc.Template.DefineDataRegion( "MSNNo", "[ MSN號 ]");

開發人員用服務器端程序定義好用戶可使用的數據區域,用戶在客戶端編輯模版的時候就可以使用這些數據區域。注意,這里的代碼中不需要寫PO_ 開頭,PageOffice會自動添加這個前綴。用戶編輯模版時看到的數據區域管理窗口,如下圖所示:

1712

左側“待添加數據區域”列表是可以用戶目前可以使用的數據區域,右側“已添加數據區域”列表是文檔中已經添加的數據區域。此窗口的實現代碼已經由PageOffice封裝完畢,無需開發人員自己寫復雜的js+html代碼去實現,並且此窗口中內容的樣式是可以修改的,如果對那些樣式不太滿意,只需要對此窗口html代碼的樣式做簡單的調整即可。用戶編輯數據區域時的效果,如下圖所示:

1713

  1. 使用DefineDataTag定義數據標簽,例如Java的代碼如下:
  1.  
    WordDocument doc = new WordDocument();
  2.  
    doc.getTemplate().defineDataTag( "{ 甲方 }");
  3.  
    doc.getTemplate().defineDataTag( "{ 乙方 }");
  4.  
    doc.getTemplate().defineDataTag( "{ 擔保人 }");
  5.  
    doc.getTemplate().defineDataTag( "【 合同日期 】");
  6.  
    doc.getTemplate().defineDataTag( "【 合同編號 】");

或者用ASP.NET開發的代碼如下:

  1.  
    PageOffice.WordWriter.WordDocument doc = new PageOffice.WordWriter.WordDocument();
  2.  
    doc.Template.DefineDataTag( "{ 甲方 }");
  3.  
    doc.Template.DefineDataTag( "{ 乙方 }");
  4.  
    doc.Template.DefineDataTag( "{ 擔保人 }");
  5.  
    doc.Template.DefineDataTag( "【 合同日期 】");
  6.  
    doc.Template.DefineDataTag( "【 合同編號 】");

開發人員用服務器端程序定義好用戶可使用的數據標簽,用戶在客戶端編輯模版的時候就可以使用這些數據標簽。用戶編輯模版時看到的數據標簽管理窗口,如下圖所示:

1714

同數據區域一樣,對此窗口的實現代碼,PageOffice也已經封裝完畢,無需開發人員自己寫復雜的js+html代碼去實現,並且此窗口中內容的樣式是可以修改的,如果對那些樣式不太滿意,只需要簡單的調整一下此窗口html代碼中的樣式即可。開發人員只管編寫程序給數據標簽賦值對應的數據,用戶自己定義模版的樣式、數據位置和數據的多少,用戶可以使用全部的數據區域,也可以只使用部分, PageOffice在生成文件的時候,會自動忽略沒有使用的數據標簽,而不需要開發人員做任何代碼的調整。

與數據區域的管理不同的是,由於數據標簽在文件中不是唯一的,所以不管在文件中添加了多少個數據標簽,在數據標簽管理窗口中的數據標簽都是不會減少的。

二. 使用PageOffice.WordWriter 命名空間中的對象填充數據到Word模版,動態生成文檔:

  • PageOffice.WordWriter.WordDocument.OpenDataRegion 方法
  • PageOffice.WordWriter.WordDocument.OpenDataTag 方法

開發人員只需要使用上面的兩個方法,針對word模版編寫程序,給所有的數據區域和數據標簽賦值相應的數據即可,無需關心模版中到底使用了多少個數據區域和數據標簽,那些Word模版中從來沒有使用過的數據區域和數據標簽,PageOffice會自動忽略,而無需開發人員做任何代碼的修改,從而完美實現用戶自定義模板的需求。

Java開發的賦值代碼如下:

  1.  
    WordDocument doc = new WordDocument();
  2.  
    doc.openDataRegion( "Name").setValue("張三");
  3.  
    doc.openDataRegion( "Age").setValue("21");
  4.  
    ……
  5.  
    doc.openDataTag( "{ 甲方公司名稱 }").setValue("微軟中國總部");
  6.  
    doc.openDataTag( "{ 乙方公司名稱 }").setValue( "北京幻想科技公司");
  7.  
    ……
  8.  
    poCtrl.setWriter(doc);

ASP.NET開發的賦值代碼如下,

  1.  
    PageOffice.WordWriter.WordDocument doc = new PageOffice.WordWriter.WordDocument();
  2.  
    doc.OpenDataRegion( "Name").Value = "張三";
  3.  
    doc.OpenDataRegion( "Age").Value = "21";
  4.  
    ……
  5.  
    doc.OpenDataTag( "{ 甲方公司名稱 }").Value = "微軟中國總部";
  6.  
    doc.OpenDataTag( "{ 乙方公司名稱 }").Value = "北京幻想科技公司";
  7.  
    ……
  8.  
    PageOfficeCtrl1.SetWriter(doc);

詳細請參考PageOffice開發包里Samples4中的相關示例演示:
二、30、用戶自定義模板中數據區域(DataRegion)的位置(專業版、企業版)
二、31、用戶自定義模板中數據標簽(DataTag)的位置(專業版、企業版)
三、12、實現“用戶自定義Word模板”動態生成文件(專業版、企業版)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM