6

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

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

これが私がこの問題に遭遇する簡単な修正の例です:

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

私はたくさんのことを試し、フォーラムやWebで調査しましたが、解決策が見つかりませんでした...誰かアイデアがありますか?

4

4 に答える 4

4

私は解決策を見つけました:

私は、 rjb gem(Ruby Java Bridge、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
于 2012-11-19T10:17:39.347 に答える
2

変更したファイルを新しいファイル名に書き込む必要があります。これをチェックしてください

複数のシートがある場合は、他のシートを書き直す必要があります

複数のシートがあるXLSですが、シートの1つだけを変更します(他のデータには触れません)。スプレッドシートが他のシートの内容を「記憶」する方法はありません。変更されていないシートも作成する必要があります。そうしないと、予期しないことが発生します。

エルゴ:複数のシートを含むスプレッドシートでXLSを変更する場合は、変更されたシートを書き込み、変更されていない完全なシートを再度書き込みます。

于 2012-11-08T14:49:05.527 に答える
1

プレーンな.xlsを編集できるかAxlsxどうかわからない場合がありますが、数週間前にいくつかの作業を行いました。これは、作業していたxlsxに対して驚異的に機能しました。

于 2012-11-08T17:19:27.143 に答える
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'

于 2013-09-17T18:45:00.933 に答える