Module: FastExcel
- Defined in:
- lib/fast_excel.rb
Defined Under Namespace
Modules: AttributeHelper, FormatExt, WorkbookExt, WorksheetExt Classes: Formula
Constant Summary collapse
- DEF_COL_WIDTH =
8.43
- XLSX_DATE_DAY =
seconds in 1 day
86400.0
- XLSX_DATE_EPOCH_DIFF =
days between 1970-jan-01 and 1900-jan-01
25569
- COLOR_ENUM =
Libxlsxwriter.enum_type(:defined_colors)
- EXTRA_COLORS =
{ alice_blue: 0xF0F8FF, antique_white: 0xFAEBD7, aqua: 0x00FFFF, aquamarine: 0x7FFFD4, azure: 0xF0FFFF, beige: 0xF5F5DC, bisque: 0xFFE4C4, black: 0x000000, blanched_almond: 0xFFEBCD, blue: 0x0000FF, blue_violet: 0x8A2BE2, brown: 0xA52A2A, burly_wood: 0xDEB887, cadet_blue: 0x5F9EA0, chartreuse: 0x7FFF00, chocolate: 0xD2691E, coral: 0xFF7F50, cornflower_blue: 0x6495ED, cornsilk: 0xFFF8DC, crimson: 0xDC143C, cyan: 0x00FFFF, dark_blue: 0x00008B, dark_cyan: 0x008B8B, dark_golden_rod: 0xB8860B, dark_gray: 0xA9A9A9, dark_grey: 0xA9A9A9, dark_green: 0x006400, dark_khaki: 0xBDB76B, dark_magenta: 0x8B008B, dark_olive_green: 0x556B2F, dark_orange: 0xFF8C00, dark_orchid: 0x9932CC, dark_red: 0x8B0000, dark_salmon: 0xE9967A, dark_sea_green: 0x8FBC8F, dark_slate_blue: 0x483D8B, dark_slate_gray: 0x2F4F4F, dark_slate_grey: 0x2F4F4F, dark_turquoise: 0x00CED1, dark_violet: 0x9400D3, deep_pink: 0xFF1493, deep_sky_blue: 0x00BFFF, dim_gray: 0x696969, dim_grey: 0x696969, dodger_blue: 0x1E90FF, fire_brick: 0xB22222, floral_white: 0xFFFAF0, forest_green: 0x228B22, fuchsia: 0xFF00FF, gainsboro: 0xDCDCDC, ghost_white: 0xF8F8FF, gold: 0xFFD700, golden_rod: 0xDAA520, gray: 0x808080, grey: 0x808080, green: 0x008000, green_yellow: 0xADFF2F, honey_dew: 0xF0FFF0, hot_pink: 0xFF69B4, indian_red: 0xCD5C5C, indigo: 0x4B0082, ivory: 0xFFFFF0, khaki: 0xF0E68C, lavender: 0xE6E6FA, lavender_blush: 0xFFF0F5, lawn_green: 0x7CFC00, lemon_chiffon: 0xFFFACD, light_blue: 0xADD8E6, light_coral: 0xF08080, light_cyan: 0xE0FFFF, light_golden_rod_yellow: 0xFAFAD2, light_gray: 0xD3D3D3, light_grey: 0xD3D3D3, light_green: 0x90EE90, light_pink: 0xFFB6C1, light_salmon: 0xFFA07A, light_sea_green: 0x20B2AA, light_sky_blue: 0x87CEFA, light_slate_gray: 0x778899, light_slate_grey: 0x778899, light_steel_blue: 0xB0C4DE, light_yellow: 0xFFFFE0, lime: 0x00FF00, lime_green: 0x32CD32, linen: 0xFAF0E6, magenta: 0xFF00FF, maroon: 0x800000, medium_aqua_marine: 0x66CDAA, medium_blue: 0x0000CD, medium_orchid: 0xBA55D3, medium_purple: 0x9370DB, medium_sea_green: 0x3CB371, medium_slate_blue: 0x7B68EE, medium_spring_green: 0x00FA9A, medium_turquoise: 0x48D1CC, medium_violet_red: 0xC71585, midnight_blue: 0x191970, mint_cream: 0xF5FFFA, misty_rose: 0xFFE4E1, moccasin: 0xFFE4B5, navajo_white: 0xFFDEAD, navy: 0x000080, old_lace: 0xFDF5E6, olive: 0x808000, olive_drab: 0x6B8E23, orange: 0xFFA500, orange_red: 0xFF4500, orchid: 0xDA70D6, pale_golden_rod: 0xEEE8AA, pale_green: 0x98FB98, pale_turquoise: 0xAFEEEE, pale_violet_red: 0xDB7093, papaya_whip: 0xFFEFD5, peach_puff: 0xFFDAB9, peru: 0xCD853F, pink: 0xFFC0CB, plum: 0xDDA0DD, powder_blue: 0xB0E0E6, purple: 0x800080, rebecca_purple: 0x663399, red: 0xFF0000, rosy_brown: 0xBC8F8F, royal_blue: 0x4169E1, saddle_brown: 0x8B4513, salmon: 0xFA8072, sandy_brown: 0xF4A460, sea_green: 0x2E8B57, sea_shell: 0xFFF5EE, sienna: 0xA0522D, silver: 0xC0C0C0, sky_blue: 0x87CEEB, slate_blue: 0x6A5ACD, slate_gray: 0x708090, slate_grey: 0x708090, snow: 0xFFFAFA, spring_green: 0x00FF7F, steel_blue: 0x4682B4, tan: 0xD2B48C, teal: 0x008080, thistle: 0xD8BFD8, tomato: 0xFF6347, turquoise: 0x40E0D0, violet: 0xEE82EE, wheat: 0xF5DEB3, white: 0xFFFFFF, white_smoke: 0xF5F5F5, yellow: 0xFFFF00, yellow_green: 0x9ACD32 }.freeze
Class Method Summary collapse
-
.color_to_hex(value) ⇒ Object
Convert hex string, color name or hex number to color hex number.
-
.date_num(time, offset = nil) ⇒ Object
Convert time to number of days, and change beginning point from 1st jan 1970 to 1st jan 1900 Offset argument should be number of seconds, if not specified then it will use Time.zone.utc_offset || 0.
-
.lxw_datetime(time) ⇒ Object
Creates internal Libxlsxwriter::Datetime from Datetime object.
-
.lxw_time(time) ⇒ Object
Creates internal Libxlsxwriter::Datetime from Time object.
- .open(filename = nil, constant_memory: false, default_format: nil) ⇒ Object
- .print_ffi_obj(value) ⇒ Object
Class Method Details
.color_to_hex(value) ⇒ Object
Convert hex string, color name or hex number to color hex number
267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 |
# File 'lib/fast_excel.rb', line 267 def self.color_to_hex(value) orig_value = value value = value.to_s if value.is_a?(Symbol) if value.is_a?(String) if EXTRA_COLORS[value.to_sym] return EXTRA_COLORS[value.to_sym] elsif COLOR_ENUM.find(value.to_sym) return COLOR_ENUM.find(value.to_sym) elsif COLOR_ENUM.find("color_#{value.to_sym}") return COLOR_ENUM.find("color_#{value.to_sym}") elsif value =~ /^#?(0x)?([\da-f]){6}$/i value = value.sub('#', '') if value.start_with?('#') return value.start_with?('0x') ? value.to_i(16) : "0x#{value}".to_i(16) else raise ArgumentError, "Unknown color value #{orig_value.inspect}, expected hex string or color name" end end return value if value.is_a?(Numeric) raise ArgumentError, "Can not use #{value.class} (#{value.inspect}) for color value, expected String or Hex Number" end |
.date_num(time, offset = nil) ⇒ Object
Convert time to number of days, and change beginning point from 1st jan 1970 to 1st jan 1900 Offset argument should be number of seconds, if not specified then it will use Time.zone.utc_offset || 0
81 82 83 84 85 86 87 88 89 90 91 92 |
# File 'lib/fast_excel.rb', line 81 def self.date_num(time, offset = nil) unless offset # Try use Rails' app timezone if Time.respond_to?(:zone) offset = Time.zone.utc_offset else offset = 0 # rollback to UTC end end time.to_f / XLSX_DATE_DAY + XLSX_DATE_EPOCH_DIFF + offset / XLSX_DATE_DAY end |
.lxw_datetime(time) ⇒ Object
Creates internal Libxlsxwriter::Datetime from Datetime object
48 49 50 51 52 53 54 55 56 57 |
# File 'lib/fast_excel.rb', line 48 def self.lxw_datetime(time) date = Libxlsxwriter::Datetime.new date[:year] = time.year date[:month] = time.month date[:day] = time.day date[:hour] = time.hour date[:min] = time.minute date[:sec] = time.second date end |
.lxw_time(time) ⇒ Object
Creates internal Libxlsxwriter::Datetime from Time object
60 61 62 63 64 65 66 67 68 69 |
# File 'lib/fast_excel.rb', line 60 def self.lxw_time(time) date = Libxlsxwriter::Datetime.new date[:year] = time.year date[:month] = time.month date[:day] = time.day date[:hour] = time.hour date[:min] = time.min date[:sec] = time.sec date end |
.open(filename = nil, constant_memory: false, default_format: nil) ⇒ Object
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
# File 'lib/fast_excel.rb', line 14 def self.open(filename = nil, constant_memory: false, default_format: nil) tmp_file = false unless filename require 'tmpdir' filename = "#{Dir.mktmpdir}/fast_excel.xlsx" tmp_file = true end unless filename raise ArgumentError, "filename is required" end filename = filename.to_s if defined?(Pathname) && filename.is_a?(Pathname) workbook = if constant_memory opt = Libxlsxwriter::WorkbookOptions.new opt[:constant_memory] = 1 Libxlsxwriter.workbook_new_opt(filename, opt) else Libxlsxwriter.workbook_new(filename) end result = Libxlsxwriter::Workbook.new(workbook) if default_format raise "default_format argument must be a hash" unless default_format.is_a?(Hash) result.default_format.set(default_format) end result.tmp_file = tmp_file result.filename = filename result end |
.print_ffi_obj(value) ⇒ Object
94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
# File 'lib/fast_excel.rb', line 94 def self.print_ffi_obj(value) puts "#{value.class}" value.members.each do |key| field_val = if value[key].is_a?(FFI::Pointer) && value[key].null? || value[key].nil? "nil" elsif value[key].is_a?(FFI::StructLayout::CharArray) value[key].to_str.inspect elsif value[key].is_a?(String) value[key].inspect elsif value[key].is_a?(Symbol) value[key].inspect else value[key] end puts "* #{key}: #{field_val}" end nil end |