Как я могу проверить, является ли файл файлом Excel?

Я пишу программу, и мне нужно выбрать файл Excel, который будет прочитан программой. Теперь у меня вопрос, как я могу доказать, является ли файл файлом Excel или нет?

Файл выбирается таким способом:

JButton btnFile = new JButton("Select Excel File");
btnFile.setPreferredSize(new Dimension(40, 40));
btnFile.addActionListener(new ActionListener() {
    // Handle open button action.
    public void actionPerformed(ActionEvent e) {
        final JFileChooser fc = new JFileChooser();
        int returnVal = fc.showOpenDialog(frame);
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            file = fc.getSelectedFile();
            // This is where a real application would open the file.
            System.out.println("File: " + file.getName() + ".");
        } else {
            System.out.println("Open command cancelled by user.");
        }
        System.out.println(returnVal);
    }
});

person Phil    schedule 21.12.2015    source источник
comment
заканчивается на .xlsx и т. д.?   -  person OPK    schedule 21.12.2015
comment
@JasonZ Это на самом деле не доказывает, что это файл Excel. Кто угодно может создать файл с расширением .xlsx.   -  person Rainbolt    schedule 21.12.2015
comment
С POI stackoverflow.com/a/14522512/1521710   -  person Igor Vuković    schedule 21.12.2015


Ответы (5)


Вы можете добавить фильтр в средство выбора файлов, который позволяет выбирать только файлы .xlsx (вы можете добавить дополнительные расширения, используя OR в ответе с другим расширением)

    fc = new JFileChooser();

    fc.setFileFilter(new FileFilter() {

      public String getDescription() {
          return "Excel Documents (.xlsx)";
      }

      public boolean accept(File f) {
          if (f.isDirectory()) {
              return true;
          } else {
              String filename = f.getName().toLowerCase();
              return filename.endsWith(".xlsx") ;
          }
      }
   });
person asiew    schedule 21.12.2015

MimetypesFileTypeMap.getContentType (String) [JDK 6]

Класс MimetypesFileTypeMap был представлен в Java SE 6 для обеспечения типизации данных файлов через их расширение с использованием формата .mime.types. Документ Javadoc класса объясняет, где в данной системе класс ищет записи файлов типов MIME. В моем примере используются те, которые поставляются из коробки с моей установкой JDK 8. Следующий листинг кода демонстрирует использование javax.activation.MimetypesFileTypeMap.

public String identifyFileTypeUsingMimetypesFileTypeMap(final String fileName)  
{      
   final MimetypesFileTypeMap fileTypeMap = new MimetypesFileTypeMap();  
   return fileTypeMap.getContentType(fileName);  
} 

Files.probeContentType (путь) [JDK 7]

В Java SE 7 представлен очень утилитарный класс Files, и в Javadoc этого класса кратко описывается его использование: этот класс состоит исключительно из статических методов, которые работают с файлами, каталогами или другими типами файлов, и в большинстве случаев методы, определенные здесь, будут делегировать связанный провайдер файловой системы для выполнения файловых операций.

Класс java.nio.file.Files предоставляет метод probeContentType (Path), который проверяет тип содержимого файла с помощью установленных реализаций FileTypeDetector (Javadoc также отмечает, что данный вызов виртуальной машины Java поддерживает общесистемный список детекторов типов файлов).

public String identifyFileTypeUsingFilesProbeContentType(final String fileName)  
{  
   String fileType = "Undetermined";  
   final File file = new File(fileName);  
   try  
   {  
      fileType = Files.probeContentType(file.toPath());  
   }  
   catch (IOException ioException)  
   {  
      out.println(  
           "ERROR: Unable to determine file type for " + fileName  
              + " due to exception " + ioException);  
   }  
   return fileType;  
}  

Для получения дополнительных сведений посетите эту ссылку

person Bacteria    schedule 21.12.2015

Проверьте расширение 'xlsx' в имени файла. Однако, чтобы проверить, действительно ли выбранный файл является файлом Excel, вам понадобится библиотека для проверки, например Apache POI HSSF. Дополнительные сведения см. в этом ответе.

person K139    schedule 21.12.2015

Вы можете использовать Apache Commons Api для проверки расширения файла

String filename = file.getName();
if(!FilenameUtils.isExtension(filename,"xls")){
  JOptionPane.showMessageDialog(null, "Choose an excel file!");
}

http://commons.apache.org/io/api-release/index.html?org/apache/commons/io/package-summary.html.

Вы также можете сделать что-то вроде этого. Вам нужно будет проверить все типы файлов, которые вы рассматриваете. Я просто указываю вам направление, в котором вы должны думать:

String filename = file.getName();
    String extension = filename.substring(filename.lastIndexOf(".") + 1, filename.length());

    String excel = "xls";
    if (!extension.equals(excel)){
       JOptionPane.showMessageDialog(null, "Choose an excel file!");

    }
    else {
        String filepath = file.getAbsolutePath();
        JOptionPane.showMessageDialog(null, filepath);
        String upload = UploadPoData.initialize(null, filepath);

         if ("OK".equals(upload)) {
     JOptionPane.showMessageDialog(null,"Upload Successful!");
    }
    }
person Naveen Goyal    schedule 21.12.2015

Я согласен с ответами K139 и UUIIUI, но только для информации вы также можете использовать структуру, такую ​​как tika для такого рода контроль.

person Aurelien    schedule 21.12.2015