Java ApachePOI-Excel导入,将新工作表中的数据插入到列中

Java ApachePOI-Excel导入,将新工作表中的数据插入到列中,java,excel,apache,Java,Excel,Apache,我来这里是为了在Netbeans中的java项目中寻求帮助 我正在使用ApachePOI导入/导出excel数据。为了让您了解我的应用程序中的问题,我向您展示了调试的打印 在印刷品中,您可以看到两张纸。第一个标题“aiai”和该表中的数据 我的问题是:如何将“aiai2”中的数据插入标题“aiai2”下方的适当位置,aiai2是excel文件中的第二张表 换言之,我想垂直分开这些表 下面,我将显示我的代码: Workbook wb; public String Importar(File a

我来这里是为了在Netbeans中的java项目中寻求帮助

我正在使用ApachePOI导入/导出excel数据。为了让您了解我的应用程序中的问题,我向您展示了调试的打印

在印刷品中,您可以看到两张纸。第一个标题“aiai”和该表中的数据

我的问题是:如何将“aiai2”中的数据插入标题“aiai2”下方的适当位置,aiai2是excel文件中的第二张表

换言之,我想垂直分开这些表

下面,我将显示我的代码:

Workbook wb;

public String Importar(File archivo, JTable tablaD) {
    String answer = "Unable to import";
    DefaultTableModel modeloT = new DefaultTableModel();
    tablaD.setModel(modeloT);
    tablaD.getModel();
    tablaD.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

    try {
        wb = WorkbookFactory.create(new FileInputStream(archivo));
        int nsheets = wb.getNumberOfSheets();

        for (int i = 0; i < nsheets; i++) {

            Sheet sheet = wb.getSheetAt(i);
            Iterator filaIterator = sheet.rowIterator();

            int rownum = -1;
            while (filaIterator.hasNext()) {
                rownum++;
                Row fila = (Row) filaIterator.next();
                /*if (i > 0) {//se o nr da ficha atual for maior que 0, começa a escrever as linhas apartir da row 0 da tabela
                    modeloT.moveRow(modeloT.getRowCount() -1, modeloT.getRowCount() - 1, 0);
                }*/
                Iterator columnaIterator = fila.cellIterator();
                Object[] listaColumna = new Object[1000];
                int columnnum = -1;
                while (columnaIterator.hasNext()) {
                    columnnum++;
                    Cell celda = (Cell) columnaIterator.next();

                    if (rownum == 0) {
                        modeloT.addColumn(celda.getStringCellValue());
                    } else {
                        if (celda != null) {
                            switch (celda.getCellType()) {
                                case Cell.CELL_TYPE_NUMERIC:
                                    listaColumna[columnnum] = (int) Math.round(celda.getNumericCellValue());
                                    break;
                                case Cell.CELL_TYPE_STRING:
                                    listaColumna[columnnum] = celda.getStringCellValue();
                                    break;
                                case Cell.CELL_TYPE_BOOLEAN:
                                    listaColumna[columnnum] = celda.getBooleanCellValue();
                                    break;
                                default:
                                    listaColumna[columnnum] = celda.getDateCellValue();
                                    break;
                            }//end switch case
                            System.out.println("Column:" + columnnum + " Row:" + rownum + " value:" + celda + ".");

                        }
                    }
                }//end while column Iterator
                if (rownum != 0) {
                    modeloT.addRow(listaColumna);
                }
            }//end while row iterator
        }//end for
        answer = "Imported with success";

    } catch (IOException | InvalidFormatException | EncryptedDocumentException e) {
        System.err.println(e.getMessage());
    }
    return answer;
}

public String Exportar(File archivo, JTable tablaD) {
    String answer = "Unable to export";
    int numFila = tablaD.getRowCount(), numColumna = tablaD.getColumnCount();
    if (archivo.getName().endsWith("xls")) {
        wb = new HSSFWorkbook();
    } else {
        wb = new XSSFWorkbook();
    }
    Sheet hoja = wb.createSheet("Default");

    try {
        for (int i = -1; i < numFila; i++) {
            Row fila = hoja.createRow(i + 1);
            for (int j = 0; j < numColumna; j++) {
                Cell celda = fila.createCell(j);
                if (i == -1) {
                    celda.setCellValue(String.valueOf(tablaD.getColumnName(j)));
                } else {
                    celda.setCellValue(String.valueOf(tablaD.getValueAt(i, j)));
                }
                wb.write(new FileOutputStream(archivo));
            }
        }
        answer = "Exported with success";
    } catch (Exception e) {
        System.err.println(e.getMessage());
    }
    return answer;
}
工作簿wb;
公共字符串导入器(文件archivo,JTable tablaD){
字符串answer=“无法导入”;
DefaultTableModelot=新的DefaultTableModel();
tablaD.setModel(modeloT);
tablaD.getModel();
tablaD.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
试一试{
wb=WorkbookFactory.create(新文件输入流(archivo));
int nsheets=wb.getNumberOfSheets();
for(int i=0;i0){//se o nr da ficha atual代表0,那么作为第0行的一部分,请在第0行的表中列出
modeloT.moveRow(modeloT.getRowCount()-1,modeloT.getRowCount()-1,0);
}*/
迭代器columnaIterator=fila.cellIterator();
Object[]listaColumna=新对象[1000];
int columnnum=-1;
while(columnaIterator.hasNext()){
columnnum++;
Cell celda=(Cell)columnaIterator.next();
如果(rownum==0){
modeloT.addColumn(celda.getStringCellValue());
}否则{
if(celda!=null){
开关(celda.getCellType()){
case Cell.Cell\u类型\u数值:
listaColumna[columnnum]=(int)Math.round(celda.getNumericCellValue());
打破
case Cell.Cell\u类型\u字符串:
listaColumna[columnnum]=celda.getStringCellValue();
打破
case Cell.Cell\u类型\u布尔值:
listaColumna[columnnum]=celda.getBooleanCellValue();
打破
违约:
listaColumna[columnnum]=celda.getDateCellValue();
打破
}//末端开关盒
System.out.println(“列:+columnnum+”行:+rownum+”值:+celda+”);
}
}
}//边结束边列迭代器
如果(rownum!=0){
modeloT.addRow(listaColumna);
}
}//行迭代器时结束
}//结束
回答=“导入成功”;
}捕获(IOException | InvalidFormatException | EncryptedDocumentException e){
System.err.println(e.getMessage());
}
返回答案;
}
公共字符串导出器(文件archivo,JTable tablaD){
字符串answer=“无法导出”;
int numFila=tablaD.getRowCount(),numColumna=tablaD.getColumnCount();
if(archivo.getName().endsWith(“xls”)){
wb=新的HSSF工作手册();
}否则{
wb=新XSSFWorkbook();
}
Sheet hoja=wb.createSheet(“默认”);
试一试{
for(inti=-1;i
根据我对您问题的理解,我假设您希望为每张工作表创建一个单独的表格,一个在另一个下面。在这种情况下,每次阅读新工作表时都需要创建一个新表。如果只使用一个表,则只会得到一个标题

试试这个:

创建一个新方法
Importar
,该方法接受一个新表和一个
工作表
参数

public String Importar(JTable tablaD, Sheet sheet) {
    String answer = "Unable to import";
    DefaultTableModel modeloT = new DefaultTableModel();
    tablaD.setModel(modeloT);
    tablaD.getModel();
    tablaD.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);


    try {


            Iterator filaIterator = sheet.rowIterator();

            int rownum = -1;
            ....
            ....
因此,调用方法将是:

try {
    Workbook wb = WorkbookFactory.create(new FileInputStream(archivo));
    int nsheets = wb.getNumberOfSheets();

    for (int i = 0; i < nsheets; i++) {
           //You have to make sure your JTable gets rendered.
           JTable tablaD = new JTable();
           Importar( tablaD, wb.getSheetAt(i) );
    }
} catch ( Exception e ) {
      e.printStackTrace();
 }
试试看{
工作簿wb=WorkbookFactory.create(新文件输入流(archivo));
int nsheets=wb.getNumberOfSheets();
for(int i=0;i

重要的一点是,每次调用
Importar

之前,您的新表都需要渲染或添加到帧中。我尝试了我们的方法,但在我的控制器modeloE.Importar(archivo,vistaE.jtDatos)中出现了一个错误,因为我删除了JTable参数,所以我还必须删除“vistaE.jtDatos”错误消失了,但是,当我导入excel文件时,它没有显示任何数据,它是空白的。但是,在控制台中,数据正在添加到表中。在调用
Importar
之前,您似乎正在将
JTable
添加到帧中,请不要干扰现有方法,只需按照我的ans中的建议创建一个新方法