分享JACOB做word范例

我使用的版本如下:测试正常
Windows XP Professional SP2
jacob_1.9 (jacob.dll需放在windows/system32底下)
JDK 1.5
Tomcat 5.0.27

以下是我写的程序 
 
package  com.chttl.ia.audit;
 
import  com.jacob.activeX. * ;
import  com.jacob.com. * ;
import  java.util. * ;
import  java.text.SimpleDateFormat;
import  java.sql.Timestamp;
import  com.chttl.ia.util.Tool;
 
public   class  WordExtractor  extends  java.awt.Panel
{
     
// 建立一個word物件
      private  ActiveXComponent MsWordApp  =   null ;
 
     
// 建立兩個word組件
      private  Dispatch document  =   null ;
     
private  Dispatch selection  =   null ;
 
     
// 建構子
      public  WordExtractor()
     {
         
super ();
     }
     
 
     
/**
     * 開啟word檔案
     *
     * 
@param  makeVisible 顯示不顯示(true:顯示;false:不顯示)
     *
     
*/
     
public   void  openWord( boolean  makeVisible)
     {
           
// 打開word(如果word未開啟時)
            if  (MsWordApp  ==   null )
           {
                  MsWordApp 
=   new  ActiveXComponent( " Word.Application " );
           }
 
           
// 設置word是可見或不可見(true:顯示;false:不顯示)
           Dispatch.put(MsWordApp,  " Visible " , new  Variant(makeVisible));
     }
 
     
/**
     * 建立word的文本內容
     *
     
*/
     
public   void  createNewDocument()
     {
           
// 建立一個Dispatch物件
           Dispatch documents  =  Dispatch.get(MsWordApp, " Documents " ).toDispatch();
           document 
=  Dispatch.call(documents, " Add " ).toDispatch();
     }
 
     
/**
     * 格式化時間字串
     *
     *
@param  date_str 原始時間字串
     *
@return  修改後的字串
     * 
     
*/
     
public  String ReplaceDateStr(String date_str)
     {
           String str 
=   "" ;
           String[] date_str_arr 
=  Tool.splitString(date_str, " - " );
 
           
if (date_str_arr.length  >   0 )
           {
               str 
=  date_str_arr[ 0 +   " / "   +  date_str_arr[ 1 +   " / "   +  date_str_arr[ 2 ];
           }
           
else
           {
               str 
=  date_str;
           }
 
           
return  str;
     }
 
     
     
/**
     * 寫入資料到word中
     *
     * 
@param  title 本文標題
     * 
@param  textToInsertarr 要寫入的內容陣列集合
     *
     
*/
     
public   void  insertText(String title,ArrayList textToInsertarr)
     {
           selection 
=  Dispatch.get(MsWordApp, " Selection " ).toDispatch();                                                // 輸入內容需要的物件
 
           Dispatch alignment 
=  Dispatch.get(selection,  " ParagraphFormat " ).toDispatch();                                // 行列格式化需要的物件
           Dispatch font  =  Dispatch.get(selection,  " Font " ).toDispatch();                                                // 字型格式化需要的物件
           Dispatch font1  =  Dispatch.get(selection,  " Font " ).toDispatch();                                               // 字型格式化需要的物件
           
// Dispatch image = Dispatch.get(selection, "InLineShapes").toDispatch();                                     // 放入圖片需要的物件
           
// String mm = "D:"+File.separator+"IRMAS_COMBINE"+File.separator+"images"+File.separator+"mis_login.jpg";    // 圖片來源路徑
 
           
// 格式化時間
           java.util.Date ddate  =   new  Date();
           SimpleDateFormat sdf2 
=   new  SimpleDateFormat( " dd-MM月-yy " , java.util.Locale.TRADITIONAL_CHINESE);  // oracle要的時間格式
           Timestamp ts1  =   new  Timestamp(ddate.getTime());
           String date_str 
=  (ts1.toString()).substring( 0 , 10 );
           String result_str 
=  ReplaceDateStr(date_str);        // 格式化後的時間
 
           
// 文件標題
           
// Dispatch.call(selection, "TypeParagraph");                   // 空一行段落
           Dispatch.put(alignment,  " Alignment " " 1 " );                     // (1:置中 2:靠右 3:靠左)
           Dispatch.put(font1,  " Bold " " 1 " );                              // 字型租體
           Dispatch.put(font1,  " Color " " 1,0,0,0 " );                       // 字型顏色(1,0,0,0=>紅色  1,1,0,0=>棕色)
           
// Dispatch.put(font, "Italic", "1");                           // 字型斜體
           Dispatch.call(selection,  " TypeText " , title);                   // 寫入標題內容
 
           
// 標題格行
           Dispatch.call(selection,  " TypeParagraph " );                     // 空一行段落
           Dispatch.put(alignment,  " Alignment " " 3 " );                     // (1:置中 2:靠右 3:靠左)
           Dispatch.put(selection, " Text " , "          " );
           Dispatch.call(selection, 
" MoveDown " );                          // 游標往下一行
 
           
// 插入圖片
            /*
           Dispatch.call(selection, "TypeParagraph");
           Dispatch.put(alignment, "Alignment", "2");                    //(1:置中 2:靠右 3:靠左)
           Dispatch.call(image, "AddPicture", mm);                       //寫入圖片
           
*/
 
          
/* --------不輸入到表格時------------
          //主要內容(即參數陣列中的值)
          for(int i=0;i<textToInsertarr.size();i++)
          {
               String arr_tostr = textToInsertarr.get(i).toString();
               String arr_substr = arr_tostr.substring(1,arr_tostr.length()-1);    //去掉前後'['和']'
               String[] arr_split = arr_substr.split(",");                         //字串陣列(在分隔每個元素值)

               for(int j=0;j<arr_split.length;j++)
               {
                      //主要內容
                          Dispatch.call(selection, "TypeParagraph");
                      Dispatch.put(selection, "Text", arr_split[j]);               //寫入word的內容
                          Dispatch.put(font, "Bold", "0");                             //字型租體(1:租體 0:取消租體)
                      //Dispatch.put(font, "Italic", "1");                         //字型斜體(1:斜體 0:取消斜體)
                      //Dispatch.put(font, "Underline", "1");                      //文字加底線(1:加底線 0:不加底線)
                      Dispatch.call(selection, "MoveDown");                        //游標往下一行(才不會蓋過上一輸入的位置)
               }

               //每寫入一次資料空一行,以區隔之用
                  Dispatch.call(selection, "TypeParagraph");
               Dispatch.put(selection, "Text", "                   ");
               Dispatch.call(selection, "MoveDown");                               //游標往下一行
          }
          
*/
 
             
// 依參數內的陣列元素總個數計算要輸入到表格的列數
                 int  all_count  =   0 ;
             
for ( int  p = 0 ;p < textToInsertarr.size();p ++ )
             {
                 String arr_tostr 
=  textToInsertarr.get(p).toString();                // 先將陣列元素轉成字串
                    String arr_substr  =  arr_tostr.substring( 1 ,arr_tostr.length() - 1 );     // 去掉前後'['和']'
                 String[] arr_split  =  arr_substr.split( " , " );                          // 字串陣列(在分隔每個元素值)
                  int  num  =  arr_split.length;
 
                 all_count 
+=  num;    // 累加個數
               }
 
             
// 建立表格
                Dispatch tables  =  Dispatch.get(document,  " Tables " ).toDispatch();
             Dispatch range 
=  Dispatch.get(selection,  " Range " ).toDispatch();
             Dispatch newTable 
=  Dispatch.call(tables, " Add " ,range, new  Variant(all_count), new  Variant( 1 ), new  Variant( 1 )).toDispatch();   // 設置列數,欄數,表格外框寬度
                Dispatch.call(selection,  " MoveRight " );                               // 游標移到最右邊
                putTxtToCell(font,alignment, 1 , 1 , 1 ,textToInsertarr);                  // 表格內寫入內容(從第1列第1欄開始)
             
// mergeCell(1,1,1,all_count,1);                                      // 表格合併(從第1列第1欄開始,第X列第1欄結束)
             
// autoFitTable();                                                    // 自動調整表格
 
             
int  count  =   0 ;          // 計算合併表格後的列數遞增(例如:前五列合併成一列,則往下繼續合併時,要考慮加上合併後的那一列)
             
// 依陣列筆數合併表格
                 for ( int  k = 0 ;k < textToInsertarr.size();k ++ )
             {
                  String arr_tostr 
=  textToInsertarr.get(k).toString();                // 先將陣列元素轉成字串
                      String arr_substr  =  arr_tostr.substring( 1 ,arr_tostr.length() - 1 );     // 去掉前後'['和']'
                  String[] arr_split  =  arr_substr.split( " , " );                          // 字串陣列(在分隔每個元素值)
                   int  num  =  arr_split.length;
 
                  
if (k  ==   0 )
                  {   
// 第一次合併時,num值不需加前一列
                          mergeCell( 1 ,k + 1 , 1 ,num, 1 );
                      count
++ ;
                  }
                  
else
                  {   
// 第二次合併之後,num值要加前一列,以此類推...
                      mergeCell( 1 ,k + 1 , 1 ,num + count, 1 );
                      count
++ ;
                  }
             }
 
           
// 取消選擇(因為最後insert進去的文字會顯示反白,所以要取消)
           Dispatch.call(selection, " MoveRight " , new  Variant( 1 ), new  Variant( 1 ));
 
           
// 插入頁首頁尾
             
// 取得活動窗體對象
             Dispatch ActiveWindow  =  MsWordApp.getProperty( " ActiveWindow " ).toDispatch();
           
// 取得活動窗格對象
             Dispatch ActivePane  =  Dispatch.get(ActiveWindow, " ActivePane " ).toDispatch();
           
// 取得視窗對象
             Dispatch View  =  Dispatch.get(ActivePane, " View " ).toDispatch();
 
           
// 9是設置頁首(游標所在處)
           Dispatch.put(View, " SeekView " , " 9 " );                    // 頁首中的資訊
             Dispatch.put(alignment,  " Alignment " " 2 " );            // (1:置中 2:靠右 3:靠左)
           Dispatch.put(selection, " Text " ,result_str);            // 初始化時間
 
           
// 10是設置頁尾(游標所在處)
           Dispatch.put(View, " SeekView " , " 10 " );                   // 頁尾中的資訊
             Dispatch.put(alignment,  " Alignment " " 1 " );            // (1:置中 2:靠右 3:靠左)
           Dispatch.put(selection, " Text " , new  Variant( 1 ));        // 初始化從1開始
     }
 
    
/**
    * 合併表格
     *
    * 
@param  tableIndex 表格起始點
    * 
@param  fstCellRowIdx 開始列
    * 
@param  fstCellColIdx 開始欄
    * 
@param  secCellRowIdx 結束列
    * 
@param  secCellColIdx 結束欄
    
*/
    
public   void  mergeCell( int  tableIndex,  int  fstCellRowIdx,  int  fstCellColIdx, int  secCellRowIdx,  int  secCellColIdx)
    {
        
//  所有表格
          Dispatch tables  =  Dispatch.get(document,  " Tables " ).toDispatch();
 
        
//  要填充的表格
          Dispatch table  =  Dispatch.call(tables,  " Item " new  Variant(tableIndex)).toDispatch();
        Dispatch fstCell 
=  Dispatch.call(table,  " Cell " , new  Variant(fstCellRowIdx),  new  Variant(fstCellColIdx)).toDispatch();
        Dispatch secCell 
=  Dispatch.call(table,  " Cell " , new  Variant(secCellRowIdx),  new  Variant(secCellColIdx)).toDispatch();
 
        Dispatch.call(fstCell, 
" Merge " , secCell);
    }
 
     
/**
    * 在指定的表格裡填入內容
     *
    * 
@param  tableIndex 表格起始點
    * 
@param  cellRowIdx 第幾列
    * 
@param  cellColIdx 第幾欄
    * 
@param  txt 內容字串陣列
    
*/
    
public   void  putTxtToCell(Dispatch font,Dispatch alignment, int  tableIndex,  int  cellRowIdx,  int  cellColIdx,ArrayList txt)
    {
         
//  所有表格
           Dispatch tables  =  Dispatch.get(document,  " Tables " ).toDispatch();
 
        
// 主要內容(即參數陣列中的值)
         for ( int  i = 0 ;i < txt.size();i ++ )
        {
            String arr_tostr 
=  txt.get(i).toString();                            // 先將陣列元素轉成字串
               String arr_substr  =  arr_tostr.substring( 1 ,arr_tostr.length() - 1 );     // 去掉前後'['和']'
            String[] arr_split  =  arr_substr.split( " , " );                          // 字串陣列(在分隔每個元素值)
 
            
for ( int  j = 0 ;j < arr_split.length;j ++ )
            {
                
//  要填入的表格(對表格列依序填入內容),cellRowIdx++代表從第一列開始
                   Dispatch table  =  Dispatch.call(tables,  " Item " new  Variant(tableIndex)).toDispatch();
                Dispatch cell 
=  Dispatch.call(table,  " Cell " new  Variant(cellRowIdx ++ ), new  Variant(cellColIdx)).toDispatch();
                
// Dispatch.put(cell, "Height",new Variant(1));     // 設置列高
                   Dispatch.call(cell,  " Select " );
 
                   
// 主要內容
                      
// Dispatch.call(selection, "TypeParagraph");                         // 空一行段落
                      
// Dispatch.put(alignment, "Alignment", "3");                         // (1:置中 2:靠右 3:靠左)
                    if (j == 0 )
                   {
                        Dispatch.put(selection, 
" Text " , arr_split[j]);                       // 寫入word的內容
                             Dispatch.put(font,  " Bold " " 1 " );                                     // 字型租體(1:租體 0:取消租體)
                        Dispatch.put(font,  " Color " " 1,1,1,1 " );                              // 字型顏色
                             
// Dispatch.put(font, "Italic", "1");                                 // 字型斜體(1:斜體 0:取消斜體)
                        
// Dispatch.put(font, "Underline", "1");                              // 文字加底線
                             Dispatch.call(selection,  " MoveDown " );                                // 游標往下一行(才不會輸入蓋過上一輸入位置)
                   }
                   
else
                   {
                        
if (arr_split[j].indexOf( " " !=   - 1 )
                        {
                            String str 
=  arr_split[j].replaceAll( " " , "          " );             // 作字串隔行對齊用
 
                            Dispatch.call(selection, 
" TypeParagraph " );                           // 空一行段落
                                 Dispatch.put(alignment,  " Alignment " " 3 " );                           // (1:置中 2:靠右 3:靠左)
                            Dispatch.put(selection,  " Text " , str);                                // 寫入word的內容
                                 Dispatch.put(font,  " Bold " " 0 " );                                     // 字型租體(1:租體 0:取消租體)
                            Dispatch.put(font,  " Color " " 1,1,1,0 " );                              // 字型顏色
                                 
// Dispatch.put(font, "Italic", "1");                                 // 字型斜體(1:斜體 0:取消斜體)
                            
// Dispatch.put(font, "Underline", "1");                              // 文字加底線
                                 Dispatch.call(selection,  " MoveDown " );                                // 游標往下一行(才不會輸入蓋過上一輸入位置)
                        }
                        
else
                        {
                            Dispatch.put(selection, 
" Text " , arr_split[j]);                       // 寫入word的內容
                                 Dispatch.put(font,  " Bold " " 0 " );                                     // 字型租體(1:租體 0:取消租體)
                            Dispatch.put(font,  " Color " " 1,1,1,0 " );  // 字型顏色
                                 
// Dispatch.put(font, "Italic", "1");                                 // 字型斜體(1:斜體 0:取消斜體)
                            
// Dispatch.put(font, "Underline", "1");                              // 文字加底線
                                 Dispatch.call(selection,  " MoveDown " );  // 游標往下一行(才不會輸入蓋過上一輸入位置)
 
                        }
                   }
 
            }
 
            
// 每寫入一次資料空一行,以區隔之用
             /*
            Dispatch.call(selection, "TypeParagraph");
            Dispatch.put(selection, "Text", "                   ");
            Dispatch.call(selection, "MoveDown");                               //游標往下一行
            
*/
        }
    }
 
     
/**
     * 自動調整表格
      *
     
*/
     
public   void  autoFitTable()
     {
          Dispatch tables 
=  Dispatch.get(document,  " Tables " ).toDispatch();
 
          
int  count  =  Dispatch.get(tables,  " Count " ).toInt();    // word中的表格數量
 
          
for ( int  i = 0 ;i < count;i ++ )
          {
              Dispatch table 
=  Dispatch.call(tables,  " Item " new  Variant(i + 1 )).toDispatch();
              Dispatch cols 
=  Dispatch.get(table,  " Columns " ).toDispatch();
              Dispatch.call(cols, 
" AutoFit " );
          }
    }
 
    
/**
    * 另存檔案
     *
    * 
@param  filename 要儲存的檔案名稱
     *
    
*/
     
public   void  saveFileAs(String filename)
     {
           Dispatch.call(document,
" SaveAs " ,filename);
     }
 
     
/**
     * 列印word文件
      *
     
*/
     
public   void  printFile()
     {
           Dispatch.call(document,
" PrintOut " );
     }
 
     
/**
     * 關閉文本內容(如果未開啟word編輯時,釋放ActiveX執行緒)
     *
     
*/
     
public   void  closeDocument()
     {
           
//  0 = 沒有儲存改變
           
//  -1 = 有儲存改變
           
//  -2 = 提示儲存改變
           Dispatch.call(document,  " Close " new  Variant( 0 ));
           document 
=   null ;
     }
 
     
/**
     * 關閉word(如果未開啟word編輯時,釋放ActiveX執行緒)
     *
     
*/
     
public   void  closeWord()
     {
           Dispatch.call(MsWordApp,
" Quit " );
           MsWordApp 
=   null ;
           document 
=   null ;
     }
 
}

wordtest.jsp

<% @ page contentType = " text/html;charset=MS950 "   %>
<% @ page  import = " java.io.* " %>
<% @ page  import = " java.util.* " %>
<% @ page  import = " java.util.Date " %>
<% @ page  import = " java.text.DateFormat " %>
<% @ page  import = " java.text.SimpleDateFormat " %>
<% @ page  import = " java.text.* " %>
<% @ page  import = " java.sql.* " %>
<% @ page  import = " org.apache.poi.util.* " %>
<% @ page  import = " java.io.File " %>
<% @ page  import = " com.jacob.com.* " %>
<% @ page  import = " com.jacob.activeX.* " %>
<% @ page  import = " com.chttl.ia.audit.WordExtractor "   %>
 
<%
String title 
=   " 報告內容 " ;
 
// 這邊的字串內容模擬從資料庫所撈取
ArrayList all_arr  =   new  ArrayList();    
ArrayList arr1 
=   new  ArrayList();  
ArrayList arr2 
=   new  ArrayList();  
ArrayList arr3 
=   new  ArrayList();  
ArrayList arr4 
=   new  ArrayList();  
ArrayList arr5 
=   new  ArrayList(); 
 
arr1.add(
" 一、1111詳察具復之   " );
arr1.add(
" 總公司>董事長室回覆:申覆處理或申述查明情由與 " );
arr1.add(
" 擬辦: 本案擬結案。 1111 " );
 
arr2.add(
" 二、金融商品買賣作業1詳察具復之 " );
arr2.add(
" 總公司>董事長室回覆:申覆處理或申述查明情由與 " );
arr2.add(
" 擬辦: 本案擬結案。 tttt申覆處理或申述查明情由 " );
 
arr3.add(
" 三、CI-101(金融商品買賣作業):詳察具復之 " );
arr3.add(
" 總公司>董事長室回覆:申覆處理或申述查明情由與 " );
arr3.add(
" 擬辦: 本案擬結案。 31231 " );
 
arr4.add(
" 四、標題詳察具復之  " );
arr4.add(
" 總公司>董事長室回覆:申覆處理或申述查明情由與 " );
arr4.add(
" 擬辦: 本案擬結案。擬辦 " );
 
arr5.add(
" 五、12312 " );
arr5.add(
" 擬辦: 本案擬結案。碁碁碁珮許功蓋 " );
 
all_arr.add(arr1);
all_arr.add(arr2);
all_arr.add(arr3);
all_arr.add(arr4);
all_arr.add(arr5);
 
String otFile 
=  request.getRealPath( " / " ) + " TEST " + File.separator + " sample " + File.separator + " TestDoc.doc " ;                 // 目標文件位置
WordExtractor word = new  WordExtractor();      // 建立一個WordExtractor物件
word.openWord( true );                         // 設定word開啟顯示
word.createNewDocument();                    // 建立文件內容
word.insertText(title,all_arr);              // 要insert入word的內容集合
word.saveFileAs(otFile);                     // 檔案另存
// word.printFile();                          // 檔案列印(會直接印,頁尾未能格式化後才印)
%>

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值