簡體   English   中英

Apache POI-Excel導入,將新表中的數據插入到列中

[英]Apache POI - Excel Import, insert data from a new sheet into a column

我在這里在Netbeans的Java項目中尋求幫助。

我正在使用Apache POI導入/導出Excel數據。 為了讓您了解我的應用程序中的問題是什么,我向您展示了調試信息。

PRINT1

在打印中,您可以看到2張紙。 第一個標題“ aiai”和該工作表中的數據。

我的問題是:我該如何插入“ aiai2”中的數據,這是我的excel文件的第二張工作表,位於標題“ aiai2”下方的正確位置。

換句話說,我想垂直分離工作表。

在下面,我將顯示我的代碼:

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;
}

據我了解您的問題,我假設您想為每張工作表創建一個單獨的表格,一個又一個。 在這種情況下,每次閱讀新表時都需要創建一個新表。 如果僅使用一個表,則將僅獲得一個標題。

嘗試這個 :

創建一個采用新表和Sheet參數的新方法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();
 }

重要的一點是,每次調用Importar之前,都需要渲染或將新表添加到框架中

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM