我正在通过RubyXL读取使用Axlsx模块创建的excel文件时遇到一些问题。具体代码是这个
require 'axlsx'
require 'RubyXL'
#Create the Excel doc with Axlsx with two sheets named My Sheet1 and My Sheet 2
Axlsx::Package.new do |p|
p.workbook.add_worksheet(:name => "My Sheet1") do |sheet|
sheet.add_row ["Simple Pie Chart"]
%w(first second third).each { |label| sheet.add_row [label, rand(24)+1] }
end
p.workbook.add_worksheet(:name => "My Sheet 2") do |sheet|
sheet.add_row ["Simple Pie Chart"]
%w(first second third).each { |label| sheet.add_row [label, rand(24)+1] }
end
p.serialize('simple.xlsx')
end
#Parse the above created Excel via RubyXL and print the names of the two sheets. This comes up blank
workbook = RubyXL::Parser.parse("simple.xlsx")
workbook.worksheets.each do |worksheet|
puts "Worksheet is #{worksheet.sheet_name}"
end
问题是工作表名称是空白的。如果我用axlsx创建后用MS Excel打开创建的Excel并保存它,那么RubyXL解析器能够正确读取工作表名称。似乎MS Excel正在以某种方式修复文档。
在通过Axlsx创建Excel时我是否遗漏了某些内容?
我使用的是axlsx版本1.3.6和rubyXL 1.2.10。
我还尝试在使用axlsx进行序列化之前添加p.use_shared_strings = true。
而不是在rubyXL的parser.rb中。
#sheet_names, dimensions
def Parser.create_matrix(wb,i, files)
sheet_names = files['app'].css('TitlesOfParts vt|vector vt|lpstr').children
sheet = Worksheet.new(wb,sheet_names[i].to_s,[])
我用
替换了它#sheet_names, dimensions
def Parser.create_matrix(wb,i, files)
sheet_names = []
files['workbook'].css('sheet').each do |sheet|
sheet_names.push sheet.attribute('name').to_s
end
sheet = Worksheet.new(wb,sheet_names[i].to_s,[])
这是正确的解决办法吗?
答案 0 :(得分:4)
如果查看axlsx
文档的XML文件与标准Excel工作簿的XML文件,您会发现它们有点不同。我认为RubyXL
没有正确解析工作簿,因为工作簿缺少普通Excel文件所具有的一些节点/属性:
workbook.xml(普通Excel版本)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
<fileVersion appName="xl" lastEdited="5" lowestEdited="5" rupBuild="9303"/>
<workbookPr defaultThemeVersion="124226"/>
<bookViews>
<workbookView xWindow="870" yWindow="840" windowWidth="22455" windowHeight="9630"/>
</bookViews>
<sheets>
<sheet name="My Sheet1" sheetId="1" r:id="rId1"/>
<sheet name="My Sheet 2" sheetId="2" r:id="rId2"/>
</sheets>
<calcPr calcId="0"/>
</workbook>
workbook.xml(axlsx版本)
<?xml version="1.0" encoding="UTF-8"?>
<workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
<workbookPr date1904="false"/>
<sheets>
<sheet name="My Sheet1" sheetId="1" r:id="rId1"/>
<sheet name="My Sheet 2" sheetId="2" r:id="rId2"/>
</sheets>
</workbook>
如果使用Ruby标准库win32ole
解析文档,它会提供正确的工作表名称,因此这必须是RubyXL解析文档的方式的问题。
require 'win32ole'
ex = WIN32OLE.new("Excel.Application")
wb = ex.workbooks.open("simple.xlsx")
wb.worksheets.each do |ws|
puts ws.name
end
<强>输出:强>
My Sheet1
My Sheet 2
=> nil