Импорт данных Excel из файла xls\xlsx в другой

Я должен сделать небольшую 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).");
            }
        }
    }
}

Это класс де ExcelController


Это jFrame

Итак, суть в том, что пользователь должен иметь возможность выбирать, какие столбцы из каждого листа импортируемого файла Excel следует экспортировать в новый файл. Ниже я приведу пример того, как должны выглядеть файлы Excel:


Импортировать файл - Sheet1

Импортировать файл - Sheet2

Импортировать файл - Sheet3

Конечный экспортированный файл

Я использую среду IDE NetBeans для разработки этого приложения, и как новичок в этом, возможно ли достичь этого? Если это возможно, то как?

0 ответов

Другие вопросы по тегам