WEB开发网
开发学院数据库DB2 使用 Apache 的 POI 和 HSSF 将 Excel 电子表格数... 阅读

使用 Apache 的 POI 和 HSSF 将 Excel 电子表格数据加载到 DB2

 2010-04-22 00:00:00 来源:WEB开发网   
核心提示: 图 5. DB 表“EXCEL_TEST”已经存在要向数据库提交一个表,用户只需选择“Write DB Table”按钮,使用 Apache 的 POI 和 HSSF 将 Excel 电子表格数据加载到 DB2(8),此时, DBTableGene

图 5. DB 表“EXCEL_TEST”已经存在
使用 Apache 的 POI 和 HSSF 将 Excel 电子表格数据加载到 DB2

要向数据库提交一个表,用户只需选择“Write DB Table”按钮。此时, DBTableGenerator.java 中一个以线程运行的方法开始读取 Excel 数据,创建新的数据库表以及通过 JDBC 将行插入表中。类 DBTableGenerator.java 在一个线程模型中处理该任务,是为了允许用一个进度条来提供说明一切运行正常的可视反馈。

我们读取以前由 HSSF 从一个个单元格中收集的 Excel 数据并且不要管对类 SQLFacade.java 的 SQL 调用。JDBC 和 SQL 的使用需要我们为每一行的处理构造 INSERT 语句,这将使用已显示的大多数方法。所有困难的数据库工作都由类 SQLFacade.java 通过 JDBC API 执行 DB 更新来加以处理。

您可以在 清单 2 中显示的 DBTableGenerator.java 类的 run 方法中找到促进数据库表创建过程的代码。

清单 2.

// Create the Table with the name and credentials provided 
// Calculate the number sql calls we will complete to track progress 
int goal = (spreadsheetModel.getRowCount() + 1) * 2; 
int progressToGoal = 0; 
// call constructor to create a progress bar 
DBTableGenerator frame = new DBTableGenerator(goal, spreadsheetName);  
frame.addWindowListener(new WindowAdapter() { 
 public void windowClosing(WindowEvent e) { 
 // Allow close of progress window 
 } 
}); 
frame.pack(); 
frame.centerDialog(); 
frame.setVisible(true); 
// Create the new table by calling the standard Create SQL 
// Ex CREATE TABLE ADMIN.EMAIL_ADDRESSES 
// ( NAME CHARACTER (100) , EMAIL CHARACTER (100)  ) ; 
sqlCreateQuery = "CREATE TABLE " + sqlFacade.getUser() + "." + 
  spreadsheetName + " ( "; 
String sqlColumnNames = " ( "; 
// Make sure to neglect the first column, which was used for 
// placeholder row numbers 
for(int col = 0; col < (spreadsheetModel.getColumnCount()-1); col++) { 
  if (col>0) { 
 sqlCreateQuery += ", "; 
 sqlColumnNames += ", "; 
    } 
  sqlCreateQuery += spreadsheetModel.getColumnNames().get(col);  
  sqlColumnNames += spreadsheetModel.getColumnNames().get(col);  
  switch(((Integer)(spreadsheetModel.getColumnTypes().get(col))).intValue()) { 
  // Convert numeric types the equivalent floats 
  // (guaranteed to work for all number types) 
 case HSSFCell.CELL_TYPE_NUMERIC: sqlCreateQuery += " FLOAT "; break; 
 // No need to convert strings 
 case HSSFCell.CELL_TYPE_STRING: sqlCreateQuery += " CHARACTER (100) "; break; 
 // Convert formulas to their string representations 
 case HSSFCell.CELL_TYPE_FORMULA: sqlCreateQuery += " CHARACTER (100) "; break; 
 // No need to convert blank cells 
 case HSSFCell.CELL_TYPE_BLANK: sqlCreateQuery += " CHARACTER (100) "; break; 
 // We have covered all the cell types POI/HSSF produce above, 
 // but just in case we will provide error handling for any others by 
 // throwing an exception. 
  default: 
 System.out.println("Current SQL statement: " + sqlCreateQuery); 
 throw new SQLException();    
 } 
} 
sqlCreateQuery += " ); "; 
sqlColumnNames += " ) "; 
// update the progress bar 
frame.current.setValue(1); 
// Run the sql query 
sqlFacade.executeUpdate(sqlCreateQuery); 
// update the progress bar 
frame.current.setValue(2); 
progressToGoal = 2; 
// Populate the new DB table row-by-row from the spreadsheetModel 
// data, converting each column as appropriate 
for(int row = 0; row < spreadsheetModel.getRowCount(); row++) { 
  sqlRowInsertQuery = "INSERT INTO " + sqlFacade.getUser() 
   + "." + spreadsheetName + sqlColumnNames + " VALUES ("; 
  for(int col = 0; col < spreadsheetModel.getColumnCount()-1; col++) { 
 if (col > 0) { 
 sqlRowInsertQuery += ", "; 
 } 
 sqlRowInsertQuery += "'" + 
  ((HSSFCell)(spreadsheetModel.getRow(row).get(col))).getStringCellValue() + "'"; 
  } 
  sqlRowInsertQuery += " ); "; 
  // update the progress bar 
  progressToGoal++; 
  frame.current.setValue(progressToGoal); 
  // Run the sql query 
  sqlFacade.executeUpdate(sqlRowInsertQuery); 
  progressToGoal++; 
  frame.current.setValue(progressToGoal); 
} 

上一页  3 4 5 6 7 8 9  下一页

Tags:使用 Apache POI

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接