分類  >  Web前端 >

用程序把word模板中的一個報表複製為多個表格然後填充數據(工資單的例子)

tags:    時間:2013-12-10 19:32:22
用程序把word模板中的一個表格複製為多個表格然後填充數據(工資單的例子)


在Web系統開發的時候,對word文件的內容控制需求中,會有這樣的一個需求:模板中只有一個表格,但是需要根據查詢資料庫記錄的條數填充表格。如果是一條記錄那麼就把這條記錄的數據填充到word模板的表格中;如果查詢的是多個記錄,那麼需要複製多這個這樣表格來填充數據。這個需求不是對一個表格行的添加,而是要求表格本身的複製。

實現web系統中文件的內容的動態生成使用soaoffice就可以,估計不少人都用過這個產品,一個第三方的中間件,提供的WordResponse和WordTable對象就可以控制word文檔中的內容,但是實現不了上面所說的需求,要實現上面的需求的話,還是必須用js調用soaoffice提供的office的VBA介面。WordResponse和WordTable對象應該也是soaoffice封裝了一些office的VBA介面,創建了這麼兩個對象方便開發人員調用,實現生成文件的功能而不用學習VBA,但是上面說的那個功能沒有封裝為一個什麼對象,只能開發人員自己用js調用VBA來處理了,期待他們以後封裝一下,不然學習VBA也是個麻煩事。

別拍磚,別拍磚,馬上開始……
Js調用SOAOffice提供的VBA介面的開始:SOAOffice的Document屬性,這個屬性是VBA介面的開始,就等於VBA介面中的ActiveDocument,js的寫法如下: document.getElementById("SOAOfficeCtrl").Document
VBA中的ActiveDocument可以回溯到Application對象,寫法如下:
document.getElementById("SOAOfficeCtrl").Document.Application
一旦獲取到Application對象以後,VBA中幾乎所有的對象都就可以訪問到了,對VBA了的人就不需要這裡細說了,下面只具兩個例子:
1. 給word的當前游標處添加 「Hello World」,這樣寫就可以了:
document.getElementById("SOAOfficeCtrl").Document.Application.Selection.Range.Text = 「Hello World」;
2. 全選word文件中的內容:
document.getElementById("SOAOfficeCtrl").Document.Application.Selection.WholeStory();     

實現複製表格功能的js:
function copyAll()
{
    var docApp = document.getElementById("SOAOfficeCtrl").Document.Application;
    docApp.Selection.WholeStory();      // 全選文檔的所有內容
    docApp.Selection.Copy();        // 拷貝
   
}
或者用下面的寫法,demo中用的是上面的寫法,對不起懶的不想改了,自己改改吧,嘻嘻^_^:
function copyTable()
{
    document.getElementById("SOAOfficeCtrl").Document.Tables(1).Select();
     // 選中word中的第一個表格
    document.getElementById("SOAOfficeCtrl").Document.Application.Selection.Copy(); // 拷貝
   
}
粘貼拷貝的內容js,這裡面用了不少游標移動的代碼,必須的,為了下次粘貼做準備:
function paste()
{
    var docApp = document.getElementById("SOAOfficeCtrl").Document.Application;
    docApp.Selection.MoveRight(1, 1); // 游標右移一下
    docApp.Selection.TypeParagraph(); // 換行
    docApp.Selection.Paste();      // 粘貼
    docApp.Selection.Delete(); 
}
給指定表格的指定單元格賦值的方法:
function setTableValue(tableIndex, row, col, value)
{
     var docApp = document.getElementById("SOAOfficeCtrl").Document.Application;
     docApp.ActiveDocument.Tables(tableIndex).Cell(row,col).Range.Text = value;
}
實際上就是一句代碼,給一個word表格中的一個單元格賦值的代碼如下:
document.getElementById("SOAOfficeCtrl").Document.Tables(tableIndex).Cell(row,col).Range.Text = 「Hello World」;
word中表格是按照序號排的,序號從1開始,最前面的表格序號就是1,依次類推,如果說兩個表格位置換了,那麼他們的序號也就改變了。Word中表格不好操作,應該說是用程序控制起來麻煩,因為word中的表格沒有辦法用名字命名,這是相當不好的一點,這樣的話一旦表格的位置發生改變,表格的序號就要改變,程序也需要跟著改變才行,可能這是soaoffice為什麼沒有封裝這個對象的原因吧。
下面說demo里的代碼:
Default.aspx頁使用常量,直接演示複製表格填充數據的效果,可以看看這個原理。
Default2.aspx 調用了資料庫,複製表格和填充表格數據的js也是動態生成的,看看最終的效果吧。
別說文件不能保存!是我沒寫,不是我不會做,OK?

代碼地址:http://ishare.iask.sina.com.cn/f/10696929.html

推薦閱讀文章

Bookmark the permalink ,來源:互聯網