title: Is there a faster way to parse an excel document with Powershell?
body: <p>I'm interfacing with an <code>MS Excel</code> document via <code>Powershell</code>.  There is a possibility of each excel document of having around 1000 rows of data.  </p>
  
  <p>Currently this script seems to read the <code>Excel</code> file and write a value to screen at a rate of 1 record every .6 seconds.  At first glance that seems extremely slow.</p>
  
  <p>This is my first time reading an <code>Excel</code> file with <code>Powershell</code>, is this the norm?  Is there a faster way for me to read and parse the <code>Excel</code> data?</p>
  
  <p>Here is the script output (trimmed for readability)</p>
  
  <pre><code>PS P:\Powershell\ExcelInterfaceTest&gt; .\WRIRMPTruckInterface.ps1 test.xlsx
  3/20/2013 4:46:01 PM
  ---------------------------
  2   078110
  3   078108
  4   078107
  5   078109
  &lt;SNIP&gt;
  242   078338
  243   078344
  244   078347
  245   078350
  3/20/2013 4:48:33 PM
  ---------------------------
  PS P:\Powershell\ExcelInterfaceTest&gt;
  </code></pre>
  
  <p>Here is the <code>Powershell</code> script:</p>
  
  <pre><code>########################################################################################################
  # This is a common function I am using which will release excel objects
  ########################################################################################################
  function Release-Ref ($ref) {
      ([System.Runtime.InteropServices.Marshal]::ReleaseComObject([System.__ComObject]$ref) -gt 0)
      [System.GC]::Collect()
      [System.GC]::WaitForPendingFinalizers()
  }
  
  ########################################################################################################
  # Variables
  ########################################################################################################
  
  ########################################################################################################
  # Creating excel object
  ########################################################################################################
  $objExcel = new-object -comobject excel.application 
  
  # Set to false to not open the app on screen.
  $objExcel.Visible = $False
  
  ########################################################################################################
  # Directory location where we have our excel files
  ########################################################################################################
  $ExcelFilesLocation = "C:/ShippingInterface/" + $args[0]
  
  ########################################################################################################
  # Open our excel file
  ########################################################################################################
  $UserWorkBook = $objExcel.Workbooks.Open($ExcelFilesLocation) 
  
  ########################################################################################################
  # Here Item(1) refers to sheet 1 of of the workbook. If we want to access sheet 10, we have to modify the code to Item(10)
  ########################################################################################################
  $UserWorksheet = $UserWorkBook.Worksheets.Item(2)
  
  ########################################################################################################
  # This is counter which will help to iterrate trough the loop. This is simply a row counter
  # I am starting row count as 2, because the first row in my case is header. So we dont need to read the header data
  ########################################################################################################
  $intRow = 2
  
  $a = Get-Date
  write-host $a
  write-host "---------------------------"
  
  Do {
  
      # Reading the first column of the current row
      $TicketNumber = $UserWorksheet.Cells.Item($intRow, 1).Value()
  
      write-host $intRow " " $TicketNumber    
  
      $intRow++
  
  } While ($UserWorksheet.Cells.Item($intRow,1).Value() -ne $null)
  
  $a = Get-Date
  write-host $a
  write-host "---------------------------"
  
  ########################################################################################################
  # Exiting the excel object
  ########################################################################################################
  $objExcel.Quit()
  
  ########################################################################################################
  #Release all the objects used above
  ########################################################################################################
  $a = Release-Ref($UserWorksheet)
  $a = Release-Ref($UserWorkBook) 
  $a = Release-Ref($objExcel)
  </code></pre>