首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用RubyXL加载Axlsx创建的文件时读取工作表名称

使用RubyXL加载Axlsx创建的文件时读取工作表名称
EN

Stack Overflow用户
提问于 2013-05-27 13:48:22
回答 1查看 3.1K关注 0票数 2

我在通过RubyXL读取用Axlsx模块创建的excel文件时遇到了一些问题。

代码语言:javascript
复制
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中不是这样的。

代码语言:javascript
复制
#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,[])

我把它换成了

代码语言:javascript
复制
#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,[])
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-07 23:46:00

如果您查看axlsx文档的XML文件与标准Excel工作簿的XML文件,您会发现它们略有不同。我认为RubyXL没有正确地解析工作簿,因为工作簿缺少一些普通Excel文件应该具有的节点/属性:

workbook.xml (普通Excel版本)

代码语言:javascript
复制
<?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版本)

代码语言:javascript
复制
<?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解析文档的方式有问题。

代码语言:javascript
复制
require 'win32ole'

ex = WIN32OLE.new("Excel.Application")
wb = ex.workbooks.open("simple.xlsx")
wb.worksheets.each do |ws|
  puts ws.name
end

输出:

代码语言:javascript
复制
My Sheet1
My Sheet 2
=> nil
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16767009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档