2015-01-08 2 views
4

Можно ли вызывать функции Excel из командной строки?Выполнение командной строки функций Excel

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

Например, я хотел бы его, если бы существовал способ сделать что-то вроде этого:

$ excel roman(15) 
XV 

$ excel randbetween(10,20) 
14 

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

  1. Существуют ли какие-либо собственные приложения (либо на Linux или Windows, но предпочтительно кросс-платформенный), что предоставляют такого рода варианты?

  2. Или есть способ, которым мы можем управлять сам первенствует сделать это (хотя, основываясь на то, что я искал, это, кажется, не возможно)?

+0

Возможно, возможно с LibreOffice (что может быть написано на Python). Но это слухи, я не знаю деталей. –

+1

Если ваши формулы такие простые, вы можете закодировать их на каком-то другом языке (Common Lisp, Python, Lua, C++, ...) –

+0

Если вы просто хотите, чтобы функции и не взаимодействовать с файлами excel, я бы также предложил посмотреть на что-то вроде Python. – Holloway

ответ

3

libformula, вероятно, хорошее место для начала. Вот доказательство концепции:

$ excel 'TRIM(" abc 123 ")' 
abc 123 

где excel это простой скрипт:

#!/bin/sh 

java -cp /usr/share/java/commons-logging.jar:libformula/demo:libbase/dist/libbase-6.1-SNAPSHOT.jar:libformula/dist/libformula-6.1-SNAPSHOT.jar:/home/cwarden/git/excel/src org.xerus.excel.Excel "$1" 

и org.xerus.excel.Excel принимает строку из ARGV и оценивает его как формулу:

package org.xerus.excel; 

import org.pentaho.reporting.libraries.formula.EvaluationException; 
import org.pentaho.reporting.libraries.formula.Formula; 
import org.pentaho.reporting.libraries.formula.DefaultFormulaContext; 
import org.pentaho.reporting.libraries.formula.parser.ParseException; 

public class Excel { 
     public static void main(final String[] args) throws ParseException, EvaluationException { 
       final Formula f = new Formula(args[0]); 
       f.initialize(new DefaultFormulaContext()); 
       final Object o = f.evaluate(); 
       System.out.println(o); 
     } 
} 

libformula включает демо-программа, org.pentaho.reporting.libraries.formula.demo.PrintAllFunctions, которая выводит все поддерживаемые функции:

Category User-Defined 
ARRAYCONCATENATE, ARRAYCONTAINS, ARRAYLEFT, ARRAYMID, CSVARRAY, CSVTEXT, NORMALIZEARRAY, NULL, PARSEDATE, SEQUENCEQUOTER 
Category Information 
CHOOSE, COUNT, COUNTA, COUNTBLANK, ERROR, HASCHANGED, INDEX, ISBLANK, ISERR, ISERROR, ISEVEN, ISLOGICAL, ISNA, ISNONTEXT, ISNUMBER, ISODD, ISREF, ISTEXT, LOOKUP, NA, VALUE 
Category Rounding 
INT 
Category Mathematical 
ABS, ACOS, ACOSH, ASIN, ATAN, ATAN2, AVERAGE, AVERAGEA, COS, EVEN, EXP, LN, LOG10, MAX, MAXA, MIN, MINA, MOD, N, ODD, PI, POWER, SIN, SQRT, SUM, SUMA, VAR 
Category Text 
ARRAYRIGHT, ASC, CHAR, CLEAN, CODE, CONCATENATE, EXACT, FIND, FIXED, FIXED, LEFT, LEN, LOWER, MESSAGE, MID, PROPER, REPLACE, REPT, RIGHT, SEARCH, STRINGCOUNT, SUBSTITUTE, T, TEXT, TRIM, UNICHAR, UNICODE, UPPER, URLENCODE 
Category Date/Time 
DATE, DATEDIF, DATETIMEVALUE, DATEVALUE, DAY, DAYS, HOUR, MINUTE, MONTH, MONTHEND, NOW, PREVWEEKDAY, SECOND, TIME, TIMEVALUE, TODAY, WEEKDAY, YEAR, YESTERDAY 
Category Logical 
AND, FALSE, IF, IFNA, NOT, OR, TRUE, XOR 
Category Database 
BEGINSWITH, CONTAINS, ENDSWITH, EQUALS, IN, LIKE 
+0

Спасибо. Это похоже на то, что я хотел. – Mahesh

0

Один подход должен был бы написать скрипт (VBScript или другой среды сценариев) для:

  1. открыть экземпляр Excel (невидимом)
  2. добавить вашу строку в " =» знак
  3. депозит формула в ячейке
  4. вычислить таблицу
  5. отображение результата пользователю
  6. закрыть экземпляр Excel

    Для этого потребуется установить Excel или OneDrive для доступа.
+0

Не могли бы вы отредактировать свой ответ на примере? Я не совсем знаком с VBScript. Но я предполагаю, что это не очень отличается от VBA или VB. – Mahesh

1

Это может быть сделано на Java с использованием Apache POI документов Java API для Microsoft. Создайте рабочий лист Excel в памяти, прочитайте формулу из командной строки и распечатайте результат.

Программа ниже делает это:

package stackoverflow.excel.formula; 

import org.apache.poi.ss.usermodel.Cell; 
import org.apache.poi.ss.usermodel.CellValue; 
import org.apache.poi.ss.usermodel.FormulaEvaluator; 
import org.apache.poi.ss.usermodel.Row; 
import org.apache.poi.xssf.usermodel.XSSFSheet; 
import org.apache.poi.xssf.usermodel.XSSFWorkbook; 

public class Main { 

    public static void main(String[] args) { 
     String formula = args[0]; 

     // Create a cell and load the formula. 
     XSSFWorkbook workbook = new XSSFWorkbook(); 
     XSSFSheet sheet = workbook.createSheet(); 
     Row row = sheet.createRow(0); 
     Cell cell = row.createCell(0); 
     cell.setCellFormula(formula); 

     // Evaluate the formula. 
     FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator(); 
     CellValue cellValue = evaluator.evaluate(cell); 
     switch (cellValue.getCellType()) { 
     case Cell.CELL_TYPE_BOOLEAN: 
      System.out.println(cellValue.getBooleanValue()); 
      break; 
     case Cell.CELL_TYPE_NUMERIC: 
      System.out.println(cellValue.getNumberValue()); 
      break; 
     case Cell.CELL_TYPE_STRING: 
      System.out.println(cellValue.getStringValue()); 
      break; 
     default: 
      break; 
     } 
    } 

} 

Простой Maven pom.xml, чтобы построить и упаковать программу:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>stackoverflow</groupId> 
    <artifactId>excel_formula_cli</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <description>https://stackoverflow.com/questions/27843945/command-line-execution-of-excel-functions</description> 

    <dependencies> 
     <dependency> 
      <groupId>org.apache.poi</groupId> 
      <artifactId>poi-ooxml</artifactId> 
      <version>3.9</version> 
     </dependency> 
    </dependencies> 

    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-shade-plugin</artifactId> 
     <version>2.2</version> 
     <executions> 
      <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>shade</goal> 
      </goals> 
      <configuration> 
       <transformers> 
       <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
        <mainClass>stackoverflow.excel.formula.Main</mainClass> 
       </transformer> 
       </transformers> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 


</project> 

Пример использования:

Построить код с mvn clean package и выполнить с java -jar target/excel_formula_cli-0.0.1-SNAPSHOT.jar "YOUR FORMULA HERE"

У этого есть тяга что не все функции Excel поддерживаются. Например, функция ROMAN() не реализована.

java -jar target/excel_formula_cli-0.0.1-SNAPSHOT.jar "6*7" => 42,0

java -jar target/excel_formula_cli-0.0.1-SNAPSHOT.jar "roman(15)" =>org.apache.poi.ss.formula.eval.NotImplementedException: РОМАН

java -jar target/excel_formula_cli-0.0.1-SNAPSHOT.jar "randbetween(10,20)" => 19,0

Если все в порядке с ограничениями формулы поддержки Apache POI, это обеспечит портативное решение кросс-платформенный. См. Developing Formula Evaluation - Appendix A для списка поддерживаемых функций.

Смежные вопросы