Java 遇到空行时停止在Excel中读取

Java 遇到空行时停止在Excel中读取,java,excel,iteration,Java,Excel,Iteration,我目前有一个程序,可以读取Excel文件,并通过使用迭代器处理每张工作表中的数据,将每一行插入数据库。当我使用提供的excel文件构建和测试程序时,一切都完全按照我的预期进行。我把程序传给了我们的生产服务器,现在我们发现一个特定的文件导致程序抛出错误 SQLServerException:违反主键约束“PK_V2Product”。无法在对象“dbo.V2Product”中插入重复键。重复的键值为()。 据我了解, 重复的键值为() 表示为主键设置的值是空字符串。这告诉我迭代器已经传递了包含有形数

我目前有一个程序,可以读取Excel文件,并通过使用迭代器处理每张工作表中的数据,将每一行插入数据库。当我使用提供的excel文件构建和测试程序时,一切都完全按照我的预期进行。我把程序传给了我们的生产服务器,现在我们发现一个特定的文件导致程序抛出错误

SQLServerException:违反主键约束“PK_V2Product”。无法在对象“dbo.V2Product”中插入重复键。重复的键值为()。

据我了解,

重复的键值为()

表示为主键设置的值是空字符串。这告诉我迭代器已经传递了包含有形数据的行,并且找到了其中包含空字符串值的行。除了一些简单/黑客的东西,例如实现以下内容:

while(iterator.hasNext(){
    //Iterator runs through, building the object
    //String value = ""; //Primary Key, gets set in the workflow based on column name
    ...
    if(value == null || value.equals("null") || value.equals("")){
        continue;
    }
    ...
    //Would insert data at this point if the primary key field is not null
}
是否有任何方法可以确定工作表的其余部分是否包含包含空字符串的行和列,并结束迭代?或者,让迭代器在一行又一行空字符串中运行,直到达到a.xlsx可以拥有的最大行数,这是最好的选择吗?是否有可能创建一个计数器并实现一个条件,如果计数器达到20的值,考虑空页的其余部分并中断迭代器循环,而不造成任何无意的副作用?

关于我们正在使用的插入过程的一些信息:

preparedStatement = connection.prepareStatement("SELECT * FROM Table WHERE PrimaryKey = ?", ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
preparedStatement.setString(1, value);
ResultSet.TYPE\u滚动\u敏感,ResultSet.CONCUR\u可更新


如果结果集返回为空,则允许我们更新现有记录或插入新记录(resultSet.moveToInsertRow())。

您使用哪个api读取excel?apache poi?@Matteo是的,我们从apache poi WorkbookFactory创建工作簿对象。创建(InputStream)函数理论上rowIterator()应该理解什么时候没有更多的行或单元格(尽管我注意到有时候它对xlsx的效果要比xls好得多,xls是您正在使用的格式?)。您是否调查过问题是否来自POI读取超过最后一行,或者可能来自您的特定文件中丢失的单元格?(就像你通常说的那样)你试过阅读吗?这里有一些常用的技巧(比如比较cell.getCellType()==CellType.BLANK)。@Matteo不知道这些文档,所以谢谢你!在阅读了迭代部分之后,它看起来更像是在特定字段恰好为null或空时跳过数据库步骤。我只是觉得有点不舒服,所以我不满足于跳过它,但看起来它必须这样做。