6

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

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

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

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

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

4

4 回答 4

4

我找到了一个解决方案:

我使用 Apache 的POI库,它是用rjb gem(Ruby Java Bridge,它允许将 java 库与 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
于 2012-11-19T10:17:39.347 回答
2

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

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

XLS 有几张工作表,但只修改其中一张工作表(并且不要接触其他数据),没有办法,电子表格“记住”其他工作表中的内容。您还必须编写未修改的表格,否则会发生意想不到的事情。

尔格:在修改带有多个工作表的电子表格的 XLS 时,编写修改后的工作表并再次编写完整的未修改工作表。

于 2012-11-08T14:49:05.527 回答
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 回答
1

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

于 2012-11-08T17:19:27.143 回答