在数据库中插入XLSX数据

时间:2017-05-28 15:46:19

标签: java excel sqlite netbeans apache-poi

我一直在创建一个小应用程序,它将与条形码扫描程序(或在jtextfield中手写的数字)一起使用,该程序读取excel .xlsx文件并将相关值写入sqlite文件。

数据是“固定的”(它总是前7列,格式化为excel中的文本),但行号不是。

我已经让这个程序工作了,但它本周突然停止了工作(我已经尝试恢复早期的提交而且没有运气)而且我很难理解我做错了什么。 / p>

class ImportWorker extends SwingWorker<Integer , Integer>{
    JProgressBar jpb;
    int max;
    Sheet sheet;
    File file;

    //Passo i valori di questa classe come riferimenti di oggetti presenti nell'EDB, cosi' posso aggiornare i valori li'
    public ImportWorker(JProgressBar jpb, int max, Sheet sheet, File file){
        this.jpb = jpb;
        this.max = max;
        this.sheet = sheet;
        this.file = file;
    }

    @Override
    protected Integer doInBackground() throws Exception {
            //Svolgo il mio Import dentro un Thread separato dall'EDB cosi' il programma non si blocca

            Row row;
            String sql = "jdbc:sqlite:"+dbPath;
            try{
                conn = DriverManager.getConnection(sql);
                String sql2 = "DELETE FROM libri";
                Statement = conn.prepareStatement(sql2);
                Statement.execute();
                Statement.close();


                for (int i = 0; i <= sheet.getLastRowNum(); i++) {
                    //attivo progress bar con il ciclo per visualizzare lo stato di caricamento del file
                   int pbpercentage = (100 * i)/(max);


                    //conversione dei valore ed inserimento dentro il database
                    row = sheet.getRow(i);

                    row.getCell(0).setCellType(Cell.CELL_TYPE_STRING);
                    String Nome = row.getCell(0).getStringCellValue();

                    row.getCell(1).setCellType(Cell.CELL_TYPE_STRING);
                    String Autore = row.getCell(1).getStringCellValue();

                    row.getCell(2).setCellType(Cell.CELL_TYPE_STRING);
                    String Casa = row.getCell(2).getStringCellValue();

                    row.getCell(3).setCellType(Cell.CELL_TYPE_STRING);
                    String Codice = row.getCell(3).getStringCellValue();

                    row.getCell(4).setCellType(Cell.CELL_TYPE_STRING);
                    String Prezzo = row.getCell(4).getStringCellValue();

                    row.getCell(5).setCellType(Cell.CELL_TYPE_STRING);
                    String Anno = row.getCell(5).getStringCellValue();

                    row.getCell(6).setCellType(Cell.CELL_TYPE_STRING);
                    String Indice = row.getCell(6).getStringCellValue();



                    String sql1 = "INSERT INTO libri (Nome, Autore, Casa, Codice, Prezzo, Anno, Indice) VALUES (?, ?, ?, ?, ?, ?, ?)";
                    Statement = conn.prepareStatement(sql1);
                    Statement.setString(1, Nome);
                    Statement.setString(2, Autore);
                    Statement.setString(3, Casa);
                    Statement.setString(4, Codice);
                    Statement.setString(5, Prezzo);
                    Statement.setString(6, Anno);
                    Statement.setString(7, Indice);
                    Statement.execute();
                    Statement.close();

                    publish(pbpercentage);
                }
                conn.close();

            }catch(SQLException e){
                JOptionPane.showMessageDialog(null, "leggi() SwingWorker", "Errore", JOptionPane.ERROR_MESSAGE);
                e.printStackTrace();
            }
        return null;

    }

    @Override
    protected void process(List<Integer> chunks) {
        //Aggiornamento della percentuale della progress bar
        int i = chunks.get(chunks.size()-1);
        jpb.setValue(i);
    }

    @Override
    protected void done() {
        //Imposto il messaggio dei due Jlabel
        DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
        Calendar cal = Calendar.getInstance();

        eventi.setText(dateFormat.format(cal.getTime()));
        eventi2.setText("FILE "+ file.getName() +" IMPORTATO");

        //Nascondo la barra
        jpb.setVisible(false);
        setCursor(null);
    }
}

这是我正在使用的代码的相关部分,它使用swingworker以便我可以更新进度条并检查操作的状态,问题是在程序中当我选择文件时,for循环开始和结束后立即打印出标签“文件”FILE_NAME“importato”几秒钟(完成整张表后应该这样做)。

我已经尝试将System.out.println添加到进程的各个阶段,它似乎正确地进入for循环内部,但只是在没有到达第一个循环结束时就退出了。

请原谅其他语言的评论我很乐意翻译您不理解的内容!

P.S。数据库表名为“libri”,它有8列(第一列是名为Id的PK)

任何人都可以帮助我吗?

0 个答案:

没有答案