title: Reading Excel file is magnitudes slower using openpyxl compared to xlrd
body: <p>I have an Excel spreadsheet that I need to import into SQL Server on a daily basis. The spreadsheet will contain around 250,000 rows across around 50 columns. I have tested both using <strong>openpyxl</strong> and <strong>xlrd</strong> using nearly identical code.</p>
  
  <p>Here's the code I'm using (minus debugging statements):</p>
  
  <pre><code>import xlrd
  import openpyxl
  
  def UseXlrd(file_name):
      workbook = xlrd.open_workbook(file_name, on_demand=True)
      worksheet = workbook.sheet_by_index(0)
      first_row = []
      for col in range(worksheet.ncols):
          first_row.append(worksheet.cell_value(0,col))
      data = []
      for row in range(1, worksheet.nrows):
          record = {}
          for col in range(worksheet.ncols):
              if isinstance(worksheet.cell_value(row,col), str):
                  record[first_row[col]] = worksheet.cell_value(row,col).strip()
              else:
                  record[first_row[col]] = worksheet.cell_value(row,col)
          data.append(record)
      return data
  
  
  def UseOpenpyxl(file_name):
      wb = openpyxl.load_workbook(file_name, read_only=True)
      sheet = wb.active
      first_row = []
      for col in range(1,sheet.max_column+1):
          first_row.append(sheet.cell(row=1,column=col).value)
      data = []
      for r in range(2,sheet.max_row+1):
          record = {}
          for col in range(sheet.max_column):
              if isinstance(sheet.cell(row=r,column=col+1).value, str):
                  record[first_row[col]] = sheet.cell(row=r,column=col+1).value.strip()
              else:
                  record[first_row[col]] = sheet.cell(row=r,column=col+1).value
          data.append(record)
      return data
  
  xlrd_results = UseXlrd('foo.xls')
  openpyxl_resuts = UseOpenpyxl('foo.xls')
  </code></pre>
  
  <p>Passing the same Excel file containing 3500 rows gives drastically different run times. Using <code>xlrd</code> I can read the entire file into a list of dictionaries in under 2 second. Using <code>openpyxl</code> I get the following results:</p>
  
  <pre><code>Reading Excel File...
  Read 100 lines in 114.14509415626526 seconds
  Read 200 lines in 471.43183994293213 seconds
  Read 300 lines in 982.5288782119751 seconds
  Read 400 lines in 1729.3348784446716 seconds
  Read 500 lines in 2774.886833190918 seconds
  Read 600 lines in 4384.074863195419 seconds
  Read 700 lines in 6396.7723388671875 seconds
  Read 800 lines in 7998.775000572205 seconds
  Read 900 lines in 11018.460735321045 seconds
  </code></pre>
  
  <p>While I can use <code>xlrd</code> in the final script, I will have to hard code a lot of formatting because of various issues (i.e. int reads as float, date reads as int, datetime reads as float). Being that I need to reuse this code for a few more imports, it doesn't make sense to try and hard code specific columns to format them properly and have to maintain similar code across 4 different scripts.</p>
  
  <p>Any advice on how to proceed?</p>