2013-06-05 6 views
2

У меня есть код Java, который открывает шаблон первенствовать по aspose library (он прекрасно работает):Aspose с RJB (Ruby Java Bridge) не работает

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 (Рубин Java Bridge):

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: [email protected] (FileNotFoundException) 
    from aspose-test.rb:57:in `<main>' 

Почему? Я запускаю тот же код ... но в Ruby не работает! Как это исправить?

Update:

В documentation есть инициализатор: Рабочая тетрадь (java.io.InputStreamstream) ... но это не работает в RJB. (Как это возможно?)

ответ

4

Ваша программа должна была работать, но я не мог найти причин, почему этого не произошло, и я изучаю ее.

Теперь альтернативный подход.

Подход 1 Использовать конструктор рабочей книги (String) вместо рабочей книги (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 как Developer Evangelist.

+0

Мне нужно открыть файл в памяти ... создать пользовательскую библиотеку классов Java ... спасибо! –

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) 
+0

Да ... Я пробовал ... ошибка, когда я вызываю 'wb = workbook.new (fin)' ... Я передаю FileInputStream в качестве аргумента. –

+0

Ваш объект 'fin' в хорошем состоянии? Можете ли вы прочитать это в Ruby? –