Выражение формулы Excel в Java (интерпретация десятичных чисел во времени) - PullRequest
1 голос
/ 30 сентября 2008

Я преобразовываю формулу листа Excel в Java, но я не могу понять, как Excel удается принять следующее: 0,22 Применяет формулу: = ТЕКСТ (R5 / 14, "ч: мм") и каким-то образом достигает: 0,22

Опять же, если я предоставлю: 2.8 прибывает в 4.48 Может кто-нибудь, пожалуйста, объясните мне, как это происходит. Я немного прочитал о десятичной дроби, и я понимаю преобразование, но это еще не помогло объяснить вышесказанное.

Ответы [ 5 ]

1 голос
/ 09 июня 2009

Или Abacus Formula Compiler для Java, который позволяет компилировать формулы в листах Excel вплоть до байтового кода Java для быстрого и простого вызова из ваших приложений Java (может компилироваться во время выполнения без JDK).

http://www.formulacompiler.org/

1 голос
/ 30 сентября 2008

Excel сохраняет значения даты и времени как:

  • Число слева от десятичной запятой представляет количество дней с 1 января 1900 года
  • Число справа от десятичной дроби представляет дробную часть 24-часового дня

В вашем примере вы конвертируете десятичное число в текстовое представление часовых и минутных частей значения даты и времени.

При работе по вашей первой формуле 0,22, деленное на 14 (зачем вы это делаете?), Равно 0,015714286. Если затем применить эту дробь к 24-часовому дню (умножить на 1440 минут), она будет равна 22 минутам и некоторым изменениям (т. Е. "0:22").

Используя вашу вторую формулу, 2,8, разделенное на 14, равно 0,2. Умноженное на 1440, оно равняется 288 минутам, то есть 4 часам и 48 минутам (то есть "4:48").

0 голосов
/ 30 сентября 2008

Очень хорошая документация внутренних таблиц может быть найдена в спецификации OpenFormula (которая документирует / определяет OpenOffice-Calc).

http://www.oasis -open.org / комитеты / documents.php? Wg_abbrev = офисно-формула

Если вы ищете библиотеку Java для оценки формул Excel, вам может пригодиться Apache-POI или LibFormula из Пентахо:

POI: http://poi.apache.org/

LibFormula: http://sourceforge.net/project/showfiles.php?group_id=51669&package_id=213669

0 голосов
/ 30 сентября 2008

Спасибо Creedence.

Работает с: двойной r = 0,22; double driveTime = (r / 14) * 1440;

0 голосов
/ 30 сентября 2008

Да, это немного глупо. Возьмите / 14, и это помогает. В основном 1 = 1 день, поэтому R5 выражается в 14-х числах дня. Вы могли бы, вероятно, сделать

int msInADay= 86400000;
Time value = new Time(R5/14 * msInADay);

но это не проверено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...