Estoy intentando abrir un excel desde mi aplicacion. He conseguido hacerlo con el formato .csv pero ahora estaba intentando abrirlo con el .xls.
Buscando informacion he encontrado tanto las librerias necesarias, como trozos de codigo.
Lo he intentado hacer pero cuando abro el archivo, el programa me da el error:
Cita:
Os pongo el código. Exception occurred during event dispatching:
java.lang.ArrayIndexOutOfBoundsException: -11
at java.util.Vector.setSize(Vector.java:245)
at javax.swing.table.DefaultTableModel.justifyRows(De faultTableModel.java:245)
at javax.swing.table.DefaultTableModel.setDataVector( DefaultTableModel.java:207)
at javax.swing.table.DefaultTableModel.<init>(Default TableModel.java:107)
at javax.swing.table.DefaultTableModel.<init>(Default TableModel.java:89)
at javax.swing.table.DefaultTableModel.<init>(Default TableModel.java:69)
at gestion_campeonatos.InscribirParticipante$18.<init >(InscribirParticipante.java:970)
...... y muchas mas
......
.....
......
java.lang.ArrayIndexOutOfBoundsException: -11
at java.util.Vector.setSize(Vector.java:245)
at javax.swing.table.DefaultTableModel.justifyRows(De faultTableModel.java:245)
at javax.swing.table.DefaultTableModel.setDataVector( DefaultTableModel.java:207)
at javax.swing.table.DefaultTableModel.<init>(Default TableModel.java:107)
at javax.swing.table.DefaultTableModel.<init>(Default TableModel.java:89)
at javax.swing.table.DefaultTableModel.<init>(Default TableModel.java:69)
at gestion_campeonatos.InscribirParticipante$18.<init >(InscribirParticipante.java:970)
...... y muchas mas
......
.....
......
Codigo del boton que al darle click, se me abre una ventana explorador y busco mi archivo excel:
Cita:
Codigo del metodo rellenar_tabla_desde_excel(); :private void jButton11ActionPerformed(java.awt.event.ActionEven t evt) {
JFileChooser fileChooser = new JFileChooser();
int status = fileChooser.showOpenDialog(null);
if(status==JFileChooser.APPROVE_OPTION){
File file=fileChooser.getSelectedFile();
if(file!=null){
rellenar_tabla_desde_excel(file);
}
}
}
JFileChooser fileChooser = new JFileChooser();
int status = fileChooser.showOpenDialog(null);
if(status==JFileChooser.APPROVE_OPTION){
File file=fileChooser.getSelectedFile();
if(file!=null){
rellenar_tabla_desde_excel(file);
}
}
}
Cita:
He puesto en rojo donde justo me falla...el archivo excel me lo lee bien porque los metodos contar getcolumn y getrows me devuelven los valores correctos del excel...private void rellenar_tabla_desde_excel(File file){
try {
//getting the workbook
wbook = Workbook.getWorkbook(file);
//una hoja en especifico
final Sheet hoja = wbook.getSheet(0);
Cell a1 = hoja.getCell(0, 0);
final int columnas = hoja.getColumns();
final int filas = hoja.getRows();
modelo = new DefaultTableModel() {
@Override
public String getColumnName(int column) {
Cell cell = hoja.getCell(column, 0);
LabelCell lc = (LabelCell) cell;
return lc.getString();
}
@Override
public boolean isCellEditable(int row, int col) {
return false;
}
@Override
public int getColumnCount() {
return columnas;
}
@Override
public int getRowCount() {
return filas-getColumnCount()-1;
}
@Override
public Object getValueAt(int row, int col) {
row++;
Cell cell = hoja.getCell(col, row);
if (cell.getType() == CellType.LABEL) {
LabelCell lc = (LabelCell) cell;
return lc.getString();
} else if (cell.getType() == CellType.NUMBER) {
NumberCell nc = (NumberCell) cell;
return nc.getValue();
} else if (cell.getType() == CellType.DATE) {
DateCell dc = (DateCell) cell;
return dc.getDate();
}
return null;
}
};
this.jTable1.setModel(modelo);
}catch (IOException ex) {
ex.printStackTrace();
}catch (BiffException ex) {
ex.printStackTrace();
}
}
try {
//getting the workbook
wbook = Workbook.getWorkbook(file);
//una hoja en especifico
final Sheet hoja = wbook.getSheet(0);
Cell a1 = hoja.getCell(0, 0);
final int columnas = hoja.getColumns();
final int filas = hoja.getRows();
modelo = new DefaultTableModel() {
@Override
public String getColumnName(int column) {
Cell cell = hoja.getCell(column, 0);
LabelCell lc = (LabelCell) cell;
return lc.getString();
}
@Override
public boolean isCellEditable(int row, int col) {
return false;
}
@Override
public int getColumnCount() {
return columnas;
}
@Override
public int getRowCount() {
return filas-getColumnCount()-1;
}
@Override
public Object getValueAt(int row, int col) {
row++;
Cell cell = hoja.getCell(col, row);
if (cell.getType() == CellType.LABEL) {
LabelCell lc = (LabelCell) cell;
return lc.getString();
} else if (cell.getType() == CellType.NUMBER) {
NumberCell nc = (NumberCell) cell;
return nc.getValue();
} else if (cell.getType() == CellType.DATE) {
DateCell dc = (DateCell) cell;
return dc.getDate();
}
return null;
}
};
this.jTable1.setModel(modelo);
}catch (IOException ex) {
ex.printStackTrace();
}catch (BiffException ex) {
ex.printStackTrace();
}
}
Pero lo que nose es como hacer que teniendo ya un jtable1 con sus columnas en mi aplicacion, añadirle los valores del excel.
He probado tambien con tablita = (DefaultTableModel)jTable1.getModel();
donde tablita lo declaro al inicio del metodo como DefaultTableModel tablita;
pero nada...por cierto en el codigo, "modelo" esta declarado al inicio de la clase, lo digo para que no penseis que no esta declarado.
Alguna idea?
Muchas gracias de antemano y aparte de resolver la duda, espero que le sirva a la gente para aprender a como abrir un excel :)