如何知道java中的excel文件版本?

时间:2013-03-13 11:26:54

标签: java excel apache-poi jxl

我想在java中读取excel文件。我有一些excel文件与旧格式(excel 95)和其他新格式(excel 2007)。我目前正在使用poi,但它无法读取旧格式的excel文件。所以我需要的是一个传递文件名的函数,如果格式是旧格式(BIFF5),则返回一个值为true的布尔值,如果格式是新的,则返回false(BIFF8)。这个功能的需要是允许我使用旧版格式的jxl和更新格式的poi。

这是我的代码:

    try
    {
      // create a new org.apache.poi.poifs.filesystem.Filesystem
      POIFSFileSystem poifs = new POIFSFileSystem(fin);
      w = new HSSFWorkbook(poifs);
    }
    catch (IOException e)
    {
      w = null;
      throw e;
    }
    catch (OutOfMemoryError e) // java.lang.OutOfMemoryError:
    {
      w = null;
      throw e;
    }
    catch (OldExcelFormatException e) // OldExcelFormatException
    {
      w = null;
      System.out.println("OldExcelFormatException");
      translateBIFF5();
    }

 private void translateBIFF5() throws IOException, CmpException
  {
    ArrayList<String> row = null;
    try
    {
      jxl_w = Workbook.getWorkbook(excelFile);
    }
    catch (BiffException e)
    {
      jxl_w = null;
      e.printStackTrace();
    }
    catch (IOException e)
    {
      jxl_w = null;
      throw e;
    }
    catch (OutOfMemoryError e) // java.lang.OutOfMemoryError:
    {
      jxl_w = null;
      throw e;
    }

    if (jxl_w != null)
    {
      try
      {
        for (currentSheet = 0; currentSheet < jxl_w.getNumberOfSheets(); currentSheet++)
        {
          jxl_sheet = jxl_w.getSheet(currentSheet);
      . . . . .

2 个答案:

答案 0 :(得分:1)

我建议尝试使用Andy Khan的JExcel代替POI。我不认为POI的设计或记录特别好。我和JExcel一起好运。试试吧。

答案 1 :(得分:1)

一种方法是调用Windows ASSOC和FTYPE命令,捕获输出并解析它以确定安装的Office版本。

C:\Users\me>assoc .xls
.xls=Excel.Sheet.8

C:\Users\me>ftype Excel.sheet.8
Excel.sheet.8="C:\Program Files (x86)\Microsoft Office\Office12\EXCEL.EXE" /e

这是一个简单的例子:

import java.io.*;
public class ShowOfficeInstalled {
    public static void main(String argv[]) {
      try {
        Process p = Runtime.getRuntime().exec
          (new String [] { "cmd.exe", "/c", "assoc", ".xls"});
        BufferedReader input =
          new BufferedReader
            (new InputStreamReader(p.getInputStream()));
        String extensionType = input.readLine();
        input.close();
        // extract type
        if (extensionType == null) {
          System.out.println("no office installed ?");
          System.exit(1);
        }
        String fileType[] = extensionType.split("=");

        p = Runtime.getRuntime().exec
          (new String [] { "cmd.exe", "/c", "ftype", fileType[1]});
        input =
          new BufferedReader
            (new InputStreamReader(p.getInputStream()));
        String fileAssociation = input.readLine();
        // extract path
        String officePath = fileAssociation.split("=")[1];
        System.out.println(officePath);
      }
      catch (Exception err) {
        err.printStackTrace();
      }
    }
  }

您可以在注册表中搜索密钥:

HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows \ CurrentVersion \ App Paths

这可能需要一些工作,正如这个问题所证明的那样:

read/write to Windows Registry using Java