使用 Apache 的 POI 和 HSSF 将 Excel 电子表格数据加载到 DB2
2010-04-22 00:00:00 来源:WEB开发网图 5. DB 表“EXCEL_TEST”已经存在
要向数据库提交一个表,用户只需选择“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);
}
- ››使用linux中的quota教程
- ››apache设置域名绑定 以及绑定不起作用的排查
- ››使用jxl生成带动态折线图的excel
- ››apache rewrite将指定URL转向指定的几个服务器
- ››使用mysql mysqldump进行数据库迁移
- ››使用jquery是新tab形式
- ››使用QUnit进行Javascript单元测试
- ››使用UITextFieldDelegate来隐藏键盘
- ››使用公式提取Excel中的日期后发现格式不对
- ››使用SQL Azure 的BI 解决方案
- ››使用PLSQL Developer工具导出sql文件
- ››使用双缓冲技术实现Android画板应用
更多精彩
赞助商链接