JFileChooser和使用JAVA从Excel文件读取

我有一个下面的代码

import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.text.html.HTMLDocument.Iterator; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Workbook; public class ExcelRead { public static String keep = ""; public static void main(String[] args) throws IOException { // File Openner JFrame.setDefaultLookAndFeelDecorated(true); JDialog.setDefaultLookAndFeelDecorated(true); JFrame frame = new JFrame("JComboBox Test"); frame.setLayout(new FlowLayout()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JButton button = new JButton("Select File"); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { JFileChooser fileChooser = new JFileChooser(); int returnValue = fileChooser.showOpenDialog(null); if (returnValue == JFileChooser.APPROVE_OPTION) { File selectedFile = fileChooser.getSelectedFile(); keep = selectedFile.getName(); System.out.println(keep); } } }); frame.add(button); frame.pack(); frame.setVisible(true); // end of the File opener // read from excel File excel = new File(keep); FileInputStream fis = new FileInputStream(excel); HSSFWorkbook wb = new HSSFWorkbook(fis); String sheetName = "Assignments"; //if my tempsheet start with "sheetname" thats okay for (int i = 0; i < wb.getNumberOfSheets() - 1; i++) { HSSFSheet tmpSheet = wb.getSheetAt(i); if (tmpSheet.getSheetName().startsWith(sheetName)) { //satırları ve sutunları gez oku } else { wb.removeSheetAt(i); } } }// end of the main private static String cellToString(HSSFCell cell) { int type; Object result; type = cell.getCellType(); switch (type) { case 0: result = cell.getNumericCellValue(); break; case 1: result = cell.getStringCellValue(); break; default: throw new RuntimeException("there are no support for this type of cell"); } return result.toString(); } } 

问题是,当我在select一个文件之前运行这个代码时,我得到了exception。 我想用FileChooserselect一个文件,然后返回该文件名从Excel文件中读取。 输出:

  Exception in thread "main" java.io.FileNotFoundException: at java.io.FileInputStream.open0(Native Method) at java.io.FileInputStream.open(Unknown Source) at java.io.FileInputStream.<init>(Unknown Source) at ExcelRead.main(ExcelRead.java:54) 

FileNotFoundexception是由于您在尝试读取文件时仍保持""的值。

这是因为您设置keep值的代码位于button上的ActionListener中。 将触发此代码的动作(很可能是一个button按下)尚未发生。

尝试这个:

 public static void chooseFile() { JFileChooser fileChooser = new JFileChooser(); int returnValue = fileChooser.showOpenDialog(null); if (returnValue == JFileChooser.APPROVE_OPTION) { File selectedFile = fileChooser.getSelectedFile(); keep = selectedFile.getName(); System.out.println(keep); } } public static void main(String[] args) throws IOException { // File Openner JFrame.setDefaultLookAndFeelDecorated(true); JDialog.setDefaultLookAndFeelDecorated(true); JFrame frame = new JFrame("JComboBox Test"); frame.setLayout(new FlowLayout()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JButton button = new JButton("Select File"); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { chooseFile() } }); frame.add(button); frame.pack(); frame.setVisible(true); // end of the File opener // read from excel chooseFile() // <- make sure that the file is chosen File excel = new File(keep); FileInputStream fis = new FileInputStream(excel); HSSFWorkbook wb = new HSSFWorkbook(fis); String sheetName = "Assignments"; //if my tempsheet start with "sheetname" thats okay for (int i = 0; i < wb.getNumberOfSheets() - 1; i++) { HSSFSheet tmpSheet = wb.getSheetAt(i); if (tmpSheet.getSheetName().startsWith(sheetName)) { //satırları ve sutunları gez oku } else { wb.removeSheetAt(i); } } }// end of the main 

问题在于

  public static String keep =""; 

当文件inputstream来到FileInputStream fis = new FileInputStream(excel);

它获得没有文件位置的excel; 并抛出你的例外。

 File excel = new File(keep); FileInputStream fis = new FileInputStream(excel); 

处理public static String keep =""; 根据您的要求:)