2010-01-11 1 views
3

Какие инструменты доступны для преобразования таблицы OpenOffice или Excel (со всеми ее формулами) в объект Java, который можно вызвать во время выполнения?преобразовать формулы таблиц в java

Очевидно, что это будет делать только вычислительный механизм и просто будет содержать цифры и текст, а не время или вызовы API.

Даже если диапазоны названных ячеек используются для (эффективно) имен переменных, выходной код, вероятно, будет трудно понять. Для этого потребуется рефакторинг, чтобы он больше похож на обычный Java-код. Однако я думаю, что это было бы полезно для прототипирования некоторых заданий типа обработки данных. Или для внедрения некоторых вычислительных механизмов, поддерживаемых продвинутым пользователем Excel.

Редактировать: Тривиальный пример:

ВИД

 A    B    C    D 
1  Mortgage Value 100,000.00 
2  Interest rate 4.5% 
3  Type   Interest-only 
4  Years   3 
5  Regular payment 4,500.00 
6  Total interest 13,500.00 

ЭЛЕМЕНТОВ ИМЕНА

 A    B    C    D 
1  Mortgage Value VALUE 
2  Interest rate INTEREST 
3  Type   TYPE 
4  Years   YEARS 
5  Regular payment REGPYMT 
6  Total interest TOTALPYMT 

ФОРМУЛЫ

 A    B    C    D 
1  Mortgage Value 100,000.00 
2  Interest rate 4.5% 
3  Type   Interest-only 
4  Years   3 
5  Regular payment =VALUE*INTEREST 
6  Total interest =YEARS*REGPYMT 

воплотится в Java, как что-то вроде:

package example.calcengine; 
import java.math.*; 
public class MyCalcEngine { 

    // unnamed cells 
    public String A1 = "Mortgage Value"; 
    public String A2 = "Interest rate"; 
    public String A3 = "Type"; 
    public String A4 = "Years"; 
    public String A5 = "Regular payment"; 
    public String A6 = "Total interest"; 

    // named cells 
    public BigDecimal VALUE = new BigDecimal(100000.00); 
    public BigDecimal INTEREST = new BigDecimal(0.045); 
    public String TYPE = "Interest-only"; 
    public BigDecimal YEARS = new BigDecimal(3); 
    public BigDecimal REGPYMT = new BigDecimal(0); 
    public BigDecimal TOTALPYMT = new BigDecimal(0); 

    // formulas 
    public void calculate() { 
     REGPYMT = VALUE.multiply(INTEREST); 
     TOTALPYMT = REGPYMT.multiply(YEARS); 
    } 
} 

Я бы предположить, фиксированный тип для клеток - либо java.math.BigDecimal или String.

+0

Пожалуйста, добавьте пример, показывающий источник таблицы и что кода, который вы ожидаете получить. –

+0

Именование сот является стандартной функцией в Excel.Я использовал BigDecimal в примере, чтобы уменьшить проблемы с округлением (esp currency calcs). – martinr

+0

Очевидно, что приведенный выше пример генерации кода имеет фундаментальный недостаток, что он не представляет лист с использованием 2D-массива в классе Java. Это должно было бы сделать это (и скрыть доступ к ячейкам по ячейкам для геттеров и сеттеров), чтобы поддерживать SUM, MATCHes, LOOKUP или что-либо, ссылающееся на диапазоны ячеек. – martinr

ответ

4
  • Проект POI Apache предоставляет код Java, который может читать (в основном) таблицы Excel.

  • Другой проект, Jacob, предоставляет интерфейс Java для автоматизации COM произвольных программ Windows, конечно, включая Excel. Вы, по сути, работаете с API Excel извне, на Java.

+0

Я замечаю, что POI выполняет некоторую базовую оценку формулы и поддерживает расширение POI для добавления более расширенной поддержки формул с использованием подхода типа плагина. Это потрясающе. Спасибо. – martinr

1

Мы сделали подобный проект с SmartXLS for java. У него был механизм расчета времени выполнения и поддержка надстроек. Исходная рабочая тетрадь преобразуется в класс java, который может быть встроен в java-программу и вызовы с параметрами, как и вход в Excel.

1

Еще один вариант: Expr4J. Он реализует синтаксический анализатор выражений общего назначения, который совместим с Excel и имеет механизм зависимостей для вычисления графов выражений. Он также реализует обширные функции встроенных функций Excel.

с веб-сайта, примером может служить:

public class DependencyExample 
{ 
    public static void main(String[] args) throws Exception { 
     DependencyEngine e = new DependencyEngine(new BasicEngineProvider()); 
     e.set("B1", "=A1*2"); 
     e.set("A1", "=12*2"); 
     e.set("C1", "=B1*A1"); 
     System.out.println(e.getValue(Range.valueOf("B1"))); 
     System.out.println(e.getValue(Range.valueOf("C1"))); 
     e.set("A1", "2"); 
     System.out.println(e.getValue(Range.valueOf("B1"))); 
     System.out.println(e.getValue(Range.valueOf("C1"))); 
    } 
} 

(я работаю над проектом так, очевидно, будет заинтересован в какой-либо обратной связи)


+0

Каков статус этого проекта? Где находится источник? –