lib/rubyXL/writer/worksheet_writer.rb in rubyXL-1.2.10 vs lib/rubyXL/writer/worksheet_writer.rb in rubyXL-2.1.1

- old
+ new

@@ -1,230 +1,41 @@ -require 'rubygems' -require 'nokogiri' - module RubyXL module Writer - class WorksheetWriter - attr_accessor :dirpath, :filepath, :sheet_num, :workbook, :worksheet + class WorksheetWriter < GenericWriter - def initialize(dirpath, wb, sheet_num=1) - @dirpath = dirpath - @workbook = wb - @sheet_num = sheet_num - @worksheet = @workbook.worksheets[@sheet_num] - @filepath = dirpath + '/xl/worksheets/sheet'+(sheet_num+1).to_s()+'.xml' + def initialize(workbook, sheet_index = 0) + @workbook = workbook + @sheet_index = sheet_index + @worksheet = @workbook.worksheets[@sheet_index] end - def write() - builder = Nokogiri::XML::Builder.new do |xml| - xml.worksheet('xmlns'=>"http://schemas.openxmlformats.org/spreadsheetml/2006/main", - 'xmlns:r'=>"http://schemas.openxmlformats.org/officeDocument/2006/relationships", - 'xmlns:mc'=>"http://schemas.openxmlformats.org/markup-compatibility/2006", - 'xmlns:mv'=>"urn:schemas-microsoft-com:mac:vml", - 'mc:Ignorable'=>'mv', - 'mc:PreserveAttributes'=>'mv:*') { - col = 0 - @worksheet.sheet_data.each do |row| - if row.size > col - col = row.size - end - end - row = Integer(@worksheet.sheet_data.size) - dimension = 'A1:' - dimension += Cell.convert_to_cell(row-1,col-1) - xml.dimension('ref'=>dimension) - xml.sheetViews { - view = @worksheet.sheet_view - if view.nil? || view[:attributes].nil? - xml.sheetView('tabSelected'=>1,'view'=>'normalLayout','workbookViewId'=>0) - raise 'end test' #TODO remove - else - view = view[:attributes] - if view[:view].nil? - view[:view] = 'normalLayout' - end + def filepath + File.join('xl', 'worksheets', "sheet#{@sheet_index + 1}.xml") + end - if view[:workbookViewId].nil? - view[:workbookViewId] = 0 - end + def ooxml_object + @worksheet + end - if view[:zoomScale].nil? || view[:zoomScaleNormal].nil? - view[:zoomScale] = 100 - view[:zoomScaleNormal] = 100 - end +=begin + root << xml.create_element('sheetFormatPr', { :baseColWidth => 10, :defaultRowHeight => 13 }) + root << xml.create_element('sheetCalcPr', { :fullCalcOnLoad => 1 }) + root << xml.create_element('pageMargins', { :left => 0.75, :right => 0.75, :top => 1, :bottom => 1, + :header => 0.5, :footer => 0.5 }) + root << xml.create_element('pageSetup', { :orientation => 'portrait', + :horizontalDpi => 4294967292, :verticalDpi => 4294967292 }) - if view[:tabSelected].nil? - view[:tabSelected] = 1 - end - - xml.sheetView('tabSelected'=>view[:tabSelected], - 'view'=>view[:view], - 'workbookViewId'=>view[:workbookViewId], - 'zoomScale'=>view[:zoomScale], - 'zoomScaleNormal'=>view[:zoomScaleNormal]) { - #TODO - #can't be done unless I figure out a way to programmatically add attributes. - #(can't put xSplit with an invalid value) - # unless @worksheet.pane.nil? - # xml.pane('state'=>@worksheet.pane[:state]) - # end - # unless view[:selection].nil? - # xml. - # end - } - end - } - xml.sheetFormatPr('baseColWidth'=>'10','defaultRowHeight'=>'13') - - unless @worksheet.cols.nil? || @worksheet.cols.size==0 - xml.cols { - if !@worksheet.cols.is_a?(Array) - @worksheet.cols = [@worksheet.cols] - end - @worksheet.cols.each do |col| - if col[:attributes][:customWidth].nil? - col[:attributes][:customWidth] = '0' - end - if col[:attributes][:width].nil? - col[:attributes][:width] = '10' - col[:attributes][:customWidth] = '0' - end - # unless col[:attributes] == {} - xml.col('style'=>@workbook.style_corrector[col[:attributes][:style].to_s].to_s, - 'min'=>col[:attributes][:min].to_s, - 'max'=>col[:attributes][:max].to_s, - 'width'=>col[:attributes][:width].to_s, - 'customWidth'=>col[:attributes][:customWidth].to_s) - # end - end - } - end - - xml.sheetData { - i=0 - @worksheet.sheet_data.each_with_index do |row,i| - #TODO fix this spans thing. could be 2:3 (not necessary) - if @worksheet.row_styles[(i+1).to_s].nil? - @worksheet.row_styles[(i+1).to_s] = {} - @worksheet.row_styles[(i+1).to_s][:style] = '0' - end - custom_format = '1' - if @worksheet.row_styles[(i+1).to_s][:style] == '0' - custom_format = '0' - end - - @worksheet.row_styles[(i+1).to_s][:style] = @workbook.style_corrector[@worksheet.row_styles[(i+1).to_s][:style].to_s] - row_opts = { - 'r'=>(i+1).to_s, - 'spans'=>'1:'+row.size.to_s, - 'customFormat'=>custom_format - } - unless @worksheet.row_styles[(i+1).to_s][:style].to_s == '' - row_opts['s'] = @worksheet.row_styles[(i+1).to_s][:style].to_s - end - unless @worksheet.row_styles[(i+1).to_s][:height].to_s == '' - row_opts['ht'] = @worksheet.row_styles[(i+1).to_s][:height].to_s - end - unless @worksheet.row_styles[(i+1).to_s][:customheight].to_s == '' - row_opts['customHeight'] = @worksheet.row_styles[(i+1).to_s][:customHeight].to_s - end - xml.row(row_opts) { - row.each_with_index do |dat, j| - unless dat.nil? - #TODO do xml.c for all cases, inside specific. - # if dat.formula.nil? - dat.style_index = @workbook.style_corrector[dat.style_index.to_s] - c_opts = {'r'=>Cell.convert_to_cell(i,j), 's'=>dat.style_index.to_s} - unless dat.datatype.nil? || dat.datatype == '' - c_opts['t'] = dat.datatype - end - xml.c(c_opts) { - unless dat.formula.nil? - if dat.formula_attributes.nil? || dat.formula_attributes.empty? - xml.f dat.formula.to_s - else - xml.f('t'=>dat.formula_attributes['t'].to_s, 'ref'=>dat.formula_attributes['ref'], 'si'=>dat.formula_attributes['si']).nokogiri dat.formula - end - end - if(dat.datatype == 's') - unless dat.value.nil? #empty cell, but has a style - xml.v @workbook.shared_strings[dat.value].to_s - end - elsif(dat.datatype == 'str') - xml.v dat.value.to_s - elsif(dat.datatype == '') #number - xml.v dat.value.to_s - end - } - # - # else - # xml.c('r'=>Cell.convert_to_cell(i,j)) { - # xml.v dat.value.to_s - # } - # end #data.formula.nil? - end #unless dat.nil? - end #row.each_with_index - } - end - } - - - xml.sheetCalcPr('fullCalcOnLoad'=>'1') - - unless @worksheet.merged_cells.nil? || @worksheet.merged_cells.size==0 - #There is some kind of bug here that when merged_cells is sometimes a hash and not an array - #initial attempt at a fix fails in corrupted excel documents leaving as is for now. - xml.mergeCells { - @worksheet.merged_cells.each do |merged_cell| - xml.mergeCell('ref'=>merged_cell[:attributes][:ref].to_s) - end - } - end - - xml.phoneticPr('fontId'=>'1','type'=>'noConversion') - - unless @worksheet.validations.nil? - xml.dataValidations('count'=>@worksheet.validations.size.to_s) { - @worksheet.validations.each do |validation| - xml.dataValidation('type'=>validation[:attributes][:type], - 'sqref'=>validation[:attributes][:sqref], - 'allowBlank'=>Integer(validation[:attributes][:allowBlank]).to_s, - 'showInputMessage'=>Integer(validation[:attributes][:showInputMessage]).to_s, - 'showErrorMessage'=>Integer(validation[:attributes][:showErrorMessage]).to_s) { - unless validation[:formula1].nil? - xml.formula1 validation[:formula1] - end - } - end - } - end - - xml.pageMargins('left'=>'0.75','right'=>'0.75','top'=>'1', - 'bottom'=>'1','header'=>'0.5','footer'=>'0.5') - - xml.pageSetup('orientation'=>'portrait', - 'horizontalDpi'=>'4294967292', 'verticalDpi'=>'4294967292') - - unless @worksheet.legacy_drawing.nil? - xml.legacyDrawing('r:id'=>@worksheet.legacy_drawing[:attributes][:id]) - end - unless @worksheet.extLst.nil? - xml.extLst { - xml.ext('xmlns:mx'=>"http://schemas.microsoft.com/office/mac/excel/2008/main", - 'uri'=>"http://schemas.microsoft.com/office/mac/excel/2008/main") { - xml['mx'].PLV('Mode'=>'1', 'OnePage'=>'0','WScale'=>'0') - } - } + root << (xml.create_element('extLst') { |extlst| + extlst << (xml.create_element('ext', { + 'xmlns:mx' => 'http://schemas.microsoft.com/office/mac/excel/2008/main', + 'uri' => 'http://schemas.microsoft.com/office/mac/excel/2008/main' }) { |ext| + ext << xml.create_element('mx:PLV', { :Mode => 1, :OnePage => 0, :WScale => 0 }) + }) + }) end - } - end - contents = builder.to_xml - contents = contents.gsub(/\n/,'') - contents = contents.gsub(/>(\s)+</,'><') - contents = contents.sub(/<\?xml version=\"1.0\"\?>/,'<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'+"\n") - contents - end +=end - end + end # class + end -end +end \ No newline at end of file