在Java中逐行读取docx文件

在Java中逐行读取docx文件,java,apache-poi,docx4j,Java,Apache Poi,Docx4j,我正在尝试使用ApachePOI或docx4j解析docx文件,但我需要逐行解析文本,以便按原样存储它。我还没有找到一种方法来实现这一点,而不是段落文本。你能给我提供一个文档、链接、解决方案或任何可以帮助我的东西吗?因为我还没有找到任何可以给我一个实际解决方案的东西 提前谢谢 使用DOCX4J,您可以使用此代码打印每个docx文本元素,也许它对您的目的有用: public static void main(String[] args) throws Exception{ TestPri

我正在尝试使用ApachePOI或docx4j解析docx文件,但我需要逐行解析文本,以便按原样存储它。我还没有找到一种方法来实现这一点,而不是段落文本。你能给我提供一个文档、链接、解决方案或任何可以帮助我的东西吗?因为我还没有找到任何可以给我一个实际解决方案的东西


提前谢谢

使用DOCX4J,您可以使用此代码打印每个docx文本元素,也许它对您的目的有用:

public static void main(String[] args) throws Exception{

    TestPrintLines test = new TestPrintLines(); 
    String inputfilepath = System.getProperty("user.dir") + "/";
    File file = new File(inputfilepath+"yourFile.docx");
    WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(file);
    List<Object> texts= getAllelementObjects(wordMLPackage.getMainDocumentPart(),Text.class);
    test.printLines(texts);
}

static public  List<Object> getAllelementObjects(Object obj,Class<?> toSearch) {
    List<Object> result = new ArrayList<Object>();
    if (obj instanceof JAXBElement)
        obj = ((JAXBElement<?>) obj).getValue();

    if (obj.getClass().equals(toSearch))
        result.add(obj);
    else if (obj instanceof ContentAccessor) {
        List<?> children = ((ContentAccessor) obj).getContent();
        for (Object child : children) {
            result.addAll(getAllelementObjects(child, toSearch));
        }

    }
    return result;
}

static public void printLines(List<Object> objectsList){
    for(int i = 0; i<objectsList.size(); i++) {         
        Object text = objectsList.get(i);
        Text textElement = (Text) text;
        System.out.println(textElement.getValue());
    }
}
publicstaticvoidmain(字符串[]args)引发异常{
TestPrintLines test=新的TestPrintLines();
字符串inputfilepath=System.getProperty(“user.dir”)+“/”;
File File=新文件(inputfilepath+“yourFile.docx”);
WordprocessingMLPackage wordMLPackage=WordprocessingMLPackage.load(文件);
列表文本=GetAllegementObjects(wordMLPackage.getMainDocumentPart(),Text.class);
测试。打印行(文本);
}
静态公共列表GetAllegementObjects(对象对象,类到搜索){
列表结果=新建ArrayList();
if(JAXBELENT的obj实例)
obj=((JAXBElement)obj.getValue();
if(obj.getClass().equals(toSearch))
结果:添加(obj);
else if(ContentAccessor的obj实例){
List children=((ContentAccessor)obj.getContent();
for(对象子对象:子对象){
addAll(getAllegementObjects(child,toSearch));
}
}
返回结果;
}
静态公共无效打印行(列表对象列表){

对于使用DOCX4J的(int i=0;i),您可以使用此代码打印每个docx文本元素,也许它可以用于您的目的:

public static void main(String[] args) throws Exception{

    TestPrintLines test = new TestPrintLines(); 
    String inputfilepath = System.getProperty("user.dir") + "/";
    File file = new File(inputfilepath+"yourFile.docx");
    WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(file);
    List<Object> texts= getAllelementObjects(wordMLPackage.getMainDocumentPart(),Text.class);
    test.printLines(texts);
}

static public  List<Object> getAllelementObjects(Object obj,Class<?> toSearch) {
    List<Object> result = new ArrayList<Object>();
    if (obj instanceof JAXBElement)
        obj = ((JAXBElement<?>) obj).getValue();

    if (obj.getClass().equals(toSearch))
        result.add(obj);
    else if (obj instanceof ContentAccessor) {
        List<?> children = ((ContentAccessor) obj).getContent();
        for (Object child : children) {
            result.addAll(getAllelementObjects(child, toSearch));
        }

    }
    return result;
}

static public void printLines(List<Object> objectsList){
    for(int i = 0; i<objectsList.size(); i++) {         
        Object text = objectsList.get(i);
        Text textElement = (Text) text;
        System.out.println(textElement.getValue());
    }
}
publicstaticvoidmain(字符串[]args)引发异常{
TestPrintLines test=新的TestPrintLines();
字符串inputfilepath=System.getProperty(“user.dir”)+“/”;
File File=新文件(inputfilepath+“yourFile.docx”);
WordprocessingMLPackage wordMLPackage=WordprocessingMLPackage.load(文件);
列表文本=GetAllegementObjects(wordMLPackage.getMainDocumentPart(),Text.class);
测试。打印行(文本);
}
静态公共列表GetAllegementObjects(对象对象,类到搜索){
列表结果=新建ArrayList();
if(JAXBELENT的obj实例)
obj=((JAXBElement)obj.getValue();
if(obj.getClass().equals(toSearch))
结果:添加(obj);
else if(ContentAccessor的obj实例){
List children=((ContentAccessor)obj.getContent();
for(对象子对象:子对象){
addAll(getAllegementObjects(child,toSearch));
}
}
返回结果;
}
静态公共无效打印行(列表对象列表){

对于(int i=0;我认为你的问题在概念上有问题。Word文档中的换行符取决于实际布局(页面大小、字体大小和类型等)。也就是说,段落文本可能会被所有库视为一行文本。实际上,我看不到任何选项(除了呈现文档和进行一些OCR或类似操作)这样做。也许您可以一行一行地分享您试图通过此解析实现的目标,以便有人可能提供另一种解决方案。我认为您的问题存在概念上的问题。Word文档中的换行将取决于实际布局(页面大小、字体大小和类型等)。也就是说,一个段落的文本可能会被周围的所有库视为一行文本。实际上,我看不到任何选项(除了呈现文档和进行OCR或类似操作)这样做。也许你可以一行一行地分享你试图通过解析实现的目标,这样可能有人会提供另一种解决方案。