0

我必须制作一个小型java应用程序,允许用户导入包含所有工作表的 excel 文件(.xls.xlsx),然后用户必须能够将特定数据从导入的 excel 文件导出到新文件,显示仅一张纸的选定数据。

到目前为止,我让导入部分正常工作,导出部分也是如此。(我将插入下面的代码)

public class ModeloExcel {
 Workbook wb;

 public String Importar(File archivo, JTable tablaD){
    String respuesta="Import failed.";
    DefaultTableModel modeloT = new DefaultTableModel();
    tablaD.setModel(modeloT);
    tablaD.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    try {
        wb = WorkbookFactory.create(new FileInputStream(archivo));
        int nsheets = wb.getNumberOfSheets();
        //FOR para carregar todas as folhas
        for(int i = 0; i < nsheets; i++){
        Sheet hoja = wb.getSheetAt(i);
        Iterator filaIterator = hoja.rowIterator();
        int indiceFila=-1;
        while (filaIterator.hasNext()) {                
            indiceFila++;
            Row fila = (Row) filaIterator.next();
            Iterator columnaIterator = fila.cellIterator();
            Object[] listaColumna = new Object[1000];
            int indiceColumna=-1;
            while (columnaIterator.hasNext()) {                    
                indiceColumna++;
                Cell celda = (Cell) columnaIterator.next();
                if(indiceFila==0){
                    modeloT.addColumn(celda.getStringCellValue());
                }else{
                    if(celda!=null){
                        switch(celda.getCellType()){
                            case Cell.CELL_TYPE_NUMERIC:
                                listaColumna[indiceColumna]= celda.getNumericCellValue();
                                break;
                            case Cell.CELL_TYPE_STRING:
                                listaColumna[indiceColumna]= celda.getStringCellValue();
                                break;
                            case Cell.CELL_TYPE_BOOLEAN:
                                listaColumna[indiceColumna]= celda.getBooleanCellValue();
                                break;
                            case Cell.CELL_TYPE_ERROR:
                                listaColumna[indiceColumna]=celda.getErrorCellValue();
                            case Cell.CELL_TYPE_BLANK:
                                return null;
                            case Cell.CELL_TYPE_FORMULA:
                                listaColumna[indiceColumna]=celda.getCellFormula();
                            default:
                                listaColumna[indiceColumna]=celda.getDateCellValue();
                                break;
                        }
                        System.out.println("col"+indiceColumna+" valor: true - "+celda+".");
                    }                        
                }
            }
            if(indiceFila!=0)modeloT.addRow(listaColumna);
        }
        respuesta="Imported with success";
        }//fim for
    } catch (IOException | InvalidFormatException | EncryptedDocumentException e) {
        System.err.println(e.getMessage());
    }
    return respuesta;
}

public String Exportar(File archivo, JTable tablaD){
    String respuesta="Export failed";
    int numFila=tablaD.getRowCount(), numColumna=tablaD.getColumnCount();
    if(archivo.getName().endsWith("xls")){
        wb = new HSSFWorkbook();
    }else{
        wb = new XSSFWorkbook();
    }
    Sheet hoja = wb.createSheet("Hoja Principal");

    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));
            }
        }
        respuesta="Exported with success";
    } catch (Exception e) {
        System.err.println(e.getMessage());
    }
    return respuesta;
}

这是 ExcelModel 类

public class ControladorExcel implements ActionListener{
ModeloExcel modeloE = new ModeloExcel();
VistaExcel vistaE= new VistaExcel();
JFileChooser selecArchivo = new JFileChooser();
File archivo;
int contAccion=0;

public ControladorExcel(VistaExcel vistaE, ModeloExcel modeloE){
    this.vistaE= vistaE;
    this.modeloE=modeloE;
    this.vistaE.btnImportar.addActionListener(this);
    this.vistaE.btnExportar.addActionListener(this);
}

public void AgregarFiltro(){
    selecArchivo.setFileFilter(new FileNameExtensionFilter("Excel (*.xls)", "xls"));
    selecArchivo.setFileFilter(new FileNameExtensionFilter("Excel (*.xlsx)", "xlsx"));
}

@Override
public void actionPerformed(ActionEvent e) {
    contAccion++;
    if(contAccion==1)AgregarFiltro();

    if(e.getSource() == vistaE.btnImportar){
        if(selecArchivo.showDialog(null, "Select Directory")==JFileChooser.APPROVE_OPTION){
            archivo=selecArchivo.getSelectedFile();
            if(archivo.getName().endsWith("xls") || archivo.getName().endsWith("xlsx")){
                JOptionPane.showMessageDialog(null, 
                        modeloE.Importar(archivo, vistaE.jtDatos) + "\n Formato ."+ archivo.getName().substring(archivo.getName().lastIndexOf(".")+1), 
                        "IMPORTAR EXCEL", JOptionPane.INFORMATION_MESSAGE);
            }else{
                JOptionPane.showMessageDialog(null, "Choose a valid format(xls/xlsx).");
            }
        }
    }

    if(e.getSource() == vistaE.btnExportar){
        if(selecArchivo.showDialog(null, "Exportar")==JFileChooser.APPROVE_OPTION){
            archivo=selecArchivo.getSelectedFile();
            if(archivo.getName().endsWith("xls") || archivo.getName().endsWith("xlsx")){
                JOptionPane.showMessageDialog(null, modeloE.Exportar(archivo, vistaE.jtDatos) + "\n Formato ."+ archivo.getName().substring(archivo.getName().lastIndexOf(".")+1));
            }else{
                JOptionPane.showMessageDialog(null, "Choose a valid format(xls/xlsx).");
            }
        }
    }
}

这是 de ExcelController 类


这是jFrame

所以,重点是:用户必须能够从导入的 excel 文件的每张表中选择要导出到新文件的列。下面,我将举例说明 excel 文件的外观:


导入文件 - Sheet1

导入文件 - Sheet2

导入文件 - Sheet3

最终导出文件

我正在使用NetBeans IDE开发这个应用程序,作为一个新手,是否有可能实现这一点?如果可能,怎么做?

4

0 回答 0