为有中文需求的客户提供多渠道中文技术支持.

Fri Feb 17, 2023 2:29 am

您好!请问最近的版本中有更简便的解决方法吗?

我在word表格的中间某一列定义了一个书签bookMark1,如附件中所示。
在实际应用过程中,我并不知道单元格的具体位置,只能根据书签bookMark1的信息,获取书签定义区域内第一个单元格的内容(即Test1),我尝试了许多方法,都无法正确获取,请问有什么方法可以获取吗?

Wang_Student
 
Posts: 5
Joined: Tue Aug 02, 2022 6:07 am

Fri Feb 17, 2023 9:48 am

您好,

感谢您的留言。
根据您的文档来看,您获取不到书签内容的主要原因是您添加的是一个不完整的书签,只包含了书签的开始而没有结尾。我这边在您原文档(附件中)的基础上修改了书签,使用下面的代码是可以获取到书签内容“Test1”,另外在使用MS Word插入书签时,要选中文字后点击插入书签,不要先建立书签在输入内容,这样很容易出现问题。

Code: Select all
String input = "data/newTest.docx";
    String output = "output/extractBookmarkText.txt";

    //Load Document
    Document doc = new Document();
    doc.loadFromFile(input);

    //Creates a BookmarkNavigator instance to access the bookmark
    BookmarksNavigator navigator = new BookmarksNavigator(doc);

    //Locate a specific bookmark by bookmark name
    navigator.moveToBookmark("bookMark1");
    TextBodyPart textBodyPart = navigator.getBookmarkContent();

    //Iterate through the items in the bookmark content to get the text
    for (int i = 0; i < textBodyPart.getBodyItems().getCount(); i++)
    {
        if (textBodyPart.getBodyItems().get(i) instanceof Paragraph)
        {
            Paragraph itemPara = (Paragraph)textBodyPart.getBodyItems().get(i);
            for (int j = 0; j < itemPara.getChildObjects().getCount(); j++)
            {
                if (itemPara.getChildObjects().get(j) instanceof TextRange)
                {
                    TextRange textrange = (TextRange)(itemPara.getChildObjects().get(j));
                    String text = textrange.getText();
                    //create a new TXT file to save the text
                    writeStringToTxt(text,output);
                }
            }
        }
    }

}
public static void writeStringToTxt(String content, String txtFileName) throws IOException {
    FileWriter fWriter= new FileWriter(txtFileName,true);
    try {
        fWriter.write(content);
    }catch(IOException ex){
        ex.printStackTrace();
    }finally{
        try{
            fWriter.flush();
            fWriter.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}


Sincerely
Abel
E-iceblue support team
User avatar

Abel.He
 
Posts: 1010
Joined: Tue Mar 08, 2022 2:02 am

Fri Feb 17, 2023 10:14 am

您好!非常感谢您的解答!

实际上,我的word文档中是包含了书签结尾的,只是书签的开头在第二行,书签的结尾在第五行。

我之前定义包含一行多列单元格的书签可以正确读取文本内容,但包含一列多行单元格的书签,好像无法准确读取书签中的文本内容。

Wang_Student
 
Posts: 5
Joined: Tue Aug 02, 2022 6:07 am

Mon Feb 20, 2023 3:20 am

您好,

感谢您的反馈。
理论上我们是不支持提取表格中跨行跨列且在书签中的文本,因为getBookmarkContent()方法的返回值是TextBodyPart,而单元格对象是无法成为TextBodyPart的,所以一般试图提取表格中跨行跨列中在书签中的文本时,程序一般会抛出异常:itemStart and itemEnd must be contained in one text body。
另外,如果您那边有成功提取到一行多列的在书签中的文本,请您提供您的代码和输入文档。我这边测试看看能不能为您提取一列多行的在书签中的文本找到相应的解决方案。提取感谢您的帮助。

Sincerely
Abel
E-iceblue support team
User avatar

Abel.He
 
Posts: 1010
Joined: Tue Mar 08, 2022 2:02 am

Return to 中文技术支持