robust_excel_ole 1.15 → 1.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/Changelog +9 -0
 - data/README.rdoc +1 -1
 - data/___dummy_workbook.xls +0 -0
 - data/docs/README_open.rdoc +14 -2
 - data/docs/README_ranges.rdoc +5 -2
 - data/lib/robust_excel_ole/bookstore.rb +12 -75
 - data/lib/robust_excel_ole/cell.rb +1 -1
 - data/lib/robust_excel_ole/excel.rb +6 -11
 - data/lib/robust_excel_ole/general.rb +32 -9
 - data/lib/robust_excel_ole/range.rb +4 -4
 - data/lib/robust_excel_ole/range_owners.rb +14 -14
 - data/lib/robust_excel_ole/version.rb +1 -1
 - data/lib/robust_excel_ole/workbook.rb +129 -112
 - data/lib/robust_excel_ole/worksheet.rb +4 -8
 - data/spec/bookstore_spec.rb +3 -3
 - data/spec/data/more_data/workbook.xls +0 -0
 - data/spec/excel_spec.rb +2 -4
 - data/spec/general_spec.rb +2 -4
 - data/spec/reo_common_spec.rb +1 -1
 - data/spec/workbook_specs/workbook_misc_spec.rb +1 -11
 - data/spec/workbook_specs/workbook_open_spec.rb +342 -16
 - data/spec/workbook_specs/workbook_unobtr_spec.rb +2 -2
 - data/spec/worksheet_spec.rb +2 -4
 - metadata +2 -2
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 87f0b689fc32747c5adbeaeff32f823b2153dc613a2dc27ae6b3a52060241ca0
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 2d89ef58db655b2a84b95b9dc3622fe1daae6bfafc37c1f03f9de1984cf7958e
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 2a0074c2f763882481cdc43bb9a99b0c3b62d8ed2bfea646fc5d6d581719f01df7bb8a223c0d3629d698695b56629f1813b26f363a962707df91c42b51bebee0
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 863b6380c04612c239bec9ce6998be0e9ed59ec884e2f57107aa2833f11b0ba4bca7258621bc48e818591a6c6d973fe961a5ca591b2dc85cd5a15fa13dbf1ed6
         
     | 
    
        data/Changelog
    CHANGED
    
    | 
         @@ -1,6 +1,15 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # Change Log
         
     | 
| 
       2 
2 
     | 
    
         
             
            All notable changes to this project will be documented in this file.
         
     | 
| 
       3 
3 
     | 
    
         | 
| 
      
 4 
     | 
    
         
            +
            ## [1.16]
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            ### Added
         
     | 
| 
      
 7 
     | 
    
         
            +
               - RangeOwners#set_namevalue, set_namevalue_glob, Worksheet#set_cellval: 
         
     | 
| 
      
 8 
     | 
    
         
            +
                 optional parameter for color 
         
     | 
| 
      
 9 
     | 
    
         
            +
               
         
     | 
| 
      
 10 
     | 
    
         
            +
            ### Changed   
         
     | 
| 
      
 11 
     | 
    
         
            +
               - Workbook#color_if_modified removed   
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
       4 
13 
     | 
    
         
             
            ## [1.15]
         
     | 
| 
       5 
14 
     | 
    
         | 
| 
       6 
15 
     | 
    
         
             
            ### Added
         
     | 
    
        data/README.rdoc
    CHANGED
    
    
    
        data/___dummy_workbook.xls
    CHANGED
    
    | 
         Binary file 
     | 
    
        data/docs/README_open.rdoc
    CHANGED
    
    | 
         @@ -142,9 +142,9 @@ A special feature of RobustExcelOle is that it allows to reopen workbooks after 
     | 
|
| 
       142 
142 
     | 
    
         | 
| 
       143 
143 
     | 
    
         
             
            The closed workbook is now alive again, i.e. is open and responds to Excel methods.
         
     | 
| 
       144 
144 
     | 
    
         | 
| 
       145 
     | 
    
         
            -
            ===  
     | 
| 
      
 145 
     | 
    
         
            +
            === Type-lifting WIN32OLE objects to RobustExcelOle objects
         
     | 
| 
       146 
146 
     | 
    
         | 
| 
       147 
     | 
    
         
            -
             
     | 
| 
      
 147 
     | 
    
         
            +
            Type-lifting means here: enriching a given object of a certain class by properties and methods of another class. 
         
     | 
| 
       148 
148 
     | 
    
         
             
            The method +General.to_reo+ enables type-lifting WIN32OLE objects to RobustExcelOle objects, in the sense that the attributes and methods of RobustExcelOle can be applied to these objects. For example, assume we have a WIN32OLE workbook +win32ole_workbook+:
         
     | 
| 
       149 
149 
     | 
    
         | 
| 
       150 
150 
     | 
    
         
             
              win32ole_workbook.to_class
         
     | 
| 
         @@ -173,6 +173,18 @@ A RobustExcelOle Workbook object is a proxy of an Excel WIN32OLE workbook. A Wor 
     | 
|
| 
       173 
173 
     | 
    
         | 
| 
       174 
174 
     | 
    
         
             
            Similarly, each Excel, Worksheet and a Range object in RobustExcelOle is a proxy of a corresponding Excel, Worksheet and a Range object in WIN32OLE. For these objects identity transperence holds as well.
         
     | 
| 
       175 
175 
     | 
    
         | 
| 
      
 176 
     | 
    
         
            +
            === Opening workbooks given a network path and a hostname share path ===
         
     | 
| 
      
 177 
     | 
    
         
            +
             
     | 
| 
      
 178 
     | 
    
         
            +
            RobustExcelOle allows opening workbooks via a network path starting with a drive letter different from the default drive (mostly 'C'), e.g. 
         
     | 
| 
      
 179 
     | 
    
         
            +
             
     | 
| 
      
 180 
     | 
    
         
            +
              workbook = Workbook.open('N:/data workbook.xls')
         
     | 
| 
      
 181 
     | 
    
         
            +
             
     | 
| 
      
 182 
     | 
    
         
            +
            Likewise the corresponding hostname share path can be used, starting with '//', e.g.
         
     | 
| 
      
 183 
     | 
    
         
            +
             
     | 
| 
      
 184 
     | 
    
         
            +
              workbook = Workbook.open("//DESKTOP-A5D5GJ5/spec/data/workbook.xls")
         
     | 
| 
      
 185 
     | 
    
         
            +
             
     | 
| 
      
 186 
     | 
    
         
            +
            where 'DESKTOP-A5D5GJ5' shall be the hostname, and 'data' be the share.
         
     | 
| 
      
 187 
     | 
    
         
            +
             
     | 
| 
       176 
188 
     | 
    
         
             
            === Unobtrusively modifying a workbook
         
     | 
| 
       177 
189 
     | 
    
         | 
| 
       178 
190 
     | 
    
         
             
            The method +unobtrusively+ enables the user to read or modify a workbook, no matter if it is open in some Excel instance, if it is saved or unsaved, and if it is writable or not. When opening a workbook unobtrusively, its status remains unchanged. This status includes, whether the workbook is opened or closed, saved or unsaved, readonly or writable, visible or invisible, calculation mode is automatic or manual, and checking compatibility is turned on or off. 
         
     | 
    
        data/docs/README_ranges.rdoc
    CHANGED
    
    | 
         @@ -306,9 +306,12 @@ or 
     | 
|
| 
       306 
306 
     | 
    
         | 
| 
       307 
307 
     | 
    
         
             
              workbook.set_namevalue_glob("name", "new_value")
         
     | 
| 
       308 
308 
     | 
    
         | 
| 
       309 
     | 
    
         
            -
             
     | 
| 
      
 309 
     | 
    
         
            +
            You can color the range when setting the contents of a range.
         
     | 
| 
      
 310 
     | 
    
         
            +
             
     | 
| 
      
 311 
     | 
    
         
            +
              workbook.set_namevalue_glob("name", "new_value", :color => 4)
         
     | 
| 
      
 312 
     | 
    
         
            +
             
     | 
| 
      
 313 
     | 
    
         
            +
            The method []= sets the contents of a range and colors the range via some default color.
         
     | 
| 
       310 
314 
     | 
    
         | 
| 
       311 
     | 
    
         
            -
              workbook.color_if_modified = 4
         
     | 
| 
       312 
315 
     | 
    
         
             
              workbook["name"] = "new_value"
         
     | 
| 
       313 
316 
     | 
    
         | 
| 
       314 
317 
     | 
    
         
             
            Similarly, the contents of a named range can be read and modified in a worksheet
         
     | 
| 
         @@ -29,11 +29,9 @@ module RobustExcelOle 
     | 
|
| 
       29 
29 
     | 
    
         
             
                #                             otherwise proceeds according to prefer_writable
         
     | 
| 
       30 
30 
     | 
    
         
             
                def fetch(filename, options = { :prefer_writable => true })
         
     | 
| 
       31 
31 
     | 
    
         
             
                  return nil unless filename
         
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
       33 
32 
     | 
    
         
             
                  filename = General.absolute_path(filename)
         
     | 
| 
       34 
33 
     | 
    
         
             
                  filename_key = General.canonize(filename)
         
     | 
| 
       35 
     | 
    
         
            -
                  weakref_books = @filename2books[filename_key] 
     | 
| 
       36 
     | 
    
         
            -
                  weakref_books = consider_networkpaths(filename_key) if weakref_books.empty? || weakref_books.nil?
         
     | 
| 
      
 34 
     | 
    
         
            +
                  weakref_books = @filename2books[filename_key]
         
     | 
| 
       37 
35 
     | 
    
         
             
                  return nil if weakref_books.nil? || weakref_books.empty?
         
     | 
| 
       38 
36 
     | 
    
         | 
| 
       39 
37 
     | 
    
         
             
                  result = open_book = closed_book = nil
         
     | 
| 
         @@ -67,68 +65,6 @@ module RobustExcelOle 
     | 
|
| 
       67 
65 
     | 
    
         
             
                  result
         
     | 
| 
       68 
66 
     | 
    
         
             
                end
         
     | 
| 
       69 
67 
     | 
    
         | 
| 
       70 
     | 
    
         
            -
                # @private
         
     | 
| 
       71 
     | 
    
         
            -
                def consider_networkpaths(filename)      
         
     | 
| 
       72 
     | 
    
         
            -
                  network = WIN32OLE.new('WScript.Network')
         
     | 
| 
       73 
     | 
    
         
            -
                  drives = network.enumnetworkdrives
         
     | 
| 
       74 
     | 
    
         
            -
                  drive_letter, filename_after_drive_letter = filename.split(':')   
         
     | 
| 
       75 
     | 
    
         
            -
                  found_filename = nil
         
     | 
| 
       76 
     | 
    
         
            -
                  # if filename starts with a drive letter not c and this drive exists,
         
     | 
| 
       77 
     | 
    
         
            -
                  # then if there is the corresponding host_share_path in the bookstore, 
         
     | 
| 
       78 
     | 
    
         
            -
                  # then take the corresponding workbooks      
         
     | 
| 
       79 
     | 
    
         
            -
                  if drive_letter != 'c' && drive_letter != filename    
         
     | 
| 
       80 
     | 
    
         
            -
                    for i in 0 .. drives.Count-1
         
     | 
| 
       81 
     | 
    
         
            -
                      next if i % 2 == 1
         
     | 
| 
       82 
     | 
    
         
            -
                      if drives.Item(i).gsub(':','').downcase == drive_letter
         
     | 
| 
       83 
     | 
    
         
            -
                        hostname_share = drives.Item(i+1).gsub('\\','/').gsub('//','').downcase
         
     | 
| 
       84 
     | 
    
         
            -
                        break
         
     | 
| 
       85 
     | 
    
         
            -
                      end
         
     | 
| 
       86 
     | 
    
         
            -
                    end        
         
     | 
| 
       87 
     | 
    
         
            -
                    @filename2books.each do |stored_filename,_|
         
     | 
| 
       88 
     | 
    
         
            -
                      if hostname_share && stored_filename
         
     | 
| 
       89 
     | 
    
         
            -
                        if stored_filename[0] == '/'
         
     | 
| 
       90 
     | 
    
         
            -
                          index_hostname = stored_filename[1,stored_filename.length].index('/')+2
         
     | 
| 
       91 
     | 
    
         
            -
                          index_hostname_share = stored_filename[index_hostname,stored_filename.length].index('/')
         
     | 
| 
       92 
     | 
    
         
            -
                          hostname_share_in_stored_filename = stored_filename[1,index_hostname+index_hostname_share-1] 
         
     | 
| 
       93 
     | 
    
         
            -
                          if hostname_share_in_stored_filename == hostname_share
         
     | 
| 
       94 
     | 
    
         
            -
                            found_filename = stored_filename
         
     | 
| 
       95 
     | 
    
         
            -
                            break
         
     | 
| 
       96 
     | 
    
         
            -
                          end
         
     | 
| 
       97 
     | 
    
         
            -
                        end
         
     | 
| 
       98 
     | 
    
         
            -
                      end
         
     | 
| 
       99 
     | 
    
         
            -
                    end
         
     | 
| 
       100 
     | 
    
         
            -
                  elsif filename[0] == '/'
         
     | 
| 
       101 
     | 
    
         
            -
                    # if filename starts with a host name and share, and this is an existing host name share path,
         
     | 
| 
       102 
     | 
    
         
            -
                    # then if there are workbooks with the corresponding drive letter,
         
     | 
| 
       103 
     | 
    
         
            -
                    # then take these workbooks,
         
     | 
| 
       104 
     | 
    
         
            -
                    index_hostname = filename[1,filename.length].index('/')+2
         
     | 
| 
       105 
     | 
    
         
            -
                    index_hostname_share = filename[index_hostname,filename.length].index('/')
         
     | 
| 
       106 
     | 
    
         
            -
                    hostname_share_in_filename = filename[1,index_hostname+index_hostname_share-1] 
         
     | 
| 
       107 
     | 
    
         
            -
                    filename_after_hostname_share = filename[index_hostname+index_hostname_share+1, filename.length]
         
     | 
| 
       108 
     | 
    
         
            -
                    require 'socket'
         
     | 
| 
       109 
     | 
    
         
            -
                    hostname = Socket.gethostname
         
     | 
| 
       110 
     | 
    
         
            -
                    if hostname_share_in_filename[0,hostname_share_in_filename.index('/')] == hostname.downcase
         
     | 
| 
       111 
     | 
    
         
            -
                      for i in 0 .. drives.Count-1
         
     | 
| 
       112 
     | 
    
         
            -
                        next if i % 2 == 1
         
     | 
| 
       113 
     | 
    
         
            -
                        hostname_share = drives.Item(i+1).gsub('\\','/').gsub('//','').downcase
         
     | 
| 
       114 
     | 
    
         
            -
                        if hostname_share == hostname_share_in_filename
         
     | 
| 
       115 
     | 
    
         
            -
                          drive_letter = drives.Item(i).gsub(':','').downcase
         
     | 
| 
       116 
     | 
    
         
            -
                          break
         
     | 
| 
       117 
     | 
    
         
            -
                        end
         
     | 
| 
       118 
     | 
    
         
            -
                      end
         
     | 
| 
       119 
     | 
    
         
            -
                      @filename2books.each do |stored_filename,_|
         
     | 
| 
       120 
     | 
    
         
            -
                        if stored_filename
         
     | 
| 
       121 
     | 
    
         
            -
                          if drive_letter && stored_filename.start_with?(drive_letter.downcase) && stored_filename.end_with?(filename_after_hostname_share)
         
     | 
| 
       122 
     | 
    
         
            -
                            found_filename = stored_filename
         
     | 
| 
       123 
     | 
    
         
            -
                            break
         
     | 
| 
       124 
     | 
    
         
            -
                          end
         
     | 
| 
       125 
     | 
    
         
            -
                        end
         
     | 
| 
       126 
     | 
    
         
            -
                      end
         
     | 
| 
       127 
     | 
    
         
            -
                    end
         
     | 
| 
       128 
     | 
    
         
            -
                  end
         
     | 
| 
       129 
     | 
    
         
            -
                  @filename2books[found_filename]
         
     | 
| 
       130 
     | 
    
         
            -
                end
         
     | 
| 
       131 
     | 
    
         
            -
             
     | 
| 
       132 
68 
     | 
    
         
             
                # stores a workbook
         
     | 
| 
       133 
69 
     | 
    
         
             
                # @param [Workbook] book a given book
         
     | 
| 
       134 
70 
     | 
    
         
             
                def store(book)
         
     | 
| 
         @@ -138,8 +74,7 @@ module RobustExcelOle 
     | 
|
| 
       138 
74 
     | 
    
         
             
                    # deletes the weak reference to the book
         
     | 
| 
       139 
75 
     | 
    
         
             
                    @filename2books[old_filename_key].delete(book)
         
     | 
| 
       140 
76 
     | 
    
         
             
                  end
         
     | 
| 
       141 
     | 
    
         
            -
                  @filename2books[filename_key] |= [WeakRef.new(book)]
         
     | 
| 
       142 
     | 
    
         
            -
                  book.stored_filename = book.filename
         
     | 
| 
      
 77 
     | 
    
         
            +
                  @filename2books[filename_key] |= [WeakRef.new(book)]      
         
     | 
| 
       143 
78 
     | 
    
         
             
                end
         
     | 
| 
       144 
79 
     | 
    
         | 
| 
       145 
80 
     | 
    
         
             
                # creates and returns a separate Excel instance with Visible and DisplayAlerts equal false
         
     | 
| 
         @@ -177,24 +112,26 @@ module RobustExcelOle 
     | 
|
| 
       177 
112 
     | 
    
         | 
| 
       178 
113 
     | 
    
         
             
                # prints the book store
         
     | 
| 
       179 
114 
     | 
    
         
             
                # @private
         
     | 
| 
       180 
     | 
    
         
            -
                def  
     | 
| 
       181 
     | 
    
         
            -
                  #  
     | 
| 
      
 115 
     | 
    
         
            +
                def print_filename2books
         
     | 
| 
      
 116 
     | 
    
         
            +
                  #puts "@filename2books:"
         
     | 
| 
       182 
117 
     | 
    
         
             
                  if @filename2books
         
     | 
| 
       183 
     | 
    
         
            -
                    @filename2books.each do | 
     | 
| 
       184 
     | 
    
         
            -
                      #  
     | 
| 
       185 
     | 
    
         
            -
                      #  
     | 
| 
      
 118 
     | 
    
         
            +
                    @filename2books.each do |filename,books|
         
     | 
| 
      
 119 
     | 
    
         
            +
                      #puts " filename: #{filename}"
         
     | 
| 
      
 120 
     | 
    
         
            +
                      #puts " books:"
         
     | 
| 
       186 
121 
     | 
    
         
             
                      if books.empty?
         
     | 
| 
       187 
     | 
    
         
            -
                        #  
     | 
| 
      
 122 
     | 
    
         
            +
                        #puts " []"
         
     | 
| 
       188 
123 
     | 
    
         
             
                      else
         
     | 
| 
       189 
124 
     | 
    
         
             
                        books.each do |book|
         
     | 
| 
       190 
125 
     | 
    
         
             
                          if book.weakref_alive?
         
     | 
| 
       191 
     | 
    
         
            -
                            #  
     | 
| 
      
 126 
     | 
    
         
            +
                            #puts "book.filename: #{book.filename}"
         
     | 
| 
       192 
127 
     | 
    
         
             
                          else # this should never happen
         
     | 
| 
       193 
     | 
    
         
            -
                            #  
     | 
| 
      
 128 
     | 
    
         
            +
                            #puts "weakref not alive"
         
     | 
| 
       194 
129 
     | 
    
         
             
                          end
         
     | 
| 
       195 
130 
     | 
    
         
             
                        end
         
     | 
| 
       196 
131 
     | 
    
         
             
                      end
         
     | 
| 
       197 
132 
     | 
    
         
             
                    end
         
     | 
| 
      
 133 
     | 
    
         
            +
                  else
         
     | 
| 
      
 134 
     | 
    
         
            +
                    #puts "nil"
         
     | 
| 
       198 
135 
     | 
    
         
             
                  end
         
     | 
| 
       199 
136 
     | 
    
         
             
                end
         
     | 
| 
       200 
137 
     | 
    
         
             
              end
         
     | 
| 
         @@ -17,7 +17,7 @@ module RobustExcelOle 
     | 
|
| 
       17 
17 
     | 
    
         
             
              # See https://docs.microsoft.com/en-us/office/vba/api/excel.application(object)#methods
         
     | 
| 
       18 
18 
     | 
    
         | 
| 
       19 
19 
     | 
    
         
             
              class Excel < RangeOwners
         
     | 
| 
       20 
     | 
    
         
            -
                 
     | 
| 
      
 20 
     | 
    
         
            +
                attr_reader :ole_excel
         
     | 
| 
       21 
21 
     | 
    
         
             
                attr_reader :properties
         
     | 
| 
       22 
22 
     | 
    
         | 
| 
       23 
23 
     | 
    
         
             
                alias ole_object ole_excel
         
     | 
| 
         @@ -111,10 +111,8 @@ module RobustExcelOle 
     | 
|
| 
       111 
111 
     | 
    
         
             
                # @return [Excel] an Excel instance
         
     | 
| 
       112 
112 
     | 
    
         
             
                def recreate(opts = {})
         
     | 
| 
       113 
113 
     | 
    
         
             
                  unless alive?
         
     | 
| 
       114 
     | 
    
         
            -
                    opts = {
         
     | 
| 
       115 
     | 
    
         
            -
             
     | 
| 
       116 
     | 
    
         
            -
                      :displayalerts => @properties[:displayalerts] || :if_visible
         
     | 
| 
       117 
     | 
    
         
            -
                    }.merge(opts)
         
     | 
| 
      
 114 
     | 
    
         
            +
                    opts = {:visible => false, :displayalerts => :if_visible}.merge(
         
     | 
| 
      
 115 
     | 
    
         
            +
                           {:visible => @properties[:visible], :displayalerts => @properties[:displayalerts]}).merge(opts)        
         
     | 
| 
       118 
116 
     | 
    
         
             
                    @ole_excel = WIN32OLE.new('Excel.Application')
         
     | 
| 
       119 
117 
     | 
    
         
             
                    set_options(opts)
         
     | 
| 
       120 
118 
     | 
    
         
             
                    if opts[:reopen_workbooks]
         
     | 
| 
         @@ -391,7 +389,7 @@ module RobustExcelOle 
     | 
|
| 
       391 
389 
     | 
    
         
             
                # if this Excel instance is being closed, then Excel creates a new Excel instance
         
     | 
| 
       392 
390 
     | 
    
         
             
                # @private
         
     | 
| 
       393 
391 
     | 
    
         
             
                def self.current_ole_excel   
         
     | 
| 
       394 
     | 
    
         
            -
                  if :: 
     | 
| 
      
 392 
     | 
    
         
            +
                  if ::CONNECT_EXCEL_JRUBY_BUG
         
     | 
| 
       395 
393 
     | 
    
         
             
                    result = known_excel_instance
         
     | 
| 
       396 
394 
     | 
    
         
             
                    if result.nil?
         
     | 
| 
       397 
395 
     | 
    
         
             
                      if excels_number > 0
         
     | 
| 
         @@ -694,10 +692,7 @@ module RobustExcelOle 
     | 
|
| 
       694 
692 
     | 
    
         
             
                # @param [String]  name  the name of the range
         
     | 
| 
       695 
693 
     | 
    
         
             
                # @param [Variant] value the contents of the range
         
     | 
| 
       696 
694 
     | 
    
         
             
                def []=(name, value)
         
     | 
| 
       697 
     | 
    
         
            -
                   
     | 
| 
       698 
     | 
    
         
            -
                  workbook.color_if_modified = 42  unless workbook.nil? # aqua-marin
         
     | 
| 
       699 
     | 
    
         
            -
                  set_namevalue_glob(name,value)
         
     | 
| 
       700 
     | 
    
         
            -
                  workbook.color_if_modified = old_color_if_modified
         
     | 
| 
      
 695 
     | 
    
         
            +
                  set_namevalue_glob(name, value, :color => 42)
         
     | 
| 
       701 
696 
     | 
    
         
             
                end
         
     | 
| 
       702 
697 
     | 
    
         | 
| 
       703 
698 
     | 
    
         
             
                # @private
         
     | 
| 
         @@ -740,7 +735,7 @@ module RobustExcelOle 
     | 
|
| 
       740 
735 
     | 
    
         
             
                def method_missing(name, *args) 
         
     | 
| 
       741 
736 
     | 
    
         
             
                  if name.to_s[0,1] =~ /[A-Z]/
         
     | 
| 
       742 
737 
     | 
    
         
             
                    raise ObjectNotAlive, 'method missing: Excel not alive' unless alive?
         
     | 
| 
       743 
     | 
    
         
            -
                    if :: 
     | 
| 
      
 738 
     | 
    
         
            +
                    if ::ERRORMESSAGE_JRUBY_BUG
         
     | 
| 
       744 
739 
     | 
    
         
             
                      begin
         
     | 
| 
       745 
740 
     | 
    
         
             
                        @ole_excel.send(name, *args)
         
     | 
| 
       746 
741 
     | 
    
         
             
                      rescue Java::OrgRacobCom::ComFailException => msg
         
     | 
| 
         @@ -3,24 +3,47 @@ 
     | 
|
| 
       3 
3 
     | 
    
         
             
            module General
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
       5 
5 
     | 
    
         
             
              IS_JRUBY_PLATFORM = (RUBY_PLATFORM =~ /java/)
         
     | 
| 
       6 
     | 
    
         
            -
              :: 
     | 
| 
       7 
     | 
    
         
            -
              :: 
     | 
| 
       8 
     | 
    
         
            -
              :: 
     | 
| 
       9 
     | 
    
         
            -
              :: 
     | 
| 
       10 
     | 
    
         
            -
              :: 
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
      
 6 
     | 
    
         
            +
              ::EXPANDPATH_JRUBY_BUG   = IS_JRUBY_PLATFORM && true
         
     | 
| 
      
 7 
     | 
    
         
            +
              ::CONNECT_JRUBY_BUG      = IS_JRUBY_PLATFORM && true
         
     | 
| 
      
 8 
     | 
    
         
            +
              ::COPYSHEETS_JRUBY_BUG   = IS_JRUBY_PLATFORM && true
         
     | 
| 
      
 9 
     | 
    
         
            +
              ::ERRORMESSAGE_JRUBY_BUG = IS_JRUBY_PLATFORM && true
         
     | 
| 
      
 10 
     | 
    
         
            +
              ::CONNECT_EXCEL_JRUBY_BUG      = IS_JRUBY_PLATFORM && true
         
     | 
| 
      
 11 
     | 
    
         
            +
              ::RANGES_JRUBY_BUG       = IS_JRUBY_PLATFORM && true
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
              @private
         
     | 
| 
      
 14 
     | 
    
         
            +
              def network2hostnamesharepath(filename)
         
     | 
| 
      
 15 
     | 
    
         
            +
                network = WIN32OLE.new('WScript.Network')
         
     | 
| 
      
 16 
     | 
    
         
            +
                drives = network.enumnetworkdrives
         
     | 
| 
      
 17 
     | 
    
         
            +
                drive_letter, filename_after_drive_letter = filename.split(':') 
         
     | 
| 
      
 18 
     | 
    
         
            +
                # if filename starts with a drive letter not c and this drive exists,
         
     | 
| 
      
 19 
     | 
    
         
            +
                # then determine the corresponding host_share_path
         
     | 
| 
      
 20 
     | 
    
         
            +
                default_drive = File.absolute_path(".")[0]
         
     | 
| 
      
 21 
     | 
    
         
            +
                if drive_letter != default_drive && drive_letter != filename  
         
     | 
| 
      
 22 
     | 
    
         
            +
                  for i in 0 .. drives.Count-1
         
     | 
| 
      
 23 
     | 
    
         
            +
                    next if i % 2 == 1
         
     | 
| 
      
 24 
     | 
    
         
            +
                    if drives.Item(i).gsub(':','') == drive_letter
         
     | 
| 
      
 25 
     | 
    
         
            +
                      hostname_share = drives.Item(i+1)  #.gsub('\\','/').gsub('//','')
         
     | 
| 
      
 26 
     | 
    
         
            +
                      break
         
     | 
| 
      
 27 
     | 
    
         
            +
                    end
         
     | 
| 
      
 28 
     | 
    
         
            +
                  end
         
     | 
| 
      
 29 
     | 
    
         
            +
                  hostname_share + filename_after_drive_letter if hostname_share
         
     | 
| 
      
 30 
     | 
    
         
            +
                else
         
     | 
| 
      
 31 
     | 
    
         
            +
                  return filename
         
     | 
| 
      
 32 
     | 
    
         
            +
                end
         
     | 
| 
      
 33 
     | 
    
         
            +
              end
         
     | 
| 
       12 
34 
     | 
    
         | 
| 
       13 
35 
     | 
    
         
             
              # @private
         
     | 
| 
       14 
     | 
    
         
            -
              def absolute_path(file) 
     | 
| 
      
 36 
     | 
    
         
            +
              def absolute_path(file)     
         
     | 
| 
      
 37 
     | 
    
         
            +
                file[0,2] = './' if ::EXPANDPATH_JRUBY_BUG && file  =~ /[A-Z]:[^\/]/
         
     | 
| 
       15 
38 
     | 
    
         
             
                file = File.expand_path(file)
         
     | 
| 
       16 
39 
     | 
    
         
             
                file = RobustExcelOle::Cygwin.cygpath('-w', file) if RUBY_PLATFORM =~ /cygwin/
         
     | 
| 
       17 
40 
     | 
    
         
             
                WIN32OLE.new('Scripting.FileSystemObject').GetAbsolutePathName(file).tr('/','\\')
         
     | 
| 
       18 
41 
     | 
    
         
             
              end
         
     | 
| 
       19 
42 
     | 
    
         | 
| 
       20 
43 
     | 
    
         
             
              # @private
         
     | 
| 
       21 
     | 
    
         
            -
              def canonize(filename) 
     | 
| 
      
 44 
     | 
    
         
            +
              def canonize(filename)
         
     | 
| 
       22 
45 
     | 
    
         
             
                raise TypeREOError, "No string given to canonize, but #{filename.inspect}" unless filename.is_a?(String)
         
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
      
 46 
     | 
    
         
            +
                filename = network2hostnamesharepath(filename)
         
     | 
| 
       24 
47 
     | 
    
         
             
                normalize(filename).downcase
         
     | 
| 
       25 
48 
     | 
    
         
             
              end
         
     | 
| 
       26 
49 
     | 
    
         | 
| 
         @@ -27,7 +27,7 @@ module RobustExcelOle 
     | 
|
| 
       27 
27 
     | 
    
         
             
                # @returns [Array] the values
         
     | 
| 
       28 
28 
     | 
    
         
             
                def values(range = nil)
         
     | 
| 
       29 
29 
     | 
    
         
             
                  #result = map { |x| x.Value }.flatten
         
     | 
| 
       30 
     | 
    
         
            -
                  result_unflatten = if !:: 
     | 
| 
      
 30 
     | 
    
         
            +
                  result_unflatten = if !::RANGES_JRUBY_BUG
         
     | 
| 
       31 
31 
     | 
    
         
             
                    map { |x| x.v }
         
     | 
| 
       32 
32 
     | 
    
         
             
                  else
         
     | 
| 
       33 
33 
     | 
    
         
             
                    self.v
         
     | 
| 
         @@ -44,7 +44,7 @@ module RobustExcelOle 
     | 
|
| 
       44 
44 
     | 
    
         | 
| 
       45 
45 
     | 
    
         
             
                def v
         
     | 
| 
       46 
46 
     | 
    
         
             
                  begin
         
     | 
| 
       47 
     | 
    
         
            -
                    if !:: 
     | 
| 
      
 47 
     | 
    
         
            +
                    if !::RANGES_JRUBY_BUG
         
     | 
| 
       48 
48 
     | 
    
         
             
                      self.Value
         
     | 
| 
       49 
49 
     | 
    
         
             
                    else
         
     | 
| 
       50 
50 
     | 
    
         
             
                      address_r1c1 = self.AddressLocal(true,true,XlR1C1)
         
     | 
| 
         @@ -65,7 +65,7 @@ module RobustExcelOle 
     | 
|
| 
       65 
65 
     | 
    
         | 
| 
       66 
66 
     | 
    
         
             
                def v=(value)
         
     | 
| 
       67 
67 
     | 
    
         
             
                  begin
         
     | 
| 
       68 
     | 
    
         
            -
                    if !:: 
     | 
| 
      
 68 
     | 
    
         
            +
                    if !::RANGES_JRUBY_BUG
         
     | 
| 
       69 
69 
     | 
    
         
             
                      ole_range.Value = value
         
     | 
| 
       70 
70 
     | 
    
         
             
                    else
         
     | 
| 
       71 
71 
     | 
    
         
             
                      address_r1c1 = ole_range.AddressLocal(true,true,XlR1C1)
         
     | 
| 
         @@ -240,7 +240,7 @@ module RobustExcelOle 
     | 
|
| 
       240 
240 
     | 
    
         
             
                # @private
         
     | 
| 
       241 
241 
     | 
    
         
             
                def method_missing(name, *args) 
         
     | 
| 
       242 
242 
     | 
    
         
             
                  if name.to_s[0,1] =~ /[A-Z]/
         
     | 
| 
       243 
     | 
    
         
            -
                    if :: 
     | 
| 
      
 243 
     | 
    
         
            +
                    if ::ERRORMESSAGE_JRUBY_BUG
         
     | 
| 
       244 
244 
     | 
    
         
             
                      begin
         
     | 
| 
       245 
245 
     | 
    
         
             
                        @ole_range.send(name, *args)
         
     | 
| 
       246 
246 
     | 
    
         
             
                      rescue Java::OrgRacobCom::ComFailException 
         
     | 
| 
         @@ -24,7 +24,7 @@ module RobustExcelOle 
     | 
|
| 
       24 
24 
     | 
    
         
             
                  ole_range = name_obj.RefersToRange
         
     | 
| 
       25 
25 
     | 
    
         
             
                  value = begin
         
     | 
| 
       26 
26 
     | 
    
         
             
                    #name_obj.RefersToRange.Value
         
     | 
| 
       27 
     | 
    
         
            -
                    if !:: 
     | 
| 
      
 27 
     | 
    
         
            +
                    if !::RANGES_JRUBY_BUG       
         
     | 
| 
       28 
28 
     | 
    
         
             
                      ole_range.Value
         
     | 
| 
       29 
29 
     | 
    
         
             
                    else
         
     | 
| 
       30 
30 
     | 
    
         
             
                      values = RobustExcelOle::Range.new(ole_range).v
         
     | 
| 
         @@ -39,7 +39,7 @@ module RobustExcelOle 
     | 
|
| 
       39 
39 
     | 
    
         
             
                      #sheet.Evaluate(name_obj.Name).Value
         
     | 
| 
       40 
40 
     | 
    
         
             
                      # does it result in a range?
         
     | 
| 
       41 
41 
     | 
    
         
             
                      ole_range = sheet.Evaluate(name_obj.Name)
         
     | 
| 
       42 
     | 
    
         
            -
                      if !:: 
     | 
| 
      
 42 
     | 
    
         
            +
                      if !::RANGES_JRUBY_BUG
         
     | 
| 
       43 
43 
     | 
    
         
             
                        ole_range.Value
         
     | 
| 
       44 
44 
     | 
    
         
             
                      else
         
     | 
| 
       45 
45 
     | 
    
         
             
                        values = RobustExcelOle::Range.new(ole_range).v
         
     | 
| 
         @@ -61,7 +61,8 @@ module RobustExcelOle 
     | 
|
| 
       61 
61 
     | 
    
         
             
                # sets the contents of a range
         
     | 
| 
       62 
62 
     | 
    
         
             
                # @param [String]  name  the name of a range
         
     | 
| 
       63 
63 
     | 
    
         
             
                # @param [Variant] value the contents of the range
         
     | 
| 
       64 
     | 
    
         
            -
                 
     | 
| 
      
 64 
     | 
    
         
            +
                # @option opts [Symbol] :color the color of the cell when set
         
     | 
| 
      
 65 
     | 
    
         
            +
                def set_namevalue_glob(name, value, opts = { }) 
         
     | 
| 
       65 
66 
     | 
    
         
             
                  begin
         
     | 
| 
       66 
67 
     | 
    
         
             
                    name_obj = begin
         
     | 
| 
       67 
68 
     | 
    
         
             
                      name_object(name)
         
     | 
| 
         @@ -69,9 +70,8 @@ module RobustExcelOle 
     | 
|
| 
       69 
70 
     | 
    
         
             
                      raise
         
     | 
| 
       70 
71 
     | 
    
         
             
                    end        
         
     | 
| 
       71 
72 
     | 
    
         
             
                    ole_range = name_object(name).RefersToRange
         
     | 
| 
       72 
     | 
    
         
            -
                     
     | 
| 
       73 
     | 
    
         
            -
                     
     | 
| 
       74 
     | 
    
         
            -
                    if !::JRUBY_BUG_RANGES
         
     | 
| 
      
 73 
     | 
    
         
            +
                    ole_range.Interior.ColorIndex = opts[:color] unless opts[:color].nil?
         
     | 
| 
      
 74 
     | 
    
         
            +
                    if !::RANGES_JRUBY_BUG
         
     | 
| 
       75 
75 
     | 
    
         
             
                      ole_range.Value = value
         
     | 
| 
       76 
76 
     | 
    
         
             
                    else
         
     | 
| 
       77 
77 
     | 
    
         
             
                      address_r1c1 = ole_range.AddressLocal(true,true,XlR1C1)
         
     | 
| 
         @@ -106,7 +106,7 @@ module RobustExcelOle 
     | 
|
| 
       106 
106 
     | 
    
         
             
                  end
         
     | 
| 
       107 
107 
     | 
    
         
             
                  begin
         
     | 
| 
       108 
108 
     | 
    
         
             
                    #value = ole_range.Value
         
     | 
| 
       109 
     | 
    
         
            -
                    value = if !:: 
     | 
| 
      
 109 
     | 
    
         
            +
                    value = if !::RANGES_JRUBY_BUG
         
     | 
| 
       110 
110 
     | 
    
         
             
                      ole_range.Value
         
     | 
| 
       111 
111 
     | 
    
         
             
                    else
         
     | 
| 
       112 
112 
     | 
    
         
             
                      values = RobustExcelOle::Range.new(ole_range).v
         
     | 
| 
         @@ -127,17 +127,17 @@ module RobustExcelOle 
     | 
|
| 
       127 
127 
     | 
    
         
             
                # assigns a value to a range given a locally defined name
         
     | 
| 
       128 
128 
     | 
    
         
             
                # @param [String]  name   the name of a range
         
     | 
| 
       129 
129 
     | 
    
         
             
                # @param [Variant] value  the assigned value   
         
     | 
| 
       130 
     | 
    
         
            -
                 
     | 
| 
      
 130 
     | 
    
         
            +
                # @option opts [Symbol] :color the color of the cell when set
         
     | 
| 
      
 131 
     | 
    
         
            +
                def set_namevalue(name, value, opts = { })  
         
     | 
| 
       131 
132 
     | 
    
         
             
                  begin
         
     | 
| 
       132 
     | 
    
         
            -
                    return set_namevalue_glob(name, value, opts) if self.is_a?(Workbook) 
     | 
| 
      
 133 
     | 
    
         
            +
                    return set_namevalue_glob(name, value, opts) if self.is_a?(Workbook) 
         
     | 
| 
       133 
134 
     | 
    
         
             
                    ole_range = self.Range(name)
         
     | 
| 
       134 
     | 
    
         
            -
                  rescue WIN32OLERuntimeError, Java::OrgRacobCom::ComFailException
         
     | 
| 
      
 135 
     | 
    
         
            +
                  rescue WIN32OLERuntimeError, Java::OrgRacobCom::ComFailException, VBAMethodMissingError
         
     | 
| 
       135 
136 
     | 
    
         
             
                    raise NameNotFound, "name #{name.inspect} not in #{self.inspect}"
         
     | 
| 
       136 
137 
     | 
    
         
             
                  end
         
     | 
| 
       137 
138 
     | 
    
         
             
                  begin
         
     | 
| 
       138 
     | 
    
         
            -
                     
     | 
| 
       139 
     | 
    
         
            -
                     
     | 
| 
       140 
     | 
    
         
            -
                    if !::JRUBY_BUG_RANGES
         
     | 
| 
      
 139 
     | 
    
         
            +
                    ole_range.Interior.ColorIndex = opts[:color] unless opts[:color].nil?
         
     | 
| 
      
 140 
     | 
    
         
            +
                    if !::RANGES_JRUBY_BUG
         
     | 
| 
       141 
141 
     | 
    
         
             
                      ole_range.Value = value
         
     | 
| 
       142 
142 
     | 
    
         
             
                    else
         
     | 
| 
       143 
143 
     | 
    
         
             
                      address_r1c1 = ole_range.AddressLocal(true,true,XlR1C1)
         
     | 
| 
         @@ -263,7 +263,7 @@ module RobustExcelOle 
     | 
|
| 
       263 
263 
     | 
    
         | 
| 
       264 
264 
     | 
    
         
             
                def name_object(name)
         
     | 
| 
       265 
265 
     | 
    
         
             
                  self.Names.Item(name)
         
     | 
| 
       266 
     | 
    
         
            -
                rescue WIN32OLERuntimeError, Java::OrgRacobCom::ComFailException
         
     | 
| 
      
 266 
     | 
    
         
            +
                rescue WIN32OLERuntimeError, Java::OrgRacobCom::ComFailException, VBAMethodMissingError
         
     | 
| 
       267 
267 
     | 
    
         
             
                  begin
         
     | 
| 
       268 
268 
     | 
    
         
             
                    self.Parent.Names.Item(name)
         
     | 
| 
       269 
269 
     | 
    
         
             
                  rescue WIN32OLERuntimeError, Java::OrgRacobCom::ComFailException
         
     |