【问题标题】:Read data from the Word document in .docx format as each field and save it in database in Java从 Word 文档中读取 .docx 格式的数据作为每个字段,并用 Java 将其保存在数据库中
【发布时间】:2018-06-26 12:09:12
【问题描述】:

它是否能够从 .docx 文件中读取数据作为字段,以便能够保存在数据库中?需要使用Java。 例如,我们有像 CV 这样的 Word 表单文档,我们应该读取每个字段,例如(姓名、姓氏、年龄、职位、日期),以便能够将其保存在数据库中,而不是在一个大文本列中,而是作为一个单独的字段. Java 中存在 2 个库,其中一个是 Apache POI,另一个是 docx4j,但它提供了一种将数据保存在数据库的一个文本字段中的一大块的方法。 但它应该将每个字段作为一个元素分开。

我已经这样做了,以便将数据保存在一个大块中。 由于结果数据仅以这种方式保存

我还没有找到任何解决方法。 请给点建议。

【问题讨论】:

  • 我正在想象您在 Word 文件中有特定的分隔符(例如示例图像中粗体字段标题旁边的粗体冒号),用于分隔哪些字段应拆分为表格行。如果是这样,您使用 POI 解析文件中的文本然后使用 Java 的 Scanner 解析文本有什么问题?
  • 文本已成功解析,但如您在图片上看到的那样保存在一个大块中,但我需要将每个分隔符解析为唯一字段并保存在每一行的数据库中。跨度>
  • 是的,我明白了。您可以使用扫描仪和正则表达式按任何定界符或多个定界符进行拆分,因此如果您获取该字符串然后像使用文本文件一样解析它,那么您从 POI 获取单个字符串这一事实似乎并不重要......在接下来的几个小时内我无法访问 Word,但我会在可以的时候提供一个示例……至少除非你告诉我我的提议不是你想要做的
  • 但是需要解析.docx文件。
  • 这甚至不需要扫描仪,POI 库非常简单。检查我的答案,它应该可以满足您的需求。

标签: java apache-poi docx4j


【解决方案1】:

您需要使用您提供的输入示例解析 Microsoft Word 文档并获取每一行的特定值。

首先,这是我使用的测试文件的格式,我将它放在我的本地目录中,它遵循与您的示例图像相同的格式:

员工

姓名:鲍勃

姓:史密斯

年龄: 28

职位:开发人员

日期: 2018 年 6 月 26 日

import java.io.File;
import java.io.FileInputStream;
import java.util.LinkedList;
import java.util.List;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;

    public class Test {

    public static void main(String[] args) {
        //exampleFile is the layout file you provided with data added for testing
        List<String> values = parseWordDocument("exampleFile.docx");
        
        for(String s: values)
            System.out.println(s);
    }
    
    public static List<String> parseWordDocument(String documentPath) {
        FileInputStream fInput = null;
        XWPFDocument document = null;
        List<String> parsedValues = null;
        
        try {
            File file = new File(documentPath);
            
            fInput = new FileInputStream(file.getAbsolutePath());
            document = new XWPFDocument(fInput);
            
            //getParagraphs() will grab each paragraph for you
            List<XWPFParagraph> paragraphs = document.getParagraphs();

            parsedValues = new LinkedList<>();
           
            for (XWPFParagraph para : paragraphs) {
                //remove the title
                if(!para.getText().equals("Employee")) {
                    //here is where you want to parse your line to get needed values
                    String[] splitLine = para.getText().split(":");
                    //based on example input file [1] is the value you need
                    parsedValues.add(splitLine[1]);
                }
            }
            
            fInput.close();
            document.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return parsedValues;
    }

}

这样,我从 parseWordDocument() 创建的列表中得到的输出是:

鲍勃

史密斯

28

开发者

2018 年 6 月 26 日

所以现在您可以简单地获取返回的列表并循环(而不是打印出值)并创建适当的 SQLite 查询。

【讨论】:

  • 非常感谢这个例子!
  • 不用担心,很高兴它有帮助!
猜你喜欢
  • 1970-01-01
  • 2016-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多