【问题标题】:Java: cannot update Excel using JDBC ODBCJava:无法使用 JDBC ODBC 更新 Excel
【发布时间】:2010-11-20 07:15:49
【问题描述】:

我可以很好地读取行/列,但我无法更新、插入或删除。

try{
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            String myDB = "jdbc:odbc:Driver={Microsoft Excel Driver (*.xls)};DBQ=myExcelFile.xls;"
+
                          "DriverID=22;READONLY=false";
            con = DriverManager.getConnection(myDB, username, password);
            stmt = con.createStatement();
            stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
            rs = stmt.executeQuery("SELECT * FROM [users$]");
            while (rs.next()) {
                String str = rs.getString("username");
                System.out.println(str);
                rs.updateString("username", str + "UPDATED");
                rs.updateRow();
            }
            rs.close();
            stmt.close();
            con.close();
        }catch(Exception e){System.out.println(e);}

此代码在到达rs.updateRow(); 时失败并显示此错误:

java.sql.SQLException: [Microsoft][ODBC Excel 驱动程序]错误 行

注意:有人说是因为READONLY没有设置为false或0,但我已经做了,而且Excel文件也没有设置为只读

我按照以下步骤在此处应用 更新 ResultSet 对象中的行http://download.oracle.com/javase/tutorial/jdbc/basics/retrieving.html

【问题讨论】:

  • 为了限制出错的可能性,为什么不将您的选择语句更改为 SELECT username FROM [users$]?总有可能确实存在“行中的错误”。

标签: java excel jdbc odbc


【解决方案1】:

您应该考虑使用Apache POI 进行excel 集成。

【讨论】:

  • 谢谢。现在我正在使用 apache POI,但我遇到了同样的问题,我无法更新行!在此链接poi.apache.org/spreadsheet/quick-guide.html#ReadWriteWorkbook 中,据说我应该使用 Workbook 和其他不属于 HSSF 包的实例,而在本教程中 (onjava.com/pub/a/onjava/2003/04/16/poi_excel.html) 教我将 POI 与 HSSF 包一起使用!有什么不同!!我现在很困惑!请帮助
  • 对不起,我之前没有回答,因为我不是 POI 专家。也许邮件列表中的某个人应该提供帮助。或者只是使用 POI 术语在 StackOverFlow 中创建另一个问题。
【解决方案2】:

我建议你使用 Apache POI http://poi.apache.org/ 和这里的一些代码:http://onjava.com/pub/a/onjava/2003/04/16/poi_excel.html

代码如下:

FileInputStream myInput = new FileInputStream(inputFile);
XSSFWorkbook wb = new XSSFWorkbook(myInput);

XSSFSheet sheet = wb.getSheetAt(0);
XSSFRow row = sheet.getRow(0); 
XSSFCell cell = row.getCell(1);
cell.setCellValue(123);


sheet.getRow(37).getCell(13). setCellValue("USD");

它成功更新了单元格,或者您可以将此代码更改为您的情况(更新行)。

HSSF 适用于 Excel '97(-2007) 文件格式,XSSF 适用于 Excel 2007 OOXML (.xlsx) 。 (poi.apache.org/spreadsheet/index.html) 我觉得更新应该没有问题

如果您有任何问题,请写信给我

【讨论】:

【解决方案3】:

可以更新、插入和删除。采用, stmt.executeUpdate("query") 而不是 stmt.executeQuery("query")

【讨论】:

    【解决方案4】:

    结果集不是通过 JDBC 进行更新的典型方法。 (通常使用insert、update语句。)

    您发布的教程链接中有一段解释默认结果集是只读的。它说:

    默认的 ResultSet 并发是 CONCUR_READ_ONLY。 注意:并非所有 JDBC 驱动程序和数据库都支持并发。如果驱动程序支持指定的并发级别,则方法 DatabaseMetaData.supportsResultSetConcurrency 返回 true,否则返回 false。

    【讨论】:

      【解决方案5】:

      我可以使用 JDBC 更新 excel 文件,您可以使用以下代码,此代码更新 D:/Test.xls 中的文件并使用“测试”更新 Col1,其中 Col2 为“测试”:

          java.sql.Statement stmt=null;
          PreparedStatement ps=null;
          Connection con=null;
      
          con = java.sql.DriverManager.getConnection( "jdbc:odbc:Driver={Microsoft Excel Driver (*.xls)};DBQ=D:/Test.xls;ReadOnly=False;");
      
          ps=con.prepareStatement("Update [Sheet1$] Set Col1='Test' Where Col2='Testing');
          ps.executeUpdate();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-16
        相关资源
        最近更新 更多