2

Axlsx モジュールで作成された Excel ファイルを RubyXL 経由で読み取る際に問題が発生しています。具体的なコードはこれ

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 で作成した後、作成した Excel を MS Excel で開いて保存すると、RubyXL パーサーはシート名を正しく読み取ることができます。MS Excel が何らかの形でドキュメントを修正しているようです。

Axlsx を使用して Excel を作成するときに何か不足していますか?

axlsx バージョン 1.3.6 と ruby​​XL 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,[])

それは正しい修正ですか?

4

1 に答える 1

4

ドキュメントの XMLファイルaxlsxと標準の 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
于 2013-06-07T15:45:59.977 に答える