1

我想用java读取excel文件。我有一些旧格式的 excel 文件(excel 95)和其他新格式的文件(excel 2007)。我目前正在使用 poi,但它无法读取旧格式的 excel 文件。所以我需要的是一个传递文件名的函数,如果格式是旧格式(BIFF5),它将返回一个布尔值,如果格式是新格式(BIFF8),则返回false。这个函数的需要是允许我使用 jxl in 来处理旧格式,而 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);
      . . . . .
4

2 回答 2

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 路径

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

使用 Java 读取/写入 Windows 注册表

于 2013-03-13T11:45:33.567 回答
1

我建议尝试使用 Andy Khan 的 JExcel 而不是 POI。我不认为 POI 的设计或记录特别好。JExcel 让我很幸运。试试看。

于 2013-03-13T11:29:02.340 回答