2010-11-20 19 views
4

Je peux très bien lire les lignes/colonnes, mais je ne peux pas mettre à jour, insérer ou supprimer.Java: impossible de mettre à jour Excel en utilisant JDBC ODBC

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);} 

Ce code échoue lorsqu'il atteint rs.updateRow(); et affiche cette erreur:

java.sql.SQLException: [Microsoft][ODBC Excel Driver]Error in row

Note: Certaines personnes disent que c'est à cause de READONLY est pas définie sur false ou 0, mais je l'ai déjà fait et le fichier Excel est pas non plus mis en lecture seule

J'ai suivi les étapes pour appliquer Mettre à jour des objets dans ResultSet ici: http://download.oracle.com/javase/tutorial/jdbc/basics/retrieving.html

+0

pour limiter les possibilités d'erreurs, pourquoi ne pas changer votre instruction select pour SELECT nom d'utilisateur FROM [utilisateurs $]? Il y a toujours la possibilité qu'il y ait vraiment une "erreur en ligne". –

Répondre

2

Pourriez-vous envisager le Apache POI pour l'intégration Excel.

+0

Merci. Maintenant j'utilise le POI apache, mais j'ai le même problème, je ne peux pas mettre à jour les lignes! Dans ce lien http://poi.apache.org/spreadsheet/quick-guide.html#ReadWriteWorkbook il est dit que je devrais utiliser Workbook et d'autres instances qui ne font PAS partie du paquetage HSSF, alors que dans ce tutoriel (http: // onjava .com/pub/a/onjava/2003/04/16/poi_excel.html) m'apprend à utiliser les POI avec le package HSSF! Quelle est la différence!! Je suis tellement confus maintenant!Plz help – evilReiko

+0

Désolé, je n'ai pas répondu avant parce que je ne suis pas un spécialiste POI. Peut-être que quelqu'un dans la liste de diffusion devrait aider. Ou créez simplement une autre question dans StackOverFlow en utilisant des termes de POI. –

0

Un résultat n'est pas le moyen typique de mise à jour via JDBC. (Insérer Normalement, les états de mise à jour sont utilisés.)

Il y a un paragraphe dans le lien tutoriel que vous avez publié qui explique le jeu de résultats par défaut est en lecture seule. Il dit:

La valeur par défaut est ResultSet concurrency CONCUR_READ_ONLY. Remarque: Tous les pilotes et bases de données JDBD ne prennent pas en charge la simultanéité. La méthode DatabaseMetaData.supportsResultSetConcurrency renvoie true si le niveau de concurrence spécifié est pris en charge par le pilote et false dans le cas contraire.

2

Je vous suggère d'utiliser Apache POI http://poi.apache.org/ et certains codes ici: http://onjava.com/pub/a/onjava/2003/04/16/poi_excel.html

Voici le code:

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"); 

Il mettre à jour avec succès la cellule ou vous pouvez modifier ce code à votre situation (mise à jour rangée).

HSSF est pour Excel '97 (-2007) format de fichier et XSSF est pour OOXML Excel 2007 (.xlsx). (Poi.apache.org/spreadsheet/index.html) Je pense qu'il shouln't rencontrer aucun problème en mettant à jour

Si vous avez des questions s'il vous plaît écrivez-moi

+0

Merci. Maintenant j'utilise le POI apache, mais j'ai le même problème, je ne peux pas mettre à jour les lignes! Dans ce lien http://poi.apache.org/spreadsheet/quick-guide.html#ReadWriteWorkbook il est dit que je devrais utiliser Workbook et d'autres instances qui ne font PAS partie du package HSSF, alors que le second lien (http: // onjava .com/pub/a/onjava/2003/04/16/poi_excel.html) m'apprend à utiliser les POI avec le package HSSF! Quelle est la différence!! Je suis tellement confus maintenant! Aide de Plz – evilReiko

1

Il est possible de mettre à jour, Insérer et Supprimer . Utiliser, stmt.executeUpdate("query") au lieu de stmt.executeQuery("query").

0

Je suis mise à jour capable fichier Excel à l'aide JDBC, vous pouvez utiliser le code ci-dessous, ce code met à jour un fichier dans D: /Test.xls et mises à jour avec Col1 'Test' où Col2 est 'testing':

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();