2012-11-08 40 views
6

我想在Linux下使用Ruby將現有Excel(.xls)文件插入數據。這個文件已經有數據,它有一些格式屬性,它包含宏。在包含宏的現有Excel .xls文件中編寫

我試圖用電子表格gem將數據插入到文件中,但是當我保存修改時,文件的格式和所有宏都會丟失。

這裏有一個簡單的修改的例子,其中我遇到這樣的問題:

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:我看到它可能與odt(與xlsx太明顯),但我絕對必須使用xls文件... – Jerem

回答

4

我找到了一個解決方案:

我使用Apache的POI庫,它是用Java編寫與rjb寶石(紅寶石的Java Bridge,它允許使用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 
+0

你真的想用2種技術將數據寫入excell文件嗎? – bmalets

+0

爲什麼不使用C++,Php,Erlang,Python或Basic模塊? :D – bmalets

+0

爲什麼-1?這是適用於這個問題的唯一解決方案... – Jerem

2

您需要將修改後的文件寫入新的文件名。退房this

如果你有一個以上的表,你需要重寫其他工作表

XLS用幾張紙,但只能修改片中的一個(並且不 觸摸其他數據),有沒辦法,該電子表格「記住」 什麼是在其他表。你將不得不編寫未修改的 表,否則會發生意想不到的事情。

埃爾戈:寫改性片材,並且還重新寫入完整的未修飾 片,具有若干 片修改與電子表格的XLS時。

+0

我已經這樣做,它不起作用(這裏的原始文件名是「 myOriginalFile.xls「,新文件名稱爲」myModifiedFile.xls「) – Jerem

+0

如果您有多個工作表,您還需要重寫其他工作表或者如果您不需要他們,請將其刪除。 –

+0

感謝您的幫助。我做到了,它解決了格式的問題,但是宏仍然丟失了...... – Jerem

1

可能想要退房Axlsx不確定它是否能夠編輯plain .xls,但幾周前我做了一些工作,它爲我正在使用的xlsx創造了奇蹟。

+1

謝謝@Eugene,但我嘗試過使用Axlsx,它只適用於。xlsx文件 – Jerem

1

你只需要打開現有的文件,您的更改寫入文件,並用另一個名稱保存它。 例如在服務器上有template.xls文件。

簡單工作示例(需要有template.xls靠近你的.rb文件):

 

#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

相關問題