Определить версию Microsoft Office с Java
Я написал программу, которая создает набор данных, которые выводятся в электронную таблицу Excel. Первоначально я использовал библиотеку jexcel для записи данных в файл, но я хотел бы обновить программу, чтобы она могла проверить и посмотреть, нужно ли создавать файл ".xls" или ".xlsx", а затем записать в соответствующий тип документа. Apache POI представляется наилучшим вариантом с точки зрения записи в файл ".xlsx", но есть ли идеи по поводу определения правильного типа файла?
Я мог бы просто сделать так, чтобы пользователь выбрал имя файла, но это кажется дополнительной работой для пользователя, и я предполагаю, что есть пользователи, которые не знают, какой тип файла им нужен.
Есть идеи?
Кроме того, я предполагаю, что ОС - это Windows, и у пользователя есть версия Excel, в других случаях я просто выберу тип файла по умолчанию.
4 ответа
Одним из способов является вызов команд 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 из возвращенного пути оставлен в качестве упражнения;-)
Вы можете искать в реестре ключ:
HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows \ CurrentVersion \ Пути к приложениям
Это, вероятно, потребует некоторой работы, о чем свидетельствует этот вопрос:
Посмотрите на OfficeVer.
Вы можете реализовать его в своем скрипте или использовать для анализа кода. Он кросс-платформенный, очень похож на Java, поэтому его компиляция и непосредственная реализация не должны быть сложными. Он работает путем извлечения файлов.docx и xlsx и последующего чтения версии, а также чтения непосредственно из файлов.doc и.xls. OfficeVer также расширил свою поддержку до файлов.pdf (текущая версия на момент написания 1.03.1)
Если вы хотите погрузиться в реестр (например, с помощью jregistrykey), переведенная версия этого сценария PowerShell должна делать то, что вы хотите.