Reading Excel Files
Windows only
Problem
You would like to read a Microsoft Excel file from RhinoScript into an array that can be accessed in Rhino.
Solution
The following general purpose function will read an Excel worksheet into a two-dimensional array…
' Description:
' Reads a Microsoft Excel file.
' Parameters:
' strFile - [in] The name of the Excel file to read.
' Returns:
' A two-dimension array of cell values, if successful.
' Null on error
Option Explicit
Function ReadExcelFile(ByVal strFile)
' Local variable declarations
Dim objExcel, objSheet, objCells
Dim nUsedRows, nUsedCols, nTop, nLeft, nRow, nCol
Dim arrSheet()
' Default return value
ReadExcelFile = Null
' Create the Excel object
On Error Resume Next
Set objExcel = CreateObject("Excel.Application")
If (Err.Number <> 0) Then
Exit Function
End If
' Don't display any alert messages
objExcel.DisplayAlerts = 0
' Open the document as read-only
On Error Resume Next
Call objExcel.Workbooks.Open(strFile, False, True)
If (Err.Number <> 0) Then
Exit Function
End If
' If you wanted to read all sheets, you could call
' objExcel.Worksheets.Count to get the number of sheets
' and the loop through each one. But in this example, we
' will just read the first sheet.
Set objSheet = objExcel.ActiveWorkbook.Worksheets(1)
' Get the number of used rows
nUsedRows = objSheet.UsedRange.Rows.Count
' Get the number of used columns
nUsedCols = objSheet.UsedRange.Columns.Count
' Get the topmost row that has data
nTop = objSheet.UsedRange.Row
' Get leftmost column that has data
nLeft = objSheet.UsedRange.Column
' Get the used cells
Set objCells = objSheet.Cells
' Dimension the sheet array
ReDim arrSheet(nUsedRows - 1, nUsedCols - 1)
' Loop through each row
For nRow = 0 To (nUsedRows - 1)
' Loop through each column
For nCol = 0 To (nUsedCols - 1)
' Add the cell value to the sheet array
arrSheet(nRow, nCol) = objCells(nRow + nTop, nCol + nLeft).Value
Next
Next
' Close the workbook without saving
Call objExcel.ActiveWorkbook.Close(False)
' Quit Excel
objExcel.Application.Quit
' Return the sheet data to the caller
ReadExcelFile = arrSheet
End Function
You can use this function to dump the contents of a spreadsheet to Rhino’s command line:
Sub ExcelDumper()
' Local variable declarations
Dim strFile, arrSheet, i, j, varCell, strFormat
' Prompt for the Excel file to read
strFile = Rhino.OpenFileName("Open", "Excel Files (*.xls)|*.xls|")
If IsNull(strFile) Then Exit Sub
' Read the Excel file
arrSheet = ReadExcelFile(strFile)
If IsNull(arrSheet) Then Exit Sub
' Dump the worksheet to the command line
For i = 0 To UBound(arrSheet, 1)
For j = 0 To UBound(arrSheet, 2)
strFormat = "Sheet(" & CStr(i) & "," & CStr(j) & ") = "
varCell = arrSheet(i, j)
If IsEmpty(varCell) Then
Rhino.Print strFormat & "<empty>"
Else
Rhino.Print strFormat & CStr(varCell)
End If
Next
Next
End Sub