2012-11-08 27 views
6

Rubyで既存のExcel(.xls)ファイルをLinuxに挿入したい。このファイルにはすでにデータがあり、いくつかのフォーマットプロパティがあり、マクロが含まれています。マクロを含む既存のExcelの.xlsファイルに書き込む

スプレッドシートの宝石を使用してファイルにデータを挿入しようとしましたが、変更を保存すると、ファイルのフォーマットとすべてのマクロが失われます。

ここに私はこの問題を満たす簡単な変更の例です: がい...私は、物事の多くを試してみましたフォーラムの研究やウェブをしましたが、私は解決策を見つけられませんでした

book = Spreadsheet.open('myOriginalFile.xls') 
sheet = book.worksheet 0 
sheet.write('C12','hello') 
book.write('myModifiedFile.xls') 

誰もがアイデアを持っている?

+0

私はXLSのことは知らないが、私はしばらく前にODTで成功を収めました。 Odtファイルは、基本的には編集可能なXMLを含むアーカイブです。 – jsj

+0

@ trideceth12:xlsxで可能なことはわかりましたがxlsxファイルで作業する必要がありました... – Jerem

答えて

4

私は解決策を見つけた:

私はrjb宝石(ルビーとJavaライブラリを使用することができますRubyのJavaブリッジ、)とJavaで書かれているのApacheのPOIライブラリを使用しています。 POIでは、既存のxlsファイルのマクロや数式を保持し、変更することができます。必要な人のために

は、ここにPOIを使用するようにRJBを設定する方法は次のとおりです。

# JVM loading 
    apache_poi_path = File.dirname(__FILE__)+'/poi-3.8/poi-3.8-20120326.jar' 
    Rjb::load("#{apache_poi_path}", ['-Xmx512M']) 

    # Java classes import 
    @file_class = Rjb::import('java.io.FileOutputStream') 
    @workbook_class = Rjb::import('org.apache.poi.hssf.usermodel.HSSFWorkbook') 
    @poifs_class = Rjb::import('org.apache.poi.poifs.filesystem.POIFSFileSystem') 
    Rjb::import('org.apache.poi.hssf.usermodel.HSSFCreationHelper') 
    Rjb::import('org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator') 
    @cell_reference_class = Rjb::import('org.apache.poi.hssf.util.CellReference') 
    @cell_class = Rjb::import('org.apache.poi.hssf.usermodel.HSSFCell') 
    # You can import all java classes that you need 

    # Java classes utilisation : 
    @file_input_class = Rjb::import('java.io.FileInputStream') 
    @file_input = @file_input_class.new(model_file_path) 
    @fs = @poifs_class.new(@file_input) 
    @book = @workbook_class.new(@fs) 

    @worksheet = @book.getSheet('worksheet') 
    # ... 
    # You can use your objects like in Java but with a ruby syntax 
+0

本当に2つの技術を使ってExcelファイルにデータを書きたいのですか? – bmalets

+0

なぜC++、PHP、Erlang、Python、またはBasicモジュールを使用しなかったのですか? :D – bmalets

+0

なぜ-1?これはこの問題のために働く唯一の解決策です... – Jerem

2

変更したファイルを新しいファイル名で書き込む必要があります。 this

をチェックしてくださいあなたは1枚以上のものを持っている場合、あなたは他のシートを数枚と

XLSを書き換えるだけシートの1つを変更(および は、他のデータに手を触れないでください)する必要があり、決して、そのスプレッドシートは "覚えている" 他のシートにあるものは何もありません。変更されていない シートも書き込む必要があります。そうしないと予期しないことが起こります。

Ergo:修正されたシートを書き出し、 シートを含むスプレッドシートでXLSを変更するときに、改訂されていない完全な シートを再度書き込んでください。

+0

私はすでにこれが好きで、動作しません(元のファイル名は "複数のシートがある場合は、「myModifiedFile.xls」、新しいファイル名は「myModifiedFile.xls」) – Jerem

+0

また、他のシートを書き直す必要がある場合や、必要がない場合は削除するだけです。 –

+0

ご協力いただきありがとうございます。私はそれを行い、フォーマットの問題を解決しましたが、マクロはとにかく失われています... – Jerem

1

Axlsx普通の.xlsを編集できるかどうかわからないかもしれませんが、数週間前にいくつかの作業をしましたが、これは私が作業していたxlsxの驚異になりました。

+1

Thanks @Eugeneしかし、私はAxlsxで試してみました。xlsxファイル – Jerem

1

あなただけの、既存のファイルを開くファイルに変更内容を書き込み、別の名前で保存する必要があります。 たとえば、サーバー上にtemplate.xlsファイルがあります。

簡単な作業例(あなた.rbのファイルに近いtemplate.xlsを持っている必要があります):

 

#edit_xls.rb 
require 'rubygems' 
require 'spreadsheet' 

book = Spreadsheet.open 'template.xls' 
sheet = book.worksheet 0 
sheet[0,0] = 'qweqeqw' 
book.write 'edited.xls' 
 
+0

これはまさに私がやろうとしたもので、マクロはこのように失われています。 – Jerem