我想在Linux下用Ruby插入现有Excel(.xls)文件的数据。这个文件已有数据,它有一些格式属性,它包含宏。
我尝试使用电子表格gem将数据插入到文件中,但是当我保存修改时,文件的格式和所有宏都将丢失。
以下是我遇到此问题的简单修改示例:
book = Spreadsheet.open('myOriginalFile.xls')
sheet = book.worksheet 0
sheet.write('C12','hello')
book.write('myModifiedFile.xls')
我尝试了很多东西,在论坛和网络上做过研究,但我找不到解决方案...... 有没有人有想法?
答案 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'