我有一个Java代码,可以通过aspose library打开一个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中不起作用!我该如何解决这个问题?
更新
在documentation中有初始化程序:Workbook(java.io.InputStreamstream)...但它在RJB中不起作用。 (这怎么可能?)
答案 0 :(得分: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项目,让我们说“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文件的同一文件夹中。您可以从方法返回一个String,并检查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担任开发者布道者。
答案 1 :(得分: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)