Как я могу создавать новые электронные таблицы в Ruby, используя гем Spreadsheet?

В частности, я пытаюсь добавить новые рабочие листы рядом с уже существующими. Я пытался использовать book.create_worksheet :name => 'new_sheet', но он перезаписывает предыдущий рабочий лист.

Я искал сайт здесь и увидел, что некоторые люди используют другой гем, который разрешает «book.add_worksheet» (гем электронных таблиц должен поддерживать другие гемы, например, он должен быть как 3 гемма в 1 или что-то в этом роде...) и это тоже почти сработало, но я получаю ошибку undefined method 'workbook=' for "new_sheet":String (NoMethodError) при выполнении строки sheet = book.add_worksheet("new_sheet").

Еще я пробовал sheet = Spreadsheet::Worksheet.new и вижу на странице rubyforge электронных таблиц, что есть общедоступный метод класса new(opts={}), который, если щелкнуть, чтобы увидеть код, включает строку @name = opts[:name] || Worksheet, что наводит меня на мысль, что я смогу использовать его для создания и присвоения имени новому рабочему листу, но я не могу понять правильный синтаксис.

Возможно ли то, что я пытаюсь? Кажется, я приближаюсь, но не совсем попадаю.


person antonymity    schedule 18.09.2010    source источник


Ответы (2)


book.create_worksheet(:name => 'unique_name') у меня работает!

book = Spreadsheet::Workbook.new
sheet1 = book.create_worksheet(:name => 'AAA')
sheet2 = book.create_worksheet(:name => 'BBB')


sheet1.row(0).concat %w{Name Country Acknowlegement}
sheet1[1,0] = 'Japan'
row = sheet1.row(1)
row.push 'Creator of Ruby'
row.unshift 'Yukihiro Matsumoto'
sheet1.row(2).replace [ 'Daniel J. Berger', 'U.S.A.',
                  'Author of original code for Spreadsheet::Excel' ]
sheet1.row(3).push 'Charles Lowe', 'Author of the ruby-ole Library'
sheet1.row(3).insert 1, 'Unknown'
sheet1.update_row 4, 'Hannes Wyss', 'Switzerland', 'Author'

sheet2.row(0).concat %w{NAME COUNYRY ACK}
sheet2[1,0] = 'JAPAN'
row = sheet2.row(1)
row.push 'CREATOR OF RUBY'
row.unshift 'YUKIHIRO MATSUMOTO'
sheet2.row(2).replace [ 'DANIEL J. BERGER', 'U.S.A.',
                  'AUTHOR OF ORIGINAL CODE FOR  Spreadsheet::Excel' ]
sheet2.row(3).push 'CHARLES LOWE', 'AUTHOR OF THE RUBY-OLE LIBRARY'
sheet2.row(3).insert 1, 'UNKNOWN'
sheet2.update_row 4, 'HANNES WYSS', 'SWITZERLAND', 'AUTHOR'

book.write '/Users/stephen/tmp/test2.xls'

Вышеупомянутое, почти дословно взятое из документации, работает очень хорошо.

person stephenr    schedule 19.09.2010
comment
Действительно, это будет работать для жестко закодированных листов. Думаю, мне следовало упомянуть, что я создавал их на лету с помощью инструмента, который пишу. Инструмент запрашивает имя для листа и создает его. Я выяснил свою предыдущую ошибку (я случайно переписал всю книгу), и теперь я столкнулся с несколькими разными результатами: если я пишу в то же имя файла, он становится поврежденным, и если я пишу в другое имя файла и пытаюсь чтобы переименовать его, я сталкиваюсь с ошибкой доступа. Кажется, я не могу найти близкий метод, соответствующий Spreadsheet.open, который, как я надеялся, избавит от ошибки доступа. Мысли? - person antonymity; 21.09.2010

Я обнаружил, что вы можете создать много листов с одной и той же переменной, вам просто нужно изменить имя, которое вы ей присвоили. Например:

статьи.каждое делать |искусство| лист1 = book.create_worksheet :name => арт.код конец

person Giancarlo Guzman    schedule 05.01.2016