用java确定microsoft office的版本

我写了一个程序,创build一组输出到Excel电子表格的数据。 我最初使用jexcel库将数据写入文件,但我想更新程序,以便它可以检查是否应该创build一个“.xls”或“.xlsx”文件,然后写入适当的文件types。 Apache POI似乎是写入“.xlsx”文件的最佳select,但是有关确定正确文件types的任何想法?

我可以让用户在命名文件时select,但是这对于用户来说似乎是额外的工作,并且我假定有用户不知道他们想要的文件types。

有任何想法吗?

另外,我假设操作系统是Windows和用户有一些版本的Excel,在其他情况下,我只是select一个默认的文件types。

一种方法是调用Windows ASSOC和FTYPE命令,捕获输出并parsing它以确定安装的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(); } } } 

您可能想要添加更多的错误检查,parsing从返回的path中提取Office版本作为练习留下;-)

您可以在registry中search关键字:

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

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

使用Java读/写Windowsregistry

如果你愿意深入注册(例如使用jregistrykey ), 这个PowerShell脚本的翻译版本应该做你想做的事情。