2011-09-14 21 views
27

Necesito crear un paquete SSIS para importar datos desde múltiples archivos de Excel en una base de datos SQL. Planeo usar contenedores anidados de Foreach Loop para lograr esto. Un enumerador de archivos Foreach y anidado dentro de ese, Foreach ADO.net Schema Rowset EnumeratorCómo recorrer los archivos de Excel y cargarlos en una base de datos utilizando el paquete SSIS?

Problema a tener en cuenta: los nombres de las hojas son diferentes entre los archivos de Excel, pero la estructura sigue siendo la misma.

He creado un administrador de conexión de Excel, pero el conjunto de filas de esquema enumerador no está aceptando el administrador de conexión en la configuración enumerador.

Después de investigar, descubrí que se puede utilizar el proveedor Jet OLE DB para conectarse a un archivo de Excel. Sin embargo, solo puedo especificar archivos de base de datos de Microsoft Access como fuente de datos. Intentar insertar un archivo de Excel como origen de datos no

Después de más investigación he encontrado que se puede utilizar el proveedor de datos ODBC con una cadena de conexión en lugar de un DSN. Después de insertar una cadena de conexión que especifica el archivo de Excel, esto también falló

Me han dicho que no use una tarea de secuencia de comandos para lograr esto e incluso después de intentar un último esfuerzo para extraer datos de las hojas accediendo a las hojas por índice que encontré que el índice de las hojas en los diferentes archivos de Excel son diferentes

cualquier ayuda sería muy apreciada

+0

Los nombres de archivo terminan en ".xslx". File Enumerator busca estos archivos: "[comodín] .xls [comodín]". Excel Connection Manager detectó automáticamente el formato como "Microsoft Excel 2007". – Xariex

+0

[link] (https://stackoverflow.com/documentation/ssis/9838/load-multiple-csv-files-of-same-format-from-a-folder#t=201705040855490267183) el enlace es para cargar varios archivos CSV del mismo formato de una carpeta a la base de datos. – observer

Respuesta

78

Aquí es una forma posible de hacer esto en base a la suposición de que no habrá ninguna hoja en blanco en el Excel archivos y también todas las hojas siguen la misma estructura exacta. Además, bajo el supuesto de que la extensión del archivo es solamente .xlsx

Siguiendo el ejemplo se ha creado usando SSIS 2008 R2 y Excel 2007. La carpeta de trabajo para este ejemplo es F:\Temp\

En la ruta de la carpeta F:\Temp\, cree un archivo de hoja de cálculo de Excel 2007 llamado States_1.xlsx con dos hojas de cálculo.

Sheet 1 de States_1.xlsx contenían los siguientes datos

States_1_Sheet_1

Sheet 2 de States_1.xlsx contenía los siguientes datos

States_1_Sheet_2

En la ruta de la carpeta F:\Temp\, crear otro archivo de hoja de cálculo Excel 2007 nombrado States_2.xlsx con dos hojas de trabajo.

Sheet 1 de States_2.xlsx contenían los siguientes datos

States_2_Sheet_1

Sheet 2 de States_2.xlsx contenía los siguientes datos

States_2_Sheet_2

Crear una tabla en SQL Server denominado dbo.Destination mediante el siguiente script de creación. Los datos de la hoja de Excel se insertarán en esta tabla.

CREATE TABLE [dbo].[Destination](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [State] [nvarchar](255) NULL, 
    [Country] [nvarchar](255) NULL, 
    [FilePath] [nvarchar](255) NULL, 
    [SheetName] [nvarchar](255) NULL, 
CONSTRAINT [PK_Destination] PRIMARY KEY CLUSTERED ([Id] ASC)) ON [PRIMARY] 
GO 

La tabla está actualmente vacía.

Empty table

Cree un nuevo paquete de SSIS y en el paquete, cree los siguientes 4 variables. FolderPath contendrá la carpeta donde se almacenan los archivos de Excel. FilePattern contendrá la extensión de los archivos que se enlazarán y este ejemplo solo funciona para .xlsx. Se asignará a FilePath un valor en el contenedor Foreach Loop, pero necesitamos una ruta válida para comenzar con el tiempo de diseño y actualmente se rellena con la ruta F:\Temp\States_1.xlsx del primer archivo de Excel. El Nombre de la hoja contendrá el nombre de la hoja real, pero necesitamos rellenarlo con el valor inicial Sheet1$ para evitar el error de tiempo de diseño.

Variables

En administrador de conexión del paquete, cree una conexión ADO.NET con la siguiente configuración y el nombre como ExcelSchema.

Seleccione el proveedor Microsoft Office 12.0 Access Database Engine OLE DB Provider en .Net Proveedores para OleDb. Proporcionar la ruta del archivo F:\Temp\States_1.xlsx

ExcelSchema 1

Haga clic en la sección All en el lado izquierdo y establecer las propiedades de propiedad extendido a Excel 12.0 para denotar la versión de Excel. Aquí en este caso 12.0 denota Excel 2007. Haga clic en Probar conexión para asegurarse de que la conexión tenga éxito.

ExcelSchema 2

Crear un administrador de conexión de Excel denominado Excel como se muestra a continuación.

Excel

Crear una conexión OLE DB de SQL Server denominado SQLServer. Entonces, deberíamos tener tres conexiones en el paquete como se muestra a continuación.

Connections

que tenemos que hacer los siguientes cambios de cadena de conexión para que el archivo de Excel se cambia dinámicamente a medida que los archivos se enlazan a través.

En la conexión ExcelSchema, configure la expresión ServerName utilizar la variable FilePath. Haga clic en el botón de puntos suspensivos para configurar la expresión.

ExcelSchema ServerName

Del mismo modo en la conexión Excel, configurar la expresión ServerName utilizar la variable FilePath. Haga clic en el botón de puntos suspensivos para configurar la expresión.

Excel ServerName

En el flujo de control, coloque dos contenedores de bucles Foreach uno dentro del otro. Los primeros Foreach Loop container archivos Loop con nombre recorrerán los archivos. El segundo Foreach Loop container pasará por las hojas dentro del contenedor. En el interior Para cada contenedor de bucle, colocar una tarea Flujo de datos que se va a leer los archivos de Excel y cargar datos en SQL

Control Flow

Configurar el primer contenedor de bucle Foreach llamado ficheros de bucle como se muestra a continuación:

Foreach Loop 1 Collection

Foreach Loop 1 Variable Mappings

Configurar el primer contenedor de bucle Foreach llamado hojas Loop como se muestra a continuación:

Foreach Loop 2 Collection

Foreach Loop 2 Variable Mappings

Dentro de la tarea de flujo de datos, coloque una columna de Excel Fuente, derivados y de Destino de OLE DB como se muestra a continuación:

Data Flow Task

Configure el origen de Excel para leer el archivo de Excel apropiado y la hoja que se está bucleando actualmente .

Excel Source Connection Manager

Excel Source Columns

Configurar la columna derivada para crear nuevas columnas de nombre de archivo y nombre de la hoja. Esto es solo para demostrar este ejemplo, pero no tiene importancia.

Derived column

Configurar el destino de OLE DB para insertar los datos en la tabla de SQL.

OLE DB Destination Connection Manager

OLE DB Destination Columns

A continuación pantalla muestra una ejecución exitosa del paquete.

Execution successful

A continuación pantalla muestra que los datos de los 4 libros de trabajo en 2 hojas de cálculo de Excel que estaban creando en el comienzo de esta respuesta se ha cargado correctamente en la tabla de SQL dbo.Destination.

SQL table

Espero que ayude.

+1

Gracias Siva. Esta fue una respuesta útil. Sin embargo, siguió fallando de mi lado. Al final del día, terminé escribiendo un script de Powershell que detecta la hoja de destino y cambia el nombre. Haciéndolo de modo que todas las hojas tengan el mismo nombre para referenciarlas. Gracias por su respuesta – Xariex

+2

Esto funcionó muy bien para mí. Al principio siguió fallando y fue porque tuve que configurar Debugging 64 bits en FALSE. Para ello, vaya a Proyecto -> Propiedades de su proyecto -> Depuración -> Run64BitRuntime = FALSE – Migs

+0

Esto fue muy útil, pero quería que el nombre de archivo fuera dinámico y no quería poner el nombre de archivo cada vez. ¿Hay alguna posibilidad? –

10

Me encontré con un artículo que ilustra un método donde los datos de la misma hoja de Excel se pueden importar en la tabla seleccionada hasta que no haya modificaciones en excel con los tipos de datos.

Si los datos se insertan o sobrescriben con nuevos, el proceso de importación se realizará con éxito, y los datos se agregarán a la tabla en la base de datos SQL.

El artículo se puede encontrar aquí: http://www.sqlshack.com/using-ssis-packages-import-ms-excel-data-database/

espero que ayude.

0

Tuve un problema similar y descubrí que era mucho más simple deshacerse de los archivos de Excel lo antes posible. Como parte de los primeros pasos de mi paquete, utilicé Powershell para extraer los datos de los archivos de Excel en archivos CSV. Mis propios archivos de Excel eran simples pero aquí

Extract and convert all Excel worksheets into CSV files using PowerShell

es un excelente artículo de Tim Smith en la extracción de datos de múltiples archivos de Excel y/o varias hojas.

Una vez que los archivos de Excel se han convertido a CSV, la importación de datos es mucho menos complicada.

Cuestiones relacionadas