lib/workbook/writers/xls_writer.rb in workbook-0.4.7 vs lib/workbook/writers/xls_writer.rb in workbook-0.4.8

- old
+ new

@@ -28,29 +28,37 @@ end end end (xls_sheet.last_row_index + 1 - s.table.count).times do |time| row_to_remove = s.table.count+time - xls_sheet.row(row_to_remove).each_with_index do |c, ci| - xls_sheet.row(row_to_remove)[ci]=nil - end - - xls_sheet.delete_row(row_to_remove) - xls_sheet.row_updated(row_to_remove, xls_sheet.row(row_to_remove)) + remove_row(xls_sheet,row_to_remove) end xls_sheet.updated_from(s.table.count) xls_sheet.dimensions end - # kind of a hack, delting by popping from xls worksheet results in Excel-errors (not LibreOffice) + # kind of a hack, deleting by popping from xls worksheet results in errors in MS Excel (not LibreOffice) # book.worksheets.pop(book.worksheets.count - self.count) if book.worksheets and book.worksheets.count > self.count - book.worksheets.each_with_index do |sheet, si| - sheet.visibility = self[si] ? :visible : :strong_hidden + book.worksheets.each_with_index do |xls_sheet, si| + if self[si] + xls_sheet.visibility = :visible + else + xls_sheet.visibility = :strong_hidden + #also make sure all data is removed, in case someone finds out about this 'trick' + xls_sheet.name = "RemovedSheet#{si}" + (xls_sheet.last_row_index + 1).times do |row_index| + remove_row(xls_sheet,row_index) + end + end end + # even after removing the worksheet's content... which solved some incompatibilities, but not for popping worksheets + # book.worksheets.pop(book.worksheets.count - self.count) if book.worksheets and book.worksheets.count > self.count book end + + # Generates an Spreadsheet (from the spreadsheet gem) in order to build an XlS # # @param [Workbook::Format, Hash] f A Workbook::Format or hash with format-options (:font_weight, :rotation, :background_color, :number_format, :text_direction, :color, :font_family) # @return [Spreadsheet::Format] A Spreadsheet format-object, ready for writing or more lower level operations def format_to_xls_format f @@ -95,31 +103,10 @@ tfont = translation[font] return tfont ? tfont : :none end end - - # Attempt to convert html-hex color value to xls color number - # - # @param [String] hex color - # @return [String] xls color - def html_color_to_xls_color hex - Workbook::Readers::XlsShared::XLS_COLORS.each do |k,v| - return k if (v == hex or (hex and hex != "" and k == hex.to_sym)) - end - return nil - end - - # Converts standard (ruby/C++/unix/...) strftime formatting to MS's formatting - # - # @param [String, nil] numberformat (nil returns nil) - # @return [String, nil] - def strftime_to_ms_format numberformat - return nil if numberformat.nil? - return numberformat.gsub('%Y','yyyy').gsub('%A','dddd').gsub('%B','mmmm').gsub('%a','ddd').gsub('%b','mmm').gsub('%y','yy').gsub('%d','dd').gsub('%m','mm').gsub('%y','y').gsub('%y','%%y').gsub('%e','d') - end - # Write the current workbook to Microsoft Excel format (using the spreadsheet gem) # # @param [String] filename # @param [Hash] options see #to_xls def write_to_xls filename="#{title}.xls", options={} @@ -147,9 +134,19 @@ else t = Spreadsheet::Workbook.new template.add_raw t return t end + end + + private + + def remove_row(xls_sheet,row_index) + xls_sheet.row(row_index).each_with_index do |c, ci| + xls_sheet.row(row_index)[ci]=nil + end + xls_sheet.delete_row(row_index) + xls_sheet.row_updated(row_index, xls_sheet.row(row_index)) end end end end