簡體   English   中英

Aspose with RJB(Ruby Java Bridge)無法正常工作

[英]Aspose with RJB (Ruby Java Bridge) is not working

我有一個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中不起作用。 (這怎么可能?)

您的程序應該可以運行,但是我找不到任何原因,所以我正在調查。

現在,替代方法。

方法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文件的文件夾中。 您可以從方法中返回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工作,擔任開發人員推廣人員。

在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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM