3

我有一个 Java 代码,它通过aspose 库打开一个 excel 模板(它运行完美):

import com.aspose.cells.*;
import java.io.*;

public class test
{
    public static void main(String[] args) throws Exception
    {
        System.setProperty("java.awt.headless", "true");
        FileInputStream fstream = new FileInputStream("/home/vmlellis/Testes/aspose-cells/template.xlsx");
        Workbook workbook = new Workbook(fstream);
        workbook.save("final.xlsx");
    }
}

在我使用RJB(Ruby Java Bridge)在 Ruby 上运行它之后:

require 'rjb'

#RJM Loading
JARS = Dir.glob('./jars/*.jar').join(':')
print JARS
Rjb::load(JARS, ['-Xmx512M'])

system = Rjb::import('java.lang.System')
file_input = Rjb::import('java.io.File')
file_input_stream = Rjb::import('java.io.FileInputStream')
workbook = Rjb::import('com.aspose.cells.Workbook')

system.setProperty("java.awt.headless", "true")
file_path = "/home/vmlellis/Testes/aspose-cells/template.xlsx"
file = file_input.new(file_path)
fin = file_input_stream.new(file)

wb = workbook.new(fin)

我收到此错误:

test.rb:57:in `new': Can't find file: java.io.FileInputStream@693a317a. (FileNotFoundException)
    from aspose-test.rb:57:in `<main>'

为什么?我运行相同的代码......但在 Ruby 中不起作用!我该如何解决?

更新:

文档中有初始化程序: Workbook(java.io.InputStreamstream)... 但它在 RJB 中不起作用。(这怎么可能?)

4

2 回答 2

4

你的程序应该可以工作,但我找不到任何原因,所以我正在调查它。

现在替代方法。

方法 1 使用 Workbook(String) 构造函数而不是 Workbook(FileInputStream)。这在我结束时完美无缺。示例代码是

require 'rjb'

#RJM Loading
JARS = Dir.glob('/home/saqib/cellslib/*.jar').join(':')
print JARS
Rjb::load(JARS, ['-Xmx512M'])

system = Rjb::import('java.lang.System')
workbook = Rjb::import('com.aspose.cells.Workbook')

system.setProperty("java.awt.headless", "true")
file_path = "/home/saqib/rjb/template.xlsx"
save_path = "/home/saqib/rjb/final.xlsx"

wb = workbook.new(file_path)
wb.save(save_path)

方法 2 编写一个新的 Java 类库。在里面写下你所有的 Aspose.Cells 相关代码。公开需要从 Ruby (RJB) 调用的非常简单和基本的方法。为什么?

  • 用本地 Java 语言编写程序很容易。如果使用 RJB,则需要进行大量的代码转换
  • 在 Java 中调试和测试很容易。
  • RJB 的使用仅限于调用您自己的 Java 库中的方法。RJB 代码将是小而基本的。

使用自己的库的类似示例 创建一个新的 Java 项目,让我们说“cellstest”。在其中添加一个新的公共类。

package cellstest;
import com.aspose.cells.Workbook;
public class AsposeCellsUtil 
{
    public String doSomeOpOnWorkbook(String inFile, String outFile)
    {
        String result = "";
        try
        {
            // Load the workbook
            Workbook wb = new Workbook(inFile);
            // Do some operation with this workbook
            // ..................
            // Save the workbook
            wb.save(outFile);
            // everything ok.
            result = "ok";
        }
        catch(Exception ex)
        {
            // Return the exception to calling program
            result = ex.toString();
        }
        return result;
    }
}

像这样,为每个操作添加任意数量的方法。构建项目并将“cellstest.jar”复制到您复制 Aspose.Cells jar 文件的同一文件夹中。您可以从您的方法中返回一个字符串,并在 Ruby 程序中检查返回值是否成功或错误代码。Ruby 程序现在就像

require 'rjb'

#RJM Loading
JARS = Dir.glob('/home/saqib/cellslib/*.jar').join(':')
print JARS
Rjb::load(JARS, ['-Xmx512M'])

system = Rjb::import('java.lang.System')
AsposeCellsUtil = Rjb::import('cellstest.AsposeCellsUtil')

system.setProperty("java.awt.headless", "true")
file_path = "/home/saqib/rjb/template.xlsx"
save_path = "/home/saqib/rjb/final.xlsx"

# initialize instance
asposeCellsUtil = AsposeCellsUtil.new()
# call methods
result = asposeCellsUtil.doSomeOpOnWorkbook(file_path, save_path)

puts result

PS。我为 Aspose 工作,担任开发人员宣传员。

于 2013-06-07T10:32:45.270 回答
1

在您的 Java 代码中,您将文件名字符串传递给 FileInputStream() 构造函数:

FileInputStream fstream = new FileInputStream("/home/vmlellis/Testes/aspose-cells/template.xlsx");

在您的 Ruby 代码中,您传递一个文件对象:

file = file_input.new(file_path)
fin = file_input_stream.new(file)

您是否尝试过在 Java 中做同样的事情?

fin = file_input_stream.new(file_path)
于 2013-06-06T17:53:47.690 回答