Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Word文档中读取.docx格式的数据作为每个字段,并将其保存在Java数据库中_Java_Apache Poi_Docx4j - Fatal编程技术网

从Word文档中读取.docx格式的数据作为每个字段,并将其保存在Java数据库中

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

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

我这样做是为了将数据保存在一块大的文件中。 结果数据仅以这种方式保存

我还没有找到这样的方法。
您可以提出一些建议吗。

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

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

员工

名称:鲍勃

姓氏:史密斯

年龄:28岁

位置:开发者

日期:2018年6月26日

导入java.io.File;
导入java.io.FileInputStream;
导入java.util.LinkedList;
导入java.util.List;
导入org.apache.poi.xwpf.usermodel.XWPFDocument;
导入org.apache.poi.xwpf.usermodel.XWPFParagraph;
公开课考试{
公共静态void main(字符串[]args){
//exampleFile是为测试添加数据而提供的布局文件
列表值=parseWordDocument(“exampleFile.docx”);
用于(字符串s:值)
系统输出打印项次;
}
公共静态列表parseWordDocument(字符串documentPath){
FileInputStream fInput=null;
XWPFDocument document=null;
List parsedValues=null;
试一试{
文件文件=新文件(documentPath);
fInput=newfileinputstream(file.getAbsolutePath());
文件=新的XWPFDocument(fInput);
//getPages()将为您抓取每个段落
列表段落=document.getPages();
parsedValues=newLinkedList();
对于(XWPF段落:段落){
//删除标题
如果(!para.getText().equals(“Employee”)){
//这里是您想要解析行以获得所需值的地方
String[]splitLine=para.getText().split(“:”);
//根据示例,输入文件[1]是您需要的值
add(splitLine[1]);
}
}
fInput.close();
document.close();
}捕获(例外e){
e、 printStackTrace();
}
返回解析的值;
}
}
这样,我从parseWordDocument()创建的列表中得到的输出是:

鲍勃

史密斯

二十八

显影剂

2018年6月26日


因此,现在您可以简单地获取返回的列表并循环它(而不是打印出值)并创建相应的SQLite查询。

我想您在Word文件中有特定的分隔符(例如示例图像中粗体字段标题旁边的粗体冒号),用于分隔哪些字段应拆分为表行。如果是这样的话,您对POI解析文件中的文本和Java扫描仪解析文本有什么问题?文本解析成功,但它保存在一个大片段中,如图所示,但我需要将每个分隔符解析为唯一字段并保存在每行的数据库中。是的,我明白了。您可以使用Scanner和regex按任意分隔符或多个分隔符进行拆分,因此,如果您从POI获取一个字符串,然后像使用文本文件一样解析该字符串,那么从POI获取该字符串的事实似乎并不重要。。。在接下来的几个小时里,我无法访问Word,但我会提供一个我可以访问的示例…至少除非你告诉我我的建议不是你想要的,但需要解析.docx文件。这甚至不需要扫描仪,POI库非常简单。检查我的答案,它应该做你需要的。非常感谢你这个例子!不用担心,很高兴它有帮助!
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;
    }

}