分享JACOB做word范例

本文介绍了一个使用Java进行Word文档自动生成的方法,通过Jacob组件实现Word文档的创建、内容填充及格式设置等功能。该方法适用于批量生成Word报告等场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我使用的版本如下:测试正常
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();                         //檔案列印(會直接印,頁尾未能格式化後才印)
%>

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值