lib/workbook/writers/xls_writer.rb in workbook-0.4.6.0 vs lib/workbook/writers/xls_writer.rb in workbook-0.4.7
- old
+ new
@@ -3,19 +3,20 @@
module Workbook
module Writers
module XlsWriter
- # Generates an Spreadsheet (from the spreadsheet gem) in order to build an XlS
+ # Generates an Spreadsheet (from the spreadsheet gem) in order to build an xls
#
# @param [Hash] options A hash with options (unused so far)
# @return [Spreadsheet] A Spreadsheet object, ready for writing or more lower level operations
def to_xls options={}
book = init_spreadsheet_template
self.each_with_index do |s,si|
- xls_sheet = book.worksheet si
- xls_sheet = book.create_worksheet if xls_sheet == nil
+ xls_sheet = xls_sheet(si)
+ xls_sheet.name = s.name
+
s.table.each_with_index do |r, ri|
xls_sheet.row(ri).height= r.format[:height] if r.format
r.each_with_index do |c, ci|
if c
if r.first?
@@ -25,11 +26,28 @@
xls_sheet.row(ri)[ci] = c.value
xls_sheet.row(ri).set_format(ci, format_to_xls_format(c.format))
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))
+ 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)
+ # 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
+ end
book
end
# Generates an Spreadsheet (from the spreadsheet gem) in order to build an XlS
#
@@ -47,15 +65,39 @@
xlsfmt.pattern_fg_color = html_color_to_xls_color(f[:background_color]) if html_color_to_xls_color(f[:background_color])
xlsfmt.pattern = 1 if html_color_to_xls_color(f[:background_color])
xlsfmt.number_format = strftime_to_ms_format(f[:number_format]) if f[:number_format]
xlsfmt.text_direction = f[:text_direction] if f[:text_direction]
xlsfmt.font.name = f[:font_family].split.first if f[:font_family]
- xlsfmt.font.family = f[:font_family].split.last if f[:font_family]
- xlsfmt.font.color = html_color_to_xls_color(f[:color]) if f[:color]
+ xlsfmt.font.family = parse_font_family(f) if f[:font_family]
+ color = html_color_to_xls_color(f[:color])
+ xlsfmt.font.color = color if color
f.add_raw xlsfmt
end
return xlsfmt
end
+
+ # Parses right font-family name
+ #
+ # @param [Workbook::Format, hash] format to parse
+ def parse_font_family(format)
+ font = format[:font_family].to_s.split.last
+ valid_values = [:none,:roman,:swiss,:modern,:script,:decorative]
+ if valid_values.include?(font)
+ return font
+ elsif valid_values.include?(font.to_s.downcase.to_sym)
+ return font.to_s.downcase.to_sym
+ else
+ font = font.to_s.downcase.strip
+ translation = {
+ "arial"=>:swiss,
+ "times"=>:roman,
+ "times new roman"=>:roman
+ }
+ 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