2015-01-08 68 views
4

可以从命令行调用Excel函数吗?Excel函数的命令行执行

我不想与任何文件进行任何交互。我只想用其他命令行工具的方式来使用这些函数。它应该只是为了一些一次性的目的。

举例来说,我想它,如果有一种方法可以做到这样的事情:

$ excel roman(15) 
XV 

$ excel randbetween(10,20) 
14 

当然,并非所有的可用功能,可以预计将这样运行了,但越多越好。

  1. 是否有任何本地应用程序(无论是在Linux或Windows,但最好的跨平台),其 提供这样的选择?

  2. 还是有我们可以操纵的Excel本身要做到这一点 (虽然,基于什么我已经搜查了上,这似乎并不 是可能的)什么办法?

+0

也许可以使用LibreOffice(这可能是Python脚本编写的)。但是这是一个谣言,我不知道细节 –

+1

如果你的公式很简单,你可以使用其他语言编写它们(Common Lisp,Python,Lua,C++,...) –

+0

如果你只是想要函数而不是与excel文件交互,我还建议寻找Python之类的东西。 – Holloway

回答

3

libformula可能是一个很好的开始。这里的概念证明:

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

其中excel这是简单的shell脚本:

#!/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 Microsoft Java文档的Java API完成。在内存中创建一个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:ROMAN

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

如果你是与Apache POI公式支持的局限性OK,这将提供一个便携式的跨平台解决方案。请参阅Developing Formula Evaluation - Appendix A以获取支持的功能列表。