如何解决我的目标是将数据从可能具有随机列数的 excel 文件上传到 postgreSQL
示例:我的 excel 包含 10 列,而我的数据库有 15 列,即使有 5 个空列,它仍会上传。
我使用的代码可以上传excel,但是当单元格为空时会出错。
我使用的工具/语言(我认为它们在这里并不重要):xhtml、Java、Tomcat、PostgreSQl、Primefaces
预先感谢您的帮助。
这是我使用的代码:
public void upload() throws IOException{
String host="localhost";
String port="5432";
String db_name="postgres";
String username="postgres";
String password="postgres";
int max = 1000;
int min = 0;
String dir="C:\\Users\\User\\Desktop\\book1.xlsx";
int batchSize = 20;
Connection connection = null;
try {
long start = System.currentTimeMillis();
FileInputStream inputStream = new FileInputStream(dir);
Workbook workbook = new XSSFWorkbook(inputStream);
Sheet firstSheet = workbook.getSheetAt(0);
Iterator<Row> rowIterator = firstSheet.iterator();
try {
Class.forName("org.postgresql.Driver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
connection = DriverManager.getConnection("jdbc:postgresql://"+host+":"+port+"/"+db_name+"",""+username+"",""+password+"");
connection.setAutoCommit(false);
String sql = "INSERT INTO survey.tabledata (id,col1,col2,col3,col4,col5,col6,col7,col8,col9,col10,surveyid) VALUES (?,?,?)";
PreparedStatement statement = connection.prepareStatement(sql);
int count = 0;
//rowIterator.next(); // skip the header row
while (rowIterator.hasNext()) {
Row nextRow = rowIterator.next();
Iterator<Cell> cellIterator = nextRow.cellIterator();
while (cellIterator.hasNext()) {
Cell nextCell = cellIterator.next();
int columnIndex = nextCell.getColumnIndex();
switch (columnIndex) {
case 0:
int col1 = (int) nextCell.getNumericCellValue();
statement.setInt(1,col1);
break;
case 1:
String col2 = nextCell.getStringCellValue();
statement.setString(2,col2);
break;
case 2:
String col3 = nextCell.getStringCellValue();
statement.setString(3,col3);
break;
case 3:
String col4 = nextCell.getStringCellValue();
statement.setString(4,col4);
break;
case 4:
String col5 = nextCell.getStringCellValue();
statement.setString(5,col5);
break;
case 5:
String col6 = nextCell.getStringCellValue();
statement.setString(6,col6);
break;
case 6:
String col7 = nextCell.getStringCellValue();
statement.setString(7,col7);
break;
case 7:
String col8 = nextCell.getStringCellValue();
statement.setString(8,col8);
break;
case 8:
String col9 = nextCell.getStringCellValue();
statement.setString(9,col9);
break;
case 9:
String col10 = nextCell.getStringCellValue();
statement.setString(10,col10);
break;
case 10:
String col11 = nextCell.getStringCellValue();
statement.setString(11,col11);
break;
case 11:
int col12 = (int) nextCell.getNumericCellValue();
statement.setInt(12,col12);
break;
}
}
statement.addBatch();
if (count % batchSize == 0) {
statement.executeBatch();
}
}
// workbook.close();
// execute the remaining queries
statement.executeBatch();
connection.commit();
connection.close();
long end = System.currentTimeMillis();
System.out.printf("Import done in %d ms\n",(end - start));
} catch (IOException ex1) {
System.out.println("Error reading file");
ex1.printStackTrace();
} catch (SQLException ex2) {
System.out.println("Database error");
ex2.printStackTrace();
}
}
解决方法
它会给你一个错误,因为你正在转换一个 null 或空值。
,即使您的错误消息不在您的问题描述中,我猜您的数据库中有 null
异常。
你可以这样解决:
String col = nextCell.getStringCellValue();
if(col == null)
{
col = "";
}
statement.setString(1,col);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。