首页 > 解决方案 > 遇到空行时停止在 Excel 中读取

问题描述

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

SQLServerException: Violation of PRIMARY KEY constraint 'PK_V2Product'. Cannot insert duplicate key in object 'dbo.V2Product'. The duplicate key value is ().

据我了解,

重复键值为 ()

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

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
}

有什么方法可以确定工作表的其余部分是否可能包含列中包含空字符串的行并结束迭代?还是让迭代器在空字符串的行和行中运行它的过程,直到我们达到 .xlsx 可以拥有的最大行数是最好的选择?是否有可能创建一个计数器并实现一个条件,如果计数器的值达到 20,则认为工作表的其余部分为空并中断迭代器循环,而不会造成任何无意的副作用?

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

preparedStatement = connection.prepareStatement("SELECT * FROM Table WHERE PrimaryKey = ?", ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
preparedStatement.setString(1, value);

ResultSet.TYPE_SCROLL_SENSITIVE、ResultSet.CONCUR_UPDATABLE

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

标签: javaexceliteration

解决方案


推荐阅读