使用Java确定Microsoft Office的版本

5
我写了一个程序,可以生成一组数据并输出到Excel电子表格中。最初我使用jexcel库将数据写入文件,但我想更新程序,以便它可以检查并确定是创建“.xls”还是“.xlsx”文件,然后写入适当的文档类型。在写入“.xlsx”文件方面,Apache POI似乎是最好的选择,但有没有确定正确文件类型的任何想法?
我可以让用户在命名文件时选择文件类型,但对于用户来说这似乎是额外的工作,而且我假设有些用户不知道他们想要什么文件类型。
有什么想法吗?
此外,我假设操作系统是Windows,用户有某个版本的Excel,在其他情况下,我将选择默认文件类型。

Excel可以读取这两种类型。为什么不继续你正在做的事情呢? - user207421
4个回答

8

一种方法是调用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();
      }
    }
  }

您可能希望添加更多的错误检查,从返回的路径中提取Office版本的解析留作练习。;-)

+1 学到了新东西。之前不知道 ftype 和 assoc 命令。 - mikek3332002

1

您可以在注册表中搜索以下键:

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

这可能需要一些工作,正如这个问题所示:

使用Java读写Windows注册表


0

只是需要注意的一点:在64位系统上,我遇到了一些jRegistryKey的DLL加载问题,最终用commons-exec和标准的reg.exe替换了它。 - Darien

0

看一下OfficeVer

你可以将它实现到你的脚本中或用于代码分析。它类似于Java,是跨平台的,因此编译和直接实现它不应该是一个大问题。 它通过提取.docx和.xlsx文件然后读取版本来工作,同时也可以直接从.doc和.xls文件中读取。 OfficeVer还扩展了对.pdf文件的支持(截至撰写时的当前版本为1.03.1)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接