Necesitaba convertir un archivo de Excel con sus propias columnas definidas a uno nuevo con columnas dinámicas, y estaba un poco confundido acerca de cómo hacerlo correctamente sin algunos problemas graves de rendimiento.
Vine a un tutorial que puedes hallar aqui usando .NET ExpandoObject lo que prácticamente le posibilita crear un objeto y agregar miembros dinámicos.
ExpandoObject
La definición de Microsoft es:
Representa un objeto cuyos miembros se pueden agregar y borrar dinámicamente en tiempo de ejecución.
Y tiene algunas observaciones:
La clase ExpandoObject le posibilita agregar y borrar miembros de sus instancias en tiempo de ejecución, y además determinar y obtener valores para estos miembros. Esta clase admite el link dinámico, que le posibilita usar una sintaxis estándar como sampleObject.sampleMember en lugar de una sintaxis más compleja como sampleObject.GetAttribute (“sampleMember”).
Comportamiento actual
Temos uma ExcelExportServiceque, al pasar un Preparar , para este caso ExcelItem, lo usaremos Reflexión para crear un xlsx arquivo.
Até o momento, nuestro código se ve así:
ExcelItem es el objeto con todas las propiedades que se usan para generar el archivo de Excel.
Este enfoque funciona estupendamente, el archivo xlsx se genera sin problemas y cada columna es cada propiedad, usaría esto GetExcelBytes método como este, a modo de ejemplo para guardarlo en un archivo:
O problema
Dado que lo que estamos haciendo bien es utilizar todas las propiedades del ExcelItem objeto, todo lo que quiero es no usarlos todos, solo utilizar 2 o 3 de ellos.
Además es un requisito que no desee cambiar el código, todo debe hacerlo el administrador que decidirá qué columnas deben mostrarse y puede que conozca o no las propiedades del código.
TLDR: todo debe ser dinámico, tenemos un objeto con propiedades y debemos asegurarnos de que el archivo generado tenga Norte propiedades de ese objeto, pero por lo visto no está codificado.
Columnas dinámicas
El cambio sería usar un dinâmico objeto, debido a que nos gustaría determinar qué propiedades del objeto se utilizarán para generar la lista de columnas.
Digamos que tenemos un objeto con muchas propiedades, O que tonelada de ellos, y verdaderamente no queremos cambiar el ExcelItem objeto cada vez que hacemos un cambio, criamos um ColumnExcelItem Tabela, que se utilizará para generar ese ExcelItem.
Estructura de la base de datos
Guardamos esta definición en nuestra base de datos con algo como esto:
Tenga en cuenta que tenemos menos valores que las propiedades existentes del ExcelItem objeto, puesto que tiene 6 propiedades y solo tenemos 3 incluido en la base de datos.
Observe também que Nombre de la propiedad debe coincidir con el nombre de propiedad del objeto que usaré para el mapeo dinámico.
Construyendo el objeto
Ahora que tenemos la tabla de la base de datos, necesitamos construir el repositorio para obtener eso y poder usarlos en el código.
No haré un tutorial para esta parte, saltaré al comienzo del nuevo. GetExcelBytes () Função.
Ahora tendremos que crear un objeto con algunas de las propiedades de ExcelItem, pero totalmente dinámico. En lugar de utilizar las 6 propriedades, solo usamos 3 delas, la que solo queremos enviar.
Ahora imagina que esto ExcelItem el objeto tiene 200 propriedades, enojado, pero podría suceder.
Lo único que tengo que hacer es insertar esas propiedades que quiero representar en el archivo de Excel en ese ColumnExcelItem mesa y eso es todo.
Casos
Nesta circunstância, solo usamos un caso único, pero supongamos que desea tener informes diferentes para algunos usuarios. Digamos que el administração role debería obtener todas las propiedades, después crearía algo como esta estructura en la base de datos.
Subseqüentemente, cuando obtenga la plantilla, podría tener diferentes columnas, todas de forma dinámica y sin código relacionado.
Si tenemos un usuario con el rol Administradores, el archivo contendrá columnas Vamos, batata, Apellido, Era, Creado en, Actualizado en.
En el caso de que generemos con el Comercial papel, que tendra Batata, Era. Apellido.
conclusão
Esta es una magnífica manera de aprender a dinâmico funciona en .NET y es una muy buena solución cuando necesita tener diferentes roles o plantillas para diferentes usuarios y no está verdaderamente interesado en dedicar tiempo a codificar.