写入包含宏的现有Excel .xls文件

时间:2012-11-08 14:36:59

标签: ruby-on-rails ruby linux spreadsheet export-to-excel

我想在Linux下用Ruby插入现有Excel(.xls)文件的数据。这个文件已有数据,它有一些格式属性,它包含宏。

我尝试使用电子表格gem将数据插入到文件中,但是当我保存修改时,文件的格式和所有宏都将丢失。

以下是我遇到此问题的简单修改示例:

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

我尝试了很多东西,在论坛和网络上做过研究,但我找不到解决方案...... 有没有人有想法?

4 个答案:

答案 0 :(得分:4)

我找到了解决方案:

我使用用POI gem编写的Apache的rjb库(Ruby Java Bridge,它允许使用带有ruby的java库)。 POI允许保留现有xls文件的宏和公式并进行修改。

对于那些需要的人,这里是如何设置rjb来使用POI:

    # 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

答案 1 :(得分:2)

您需要将修改后的文件写入新文件名。查看this

如果您有多张工作表,则需要重写其他工作表

XLS有几张,但只修改其中一张(不要 触摸其他数据),没有办法,电子表格“记得” 其他表中有什么。你必须写未经修改的 床单以及其他意外的事情都会发生。

Ergo:写下修改过的表格,并写下完整的未经修改的表格 在使用多个电子表格修改XLS时再次使用工作表 片材。

答案 2 :(得分:1)

可能想查看Axlsx不确定它是否能够编辑普通的.xls,但几周前我做了一些工作,它为我正在使用的xlsx创造了奇迹。

答案 3 :(得分: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'