F# Excel Type Provider

F# Excel Type Provider

There comes a time in the life of every developer where he has to manipulate getting data from an Excel file. Either because migrating the information to another system is needed, or just for a preprocessing to conform with a defined format, for example, a Power BI data source.

Suppose we have to migrate data from an Excel file, with an identified format, to a database of a system we are building. The main problem is to browse the file and get the relevant data for our new system, which can also be calculated. Let’s also assume that the classes that are responsible for saving the information in our database are already implemented, once it is obtained.

An implementation of our model in C # would be as follows:

Img1

On the other hand, Excel files come from another system, which contains a lot of information; much more than we need.

If we read these files using C#, we should use a library. The most basic would be Microsoft.Office.Interop or you can use a third party one such as Syncfusion. The disadvantage of the first option is that it is extremely difficult to use such libraries because they are not code-managed and if the developer is not extremely careful there might be memory problems. Not to mention the fact that including it as a reference in a project can become extremely awkward. On the other hand, higher-level libraries are much easier to use, but many of them are expensive. Finally, none of them will give the developer the capacity to get Intellisense against the file itself. This can make the developer consume a huge amount of time.

It is here where F# and its Type Providers gain access. F# is a .NET platform language with functional characteristics, although it also has the possibility of being object oriented. In addition, it has a unique feature: a developer can implement a very special type of library called Type Provider. These libraries allow, among other things, to connect to different data sources such as Excel, CSV, JSON, etc. and allow them to be manipulated using Intellisense on the content of these data sources.

In our case, a probable Excel file whose data we would like to migrate can have this form:

img2

The code used by the provider is extremely short, understandable and efficient. What is done is to take a sample Excel at development time and assume that all files to be processed will have that structure.

img3

imagen4

In line 9, the type of Excel to be processed is defined. This is done from a sample file, which should be one with the same “outline” as those to which the process will be applied. In line 11 is defined a function in charge of making the transformation between an Excel row and an object of our domain, in this case Product. There are several things to note about this method. The first is that we know, for each column exactly what type it is. Which it is very powerful to avoid programming errors. The second is that in F # you can have property names (also variables, and any names in general) composed and separated by spaces. For this, double quotes ““” are used.

The second function seems complex but is actually very simple. On line 23 instantiates an object of type “ExcelType” using an Excel file. Here what will happen is that it will try to use the Excel structure that defines the type, in this case “typeOfExcel.xlsx” but with the data that is inside the file “simple.xlsx”. Now comes what may seem a bit strange, but that is actually very simple and powerful. The F# “|>” operator takes the value returned by the previous expression and passes it as a parameter to the next function. In other words, the value of “file.Data” is first taken and passed to the function of line 26. This is responsible for filtering the rows that are empty (this can happen if an extra Enter was specified in the file next to the last row with a value). Then, the result, i.e. the filtered rows, is passed as a parameter to the function of line 27, which uses the function defined in line 11 to convert each row of Excel in a Product instance. What the last line does is return these products. In F # the return keyword is not necessary since it assumes that a function returns the last expression of its body, which in this case is “value”.

To use the power of this language, it is not even necessary to create a project. Visual Studio has a window that allows you to test and execute F # code interactively, so you only need access to the ExcelProvider library to use this with Excels on a daily basis.

The code that shows the example described is found in the following Github Repository.


Llega un momento en la vida de todo desarrollador en que tiene que manipular obtener datos de un archivo de Excel. Ya sea porque se quiere migrar la información a otro sistema, o simplemente para realizar un Preprocesamiento para conformar con un formato definido, por ejemplo, el de un origen de datos de Power BI.

Supongamos que tenemos la tarea de migrar la información los datos de un Excel, con cierto formato conocido, a una base de datos de un sistema que estamos construyendo. El problema principal es recorrer el archivo y obtener los datos relevantes para nuestro nuevo sistema. Los cuales pueden además ser calculados. Asumamos, además, que ya se encuentran implementadas las clases que se encargan de guardar en nuestra base de datos la información, una vez esta obtenida.

Una implementación de nuestro modelo en C# sería la siguiente:

Img1

Por otra parte, los archivos Excel, vienen de otro sistema, el cual contiene muchísima información; mucho más de lo que necesitamos.

Si quisiéramos leer estos archivos utilizando C#, deberíamos utilizar alguna librería. La más básica sería Microsoft.Office.Interop o se puede usar alguna de terceros como sería Syncfusion. La desventaja de la primera opción es que es sumamente complicado usar este tipo de librerías, ya que no son de código manejado y si el desarrollador no es sumamente cuidadoso puede haber problemas de memoria. Sin mencionar el hecho de que incluirla como referencia en un proyecto puede llegar a ser sumamente engorroso. Por otro lado, librerías de más alto nivel son mucho más fáciles de usar, pero muchas de ellas son costosas. Por último, ninguna de ellas le brindan al desarrollador la capacidad de obtener Intellisense contra el archivo mismo. Esto puede hacer consumir al desarrollador una cantidad enorme de tiempo.

Es aquí donde entra F# y sus Type Providers. F# es un lenguaje de la plataforma .NET con características funcionales, aunque también tiene la posibilidad de utilizarse orientado a objetos. Además, tiene una característica única, que es el hecho de que un desarrollador puede implementar un tipo muy especial de librería llamada Type Provider. Estas librerías, permiten, entre otras cosas, conectarse a distintos orígenes de datos como archivos Excel, CSV, JSON, etc y permiten manipularlos utilizando Intellisense sobre el contenido de dichas fuentes de datos.

En nuestro caso, un posible Excel cuyos datos querríamos migrar puede tener esta forma:

img2

Ahora, el código que utiliza el provider es sumamente corto, entendible y eficiente. Lo que se hace es tomar un Excel de ejemplo en tiempo de desarrollo y se asume que todos los archivos que vayan a procesarse tendrán esa estructura.

img3

imagen4

En la línea 9, se define el tipo del Excel que se va a procesar. Esto se hace a partir de un archivo de muestra, que debería ser uno con el mismo “esquema” que aquellos a los que se les va a aplicar el proceso. En la línea 11 se define una función encargada de hacer la transformación entre una fila de Excel y un objeto de nuestro dominio, en este caso Product. Hay varias cosas a resaltar de este método. La primera, es que sabemos, para cada columna exactamente de qué tipo es. Lo cual es sumamente poderoso para evitar errores de programación. Lo segundo, es que en F# se pueden tener nombres de propiedades (también variables, y cualquier nombre en general) compuestos y separados por espacios. Para esto, se utilizan las dobles comillas ““”.

La segunda función parece compleja pero en realidad es muy sencilla. En la línea 23 instancia un objeto de tipo “ExcelType” utilizando un archivo de Excel. Aquí lo que va a pasar es que va a intentar utilizar la estructura del Excel que define el tipo, en este caso “typeOfExcel.xlsx” pero con los datos que se encuentran dentro del archivo “simple.xlsx”. Ahora viene lo que puede parecer un poco extraño, pero que en realidad es muy sencillo y potente. El operador “|>” de F# se encarga de tomar el valor que devuelve la expresión anterior y la pasa como parámetro a la función siguiente. Es decir, primero se toma el valor de “file.Data” y se pasa a la función de la línea 26. Esta se encarga de filtrar las filas que se encuentren vacías (esto puede pasar si se le dio un Enter extra al archivo luego de la última fila con un valor). Luego el resultado, es decir las filas filtradas, se pasan como parámetro a la función de la línea 27, que utiliza la función definida en la línea 11 para convertir cada fila del Excel en una instancia de Product. La última línea lo que hace es devolver estos productos. En F# no es necesaria la palabra clave return ya que asume que una función devuelve la última expresión de su cuerpo. En este caso, “value”.
Para utilizar el poder de este lenguaje, ni siquiera es necesario crear un proyecto. Visual Studio cuenta con una ventana que permite probar y ejecutar código F# de manera interactiva, por lo que sólo se necesita acceso a la librería del ExcelProvider para utilizar esto con Excels de manera cotidiana.
El código que demuestra el uso mostrado como ejemplo se encuentra en el siguiente Repositorio de Github.

Share This
Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedIn