我必须制作一个小型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 类
所以,重点是:用户必须能够从导入的 excel 文件的每张表中选择要导出到新文件的列。下面,我将举例说明 excel 文件的外观:
我正在使用NetBeans IDE开发这个应用程序,作为一个新手,是否有可能实现这一点?如果可能,怎么做?