我试图开发一个按钮上的函数,读取excel文件,并生成一个自定义格式的.txt文件。
我的问题是,我希望数据的逐行加载显示在jprogressbar中,也希望在jlabel中显示当前从excel文件中读取的代码的名称,整个函数正确运行,但bar和jlabel都不会实时更新,当生成.txt时,只填充条形图,而jlabel只显示最后一条记录。
我用过这个函数 Thread.sleep(5*1000);
在excel文件的行之间暂停函数5秒,因为文件只包含5行和4列,所以由于进程的速度,它不会显示在屏幕上,但是尽管暂停中有暂停,但栏和jlabel都不会更新。
我留下了生成这个的代码:
我正在使用的库:
公共集合4-4.3
通用压缩1.18
poi-4.1.0标准
poi-ooxml-4.1.0版本
poi-ooxml-schemas-4.1.0版本
xmlbeans-3.1.0版本
以防excel文件的内容是:
例子
我留下完整的函数,在其中读取列并生成流程:
jProgressBar1.setMaximum(5);
List<String> columnas = Arrays.asList("Name", "Size", "Type", "Condition");
Map<String, Integer> mapNombresColumnas = new HashMap<>();
final int filaNombresColumnas = 0;
JFileChooser chooser = new JFileChooser();
FileNameExtensionFilter filter = new FileNameExtensionFilter("Excel files", "xlsx");
chooser.setFileFilter(filter);
chooser.setDialogTitle("Open file");
chooser.setAcceptAllFileFilterUsed(false);
if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION){
String ruta1 = chooser.getSelectedFile().toString();//.concat(".xlsx");
File archivoXLSX = new File(ruta1);
try {
XSSFWorkbook libro = new XSSFWorkbook(archivoXLSX);
org.apache.poi.ss.usermodel.Sheet sheet = libro.getSheetAt(0);
Row filaNombresColumna = sheet.getRow(filaNombresColumnas);
Iterator<Row> rowIterator = sheet.iterator();
Row row;
row=filaNombresColumna;
row.cellIterator().forEachRemaining(cell -> {
String valorCelda = cell.getStringCellValue().trim();
if (!valorCelda.isEmpty()) {
mapNombresColumnas.put(valorCelda, cell.getColumnIndex());
}
});
int indiceDatos = filaNombresColumnas + 1;
Row filaDatos = null;
int cont1 = 0, cont2 = 0;
int conteo = 1;
FileWriter fichero = new FileWriter("C:/Test/Result.txt");
fichero.write("Results");
fichero.write("\r\n");
while ((filaDatos = sheet.getRow(indiceDatos++)) != null) {
cont1++; cont2=0;
jProgressBar1.setValue(jProgressBar1.getValue() + 1);
Thread.sleep(5*1000);
String Text = "inicio";
int cont = 1;
for (String col : columnas) {
cont2++;
Cell celda = filaDatos.getCell(mapNombresColumnas.get(col));
if(celda == null){
Text = Text +"|Ninguno";
}else{
switch(celda.getCellType()){
case STRING:
String texto = celda.getStringCellValue();
//System.out.println(texto);
Text = Text + "|" + texto;
break;
case BLANK:
Text = Text + "|";
break;
case NUMERIC:
int numero = (int) celda.getNumericCellValue();
String numeroString = Integer.toString(numero);
Text = Text + "|" + numeroString;
break;
case FORMULA:
switch(celda.getCachedFormulaResultType()){
case NUMERIC:
int numero2 = (int) celda.getNumericCellValue();
String numeroString2 = Integer.toString(numero2);
Text = Text + "|" + numeroString2;
break;
case STRING:
texto = celda.getStringCellValue();
Text = Text + "|" + texto;
break;
}
break;
case _NONE:
System.out.println("NONE");
break;
default:
System.out.println("nulo!!!");
break;
}
}
}
String Array[] = Text.split("\\|");
System.out.println(Text);
if(!Array[1].equals("Ninguno") && !Array[2].equals("Ninguno")){
jLabel1.setText(Array[1]);
String conteoString = Integer.toString(conteo);
String conteoformateado = String.format("%14s", conteoString).replace(' ','0');
fichero.write("Start+"+ conteoformateado +"+ISSDG10");
fichero.write("\r\n");
if(Array[4].equals("DMG") ||
Array[4].equals("dmg") ||
Array[4].equals("inoperativo") ||
Array[4].equals("INOPERATIVO") ||
Array[4].equals("inop") ||
Array[4].equals("INOP")){
fichero.write("Fail+999");
}else{
fichero.write("Got+34");
}
fichero.write("\r\n");
fichero.write("Free+20++1++++");
fichero.write("\r\n");
fichero.write("LOCAL+9+");
fichero.write("\r\n");
fichero.write("INF+"+Array[1]+"+"+Array[2]+Array[3]+"+4");
fichero.write("\r\n");
fichero.write("C+10+"+conteoformateado);
fichero.write("\r\n");
conteo ++;
}
if(Array[1].equals("Ninguno") || Array[2].equals("Ninguno")){
cont1--;
}
}
System.out.println("\r\n " + cont1 +"\r\n" + cont2);
fichero.close();
JOptionPane.showMessageDialog(null, "Generate.");
} catch (org.apache.poi.openxml4j.exceptions.InvalidFormatException ex) {
JOptionPane.showMessageDialog(null, "Error");
} catch (IOException ex) {
Logger.getLogger(jProgressBar.class.getName()).log(Level.SEVERE, null, ex);
} catch (InterruptedException ex) {
Logger.getLogger(jProgressBar.class.getName()).log(Level.SEVERE, null, ex);
}
}
我正在测试swingutilities,这似乎是解决这个问题的方法,但目前我无法将其正确应用于我的代码,我修改了以下代码行:
cont1++; cont2=0;
final int percent = cont1;
try {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
updateBar(percent);
}
});
Thread.sleep(5*1000);
} catch (InterruptedException e) {
}
这个 updateBar
功能:
public void updateBar(int newValue) {
jProgressBar1.setValue(newValue);
}
暂无答案!
目前还没有任何答案,快来回答吧!