我一直在创建一个小应用程序,它将与条形码扫描程序(或在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)
任何人都可以帮助我吗?