Java解析 WORD

使用POI与Jacob处理Word文档

一、POI对Word处理

1、读取Word

1、读取Excel

3、下载地址:http://www.apache.org/dyn/closer.cgi/poi/dev/

代码实现:

package com.qianyan.test;  
  
import java.io.File;  
import java.io.FileInputStream;  
  
import org.apache.poi.hssf.usermodel.HSSFCell;  
import org.apache.poi.hssf.usermodel.HSSFChart.HSSFSeries;  
import org.apache.poi.hssf.usermodel.HSSFDateUtil;  
import org.apache.poi.hssf.usermodel.HSSFRow;  
import org.apache.poi.hssf.usermodel.HSSFSheet;  
import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
import org.apache.poi.hwpf.extractor.WordExtractor;  
import org.junit.Ignore;  
import org.junit.Test;  
  
  
public class TestPOI {  
      
    @Test  
//  @Ignore  
    public void testRead1(){  
          
        File file=new File("e:/test.doc");  
        try {  
            FileInputStream fis=new FileInputStream(file);  
            WordExtractor  wordExtractor=new WordExtractor(fis);  
            System.out.println(wordExtractor.getText());  
        } catch (Exception e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
          
          
          
    }  
    /** 
     * 分段读操作 
     */  
    @Test   
    @Ignore  
    public void testPara(){  
          
        File file=new File("e:/test.doc");  
        try {  
            FileInputStream fis=new FileInputStream(file);  
            WordExtractor  wordExtractor=new WordExtractor(fis);  
            String [] paras=wordExtractor.getParagraphText();  
            for(int i=0;i<paras.length;i++){  
                System.out.print("第"+i+"段-->");  
                System.out.println(paras[i]);  
            }  
          
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
          
    }  
      
    /** 
     * 一个Excel文件的层次:Excel文件-->工作表-->行-->单元格 对应到POI中,为:wordbook->sheet->cess 
     */  
      
    /** 
     * 读取excel,遍历各个小格获取其中信息 
     * <p/> 
     * <p/> 
     * 注意:1.sheet,以0开始,以workbook.getNumberOfSheets()-1结束 
     * 2.row,以0开始(getFirstRowNum),以getLastRowNum结束 
     * 3.cell,*以0开始(getFirstCellNum),以getLastCellNum结束 
     */  
    @Test  
    @Ignore  
    public void testReadExcel() throws Exception {  
        //创建对Excel工作簿文件的引用  
        String fileToBeReade = "e:/test.xls";  
        HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(fileToBeReade));  
        System.out.println("===SheetNum===" + workbook.getNumberOfSheets()); //获取sheet数  
        if(null != workbook.getSheetAt(0)){  
            HSSFSheet aSheet = workbook.getSheetAt(0); //获得一个sheet  
            System.out.println("+++getFirstRowNum+++"  
                    + aSheet.getFirstRowNum());  
            System.out.println("+++getLastRowNum+++"  
                    + aSheet.getLastRowNum());  
            for(int rowNumOfSheet = 0; rowNumOfSheet <= aSheet.getLastRowNum(); rowNumOfSheet++){  
                if(null != aSheet.getRow(rowNumOfSheet)){  
                    HSSFRow aRow = aSheet.getRow(rowNumOfSheet);  
                    //System.out.println(">>>getFirstCellNum<<<"  
                    //      + aRow.getFirstCellNum());  
                    //System.out.println(">>>getLastCellNum<<<"  
                    //      + aRow.getLastCellNum());  
                    System.out.println("row" + rowNumOfSheet + "->");  
                    for(int cellNumOfRow = 0; cellNumOfRow <= aRow.getLastCellNum() + 1; cellNumOfRow++){  
                        if(null != aRow.getCell(cellNumOfRow)){  
                            HSSFCell aCell =  aRow.getCell(cellNumOfRow);  
                            int cellType = aCell.getCellType();  
                            String strCell = "";  
                            //System.out.println(" " + cellType + " ");  
                            switch(cellType){  
                                case HSSFCell.CELL_TYPE_NUMERIC:{  //Numeric  
                                    if(HSSFDateUtil.isCellDateFormatted(aCell)){  
                                        //如果是Date类型则,取得该Cell的Date值  
                                        strCell = HSSFDateUtil.getJavaDate(aCell.getNumericCellValue()).toString();  
                                        System.out.println(strCell + " ");  
                                    }else{  
                                        strCell = aCell.getNumericCellValue() + "";  
                                        System.out.println(strCell + " ");  
                                    }  
                                }  
                                break;  
                                case HSSFCell.CELL_TYPE_STRING://String  
                                    strCell = aCell.getRichStringCellValue().toString();  
                                    System.out.println(strCell+ " ");  
                                break;  
                                  
                                default:  
                                    System.out.println("");//其他格式的数据  
                                  
                            }  
                        }  
                    }  
                }  
            }  
        }  
    }  
      
} 


二、使用Jacob来处理Word文档

1、官方的解释是Java COM Bridge,即java和com组件间的桥梁

2、com一般表现为dll或exe等二进制文件

3、office是建立在windows平台之上的,本身是一个软件,除了他自己提供的宏似乎没有什么能对他进行直接的操作;在windows平台上为了解决像这样的不同应用软件,通信缺乏通用api问题,推出了com的解决方案;我们使用dll中的一组或多组相关的函数存取组件数据,总的合成为借口具体到每个细节的实现成为方法;如果我们需调用借口里的方法,唯一的途径就是调用指向借口的指针所以总的来说是使用就是dll完成api的转换。

4、Jacob的就是通过一个借口来操作word的activex对象。现在的版本是1.15

5、下载地址:http://sourceforge.net/projects/jacob-project/

代码实现:(注意:除添加jar包,还需jacob-1.17-M2-x64.dll jacob-1.17-M2-x84.dll两个文件复制到C:WINDOWS\SYSTEM32目录或者工程目录下)

package com.qianyan.test;  
  
import com.jacob.activeX.ActiveXComponent;  
import com.jacob.com.Dispatch;  
import com.jacob.com.Variant;  
  
public class TestJacob {  
  
      
    public static void extractDoc(String inputFIle, String outputFile) {   
           boolean flag = false;   
             
           // 打开Word应用程序   
           ActiveXComponent app = new ActiveXComponent("Word.Application");   
           try {   
              // 设置word不可见   
              app.setProperty("Visible", new Variant(false));   
              // 打开word文件   
              Dispatch doc1 = app.getProperty("Documents").toDispatch();   
              Dispatch doc2 = Dispatch.invoke(   
                    doc1,   
                    "Open",   
                    Dispatch.Method,   
                    new Object[] { inputFIle, new Variant(false),   
                          new Variant(true) }, new int[1]).toDispatch();   
              // 作为txt格式保存到临时文件 Variant(7)  
              // 作为html格式保存到临时文件 Variant(8)  
              Dispatch.invoke(doc2, "SaveAs", Dispatch.Method, new Object[] {   
                    outputFile, new Variant(8) }, new int[1]);   
              // 关闭word   
              Variant f = new Variant(false);   
              Dispatch.call(doc2, "Close", f);   
              flag = true;   
           } catch (Exception e) {   
              e.printStackTrace();   
           } finally {   
              app.invoke("Quit", new Variant[] {});   
           }   
           if (flag == true) {   
              System.out.println("Transformed Successfully");   
           } else {   
              System.out.println("Transform Failed");   
           }   
        }   
    public static void main(String[] args) {  
        extractDoc("E:/test.doc","E:/test.htm");  
    }  
  
}  


### Java解析Word文档的方法和库推荐 在Java中,解析Word文档可以通过多种方法和库实现。以下是几种常用的方法和库,并结合相关引用进行详细说明。 #### 1. 使用Apache POI Apache POI是一个开源的Java库,用于操作Microsoft Office文件格式,包括Word文档。它支持`.doc`(二进制格式)和`.docx`(基于XML的格式)文件。POI提供了丰富的API来加载、读取和修改Word文档的内容[^3]。 - **依赖配置**: ```xml <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.16</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.16</version> </dependency> ``` - **功能特点**: - 加载Word文档:通过`XWPFDocument`类加载`.docx`文件[^1]。 - 获取文档结构:可以获取段落、表格、图片等元素[^1]。 - 示例代码: ```java import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFParagraph; import java.io.FileInputStream; import java.util.List; public class WordParser { public static void main(String[] args) throws Exception { FileInputStream fis = new FileInputStream("example.docx"); XWPFDocument document = new XWPFDocument(fis); // 获取所有段落 List<XWPFParagraph> paragraphs = document.getParagraphs(); for (XWPFParagraph paragraph : paragraphs) { System.out.println(paragraph.getText()); } document.close(); fis.close(); } } ``` #### 2. 使用Aspose.Words Aspose.Words是一个商业库,提供强大的文档处理能力。它支持多种文件格式,包括Word、PDF等,并且具有较高的性能和稳定性[^2]。 - **优势**: - 支持复杂的文档结构,如页眉页脚、脚注、图片等。 - 提供跨平台支持,适用于Java和.NET环境。 - 文档转换功能强大,可以将Word文档转换为PDF、HTML等多种格式。 - **限制**: - 需要购买许可证才能使用完整功能。 - 不支持某些高级功能,例如公式处理[^2]。 #### 3. 使用Jacob Jacob是一个Java与COM交互的桥接库,可以通过调用Microsoft Word应用程序来解析Word文档。虽然它可以定位图片和公式,但在实际应用中存在一些限制。 - **优点**: - 可以直接调用Word宏命令。 - 支持复杂文档结构的处理。 - **缺点**: - 需要在Windows环境下运行。 - 对于Word自带公式的解析能力有限。 #### 4. 其他方法 如果上述方法无法满足需求,还可以考虑以下替代方案: - **Docx4j**:一个专注于`.docx`文件的开源库,支持复杂的文档结构和样式。 - **OpenOffice API**:通过Apache OpenOffice提供的API进行文档解析,但需要额外安装OpenOffice软件。 ### 总结 对于大多数场景,推荐使用Apache POI作为首选库,因为它开源、功能丰富且易于集成。如果需要更高的性能或更复杂的功能,可以考虑Aspose.Words,但需注意其商业授权限制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值