2011-09-14 35 views
27

Tôi cần tạo gói SSIS để nhập dữ liệu từ nhiều tệp Excel vào cơ sở dữ liệu SQL. Tôi dự định sử dụng các thùng chứa Foreach Loop lồng nhau để đạt được điều này. Một Foreach File Enumerator và lồng nhau trong đó, một Foreach ADO.net Schema Rowset EnumeratorLàm thế nào để lặp qua các tệp Excel và tải chúng vào cơ sở dữ liệu bằng gói SSIS?

Vấn đề cần xem xét: Tên bảng khác nhau giữa các tệp excel nhưng cấu trúc vẫn giữ nguyên.

Tôi đã tạo Trình quản lý kết nối Excel, nhưng Bộ đếm giản đồ Rowset không chấp nhận trình quản lý kết nối trong cấu hình Bộ đếm.

Sau khi nghiên cứu, tôi thấy rằng bạn có thể sử dụng nhà cung cấp dịch vụ Jet Ole db để kết nối với tệp excel. Tuy nhiên, tôi chỉ có thể chỉ định tệp cơ sở dữ liệu Microsoft Access làm nguồn dữ liệu. Cố gắng chèn Tệp Excel dưới dạng nguồn dữ liệu không thành công

Sau khi nghiên cứu thêm, tôi thấy rằng bạn có thể sử dụng Nhà cung cấp Dữ liệu Odbc với chuỗi kết nối thay vì DSN. Sau khi chèn một chuỗi kết nối chỉ định tệp Excel, điều này cũng không thành công

Tôi đã được yêu cầu không sử dụng Tác vụ tập lệnh để thực hiện việc này và thậm chí sau khi thử một nỗ lực cuối cùng để trích xuất dữ liệu từ trang tính. mà chỉ số cho các tấm trong file excel khác nhau là khác nhau

Bất kỳ trợ giúp sẽ được đánh giá rất

+0

Tên tệp kết thúc bằng ".xslx". File Enumerator tìm kiếm các tệp này: "[wildcard] .xls [wildcard]". Trình quản lý kết nối Excel tự động định dạng là "Microsoft Excel 2007". – Xariex

+0

[link] (https://stackoverflow.com/documentation/ssis/9838/load-multiple-csv-files-of-same-format-from-a-folder#t=201705040855490267183) liên kết để tải nhiều CSV có cùng định dạng từ thư mục đến cơ sở dữ liệu. – observer

Trả lời

78

Dưới đây là một cách tốt để làm điều này dựa trên giả định rằng sẽ không có bất kỳ tấm trống trong Excel các tệp và tất cả các trang tính đều theo cùng cấu trúc chính xác. Ngoài ra, theo giả định rằng phần mở rộng tập tin là chỉ .xlsx

Tiếp theo ví dụ được tạo bằng SSIS 2008 R2Excel 2007. Thư mục làm việc cho ví dụ này là F:\Temp\

Trong đường dẫn thư mục F:\Temp\, tạo tệp bảng tính Excel 2007 có tên States_1.xlsx với hai trang tính.

Sheet 1 của States_1.xlsx chứa các dữ liệu sau

States_1_Sheet_1

Sheet 2 của States_1.xlsx chứa các dữ liệu sau

States_1_Sheet_2

Trong đường dẫn thư mục F:\Temp\, tạo nên một tệp bảng tính Excel 2007 khác có tên là States_2.xlsx với hai trang tính.

Sheet 1 của States_2.xlsx chứa các dữ liệu sau

States_2_Sheet_1

Sheet 2 của States_2.xlsx chứa các dữ liệu sau

States_2_Sheet_2

Tạo một bảng trong SQL Server tên dbo.Destination sử dụng dưới đây tạo ra kịch bản. Dữ liệu trang tính Excel sẽ được chèn vào bảng này.

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 

Bảng hiện đang trống.

Empty table

Tạo một gói SSIS mới và trên bao bì, tạo ra 4 biến sau. FolderPath sẽ chứa thư mục chứa các tệp Excel. FilePattern sẽ chứa phần mở rộng của các tệp sẽ được lặp qua và ví dụ này chỉ hoạt động cho .xlsx. FilePath sẽ được gán với giá trị bởi vùng chứa Foreach Loop nhưng chúng ta cần một đường dẫn hợp lệ để bắt đầu với thời gian thiết kế và nó hiện được điền bằng đường dẫn F:\Temp\States_1.xlsx của tệp Excel đầu tiên. SheetName sẽ chứa tên trang tính thực tế nhưng chúng tôi cần điền giá trị ban đầu Sheet1$ để tránh lỗi thời gian thiết kế.

Variables

Trong quản lý kết nối của gói, tạo ra một kết nối ADO.NET với cấu hình sau đây và đặt tên là ExcelSchema.

Chọn nhà cung cấp Microsoft Office 12.0 Access Database Engine OLE DB Provider trong .Net Nhà cung cấp cho OleDb. Cung cấp các đường dẫn tập tin F:\Temp\States_1.xlsx

ExcelSchema 1

Bấm vào All phần ở phía bên trái và thiết lập thuộc tính mở rộng Properties để Excel 12.0 để biểu thị phiên bản của Excel. Trong trường hợp này, 12.0 biểu thị Excel 2007. Nhấn vào Test Connection để đảm bảo kết nối thành công.

ExcelSchema 2

Tạo một trình quản lý kết nối Excel tên Excel như hình dưới đây.

Excel

Tạo một OLE DB kết nối SQL Server tên SQLServer. Vì vậy, chúng ta nên có ba kết nối trên bao bì như hình dưới đây.

Connections

Chúng ta cần phải làm những thay đổi chuỗi kết nối sau đây để các tập tin Excel bị thay đổi năng động như các tập tin được looped qua.

Trên kết nối ExcelSchema, định cấu hình biểu thức ServerName để sử dụng biến FilePath. Nhấp vào nút dấu ba chấm để định cấu hình biểu thức.

ExcelSchema ServerName

Tương tự như vậy vào kết nối Excel, cấu hình các biểu ServerName sử dụng biến FilePath. Nhấp vào nút dấu ba chấm để định cấu hình biểu thức.

Excel ServerName

Trên Flow Control, đặt hai container Foreach Vòng một trong khác. Các tệp vòng lặp có tên Foreach Loop container đầu tiên sẽ lặp qua các tệp. Thứ hai Foreach Loop container sẽ thông qua các trang tính trong vùng chứa. Trong khu vực nội Đối với mỗi thùng chứa vòng lặp, đặt một Data Flow nhiệm vụ mà sẽ đọc các tập tin Excel và tải dữ liệu vào SQL

Control Flow

Cấu hình đầu tiên chứa vòng lặp foreach tên Vòng file như hình dưới đây:

Foreach Loop 1 Collection

Foreach Loop 1 Variable Mappings

Cấu hình đầu tiên chứa vòng lặp foreach tên tờ Vòng như hình dưới đây:

Foreach Loop 2 Collection

Foreach Loop 2 Variable Mappings

Bên trong nhiệm vụ luồng dữ liệu, đặt một cột Excel Nguồn, nguồn gốc và OLE DB Destination như hình dưới đây:

Data Flow Task

Định cấu hình Nguồn Excel để đọc tệp Excel thích hợp và trang tính hiện đang được lặp qua .

Excel Source Connection Manager

Excel Source Columns

Configure cột xuất phát để tạo ra các cột mới cho tên tập tin và tên sheet. Đây chỉ là để chứng minh ví dụ này nhưng không có ý nghĩa.

Derived column

Định cấu hình đích OLE DB để chèn dữ liệu vào bảng SQL.

OLE DB Destination Connection Manager

OLE DB Destination Columns

Dưới ảnh chụp màn hình cho thấy thực hiện thành công của gói.

Execution successful

Dưới ảnh chụp màn hình cho thấy dữ liệu từ 4 workbook trong 2 bảng tính Excel được tạo ra trong phần đầu của câu trả lời này được nạp một cách chính xác vào dbo.Destination bảng SQL.

SQL table

Hy vọng điều đó sẽ hữu ích.

+1

Cảm ơn Siva. Đây là một câu trả lời hữu ích. Tuy nhiên nó vẫn tiếp tục thất bại. Vào cuối ngày, tôi đã viết một kịch bản Powershell để phát hiện tờ mục tiêu và thay đổi tên. Làm cho nó để tất cả các tờ có cùng tên để tham khảo chúng bằng. Cảm ơn câu trả lời của bạn – Xariex

+2

Điều này rất hữu ích đối với tôi. Lúc đầu, nó vẫn không thành công và đó là vì tôi phải thiết lập các bit Debugging 64 thành FALSE. Để làm điều này, hãy vào Project -> YourProjectProperties -> Debugging -> Run64BitRuntime = FALSE – Migs

+0

Điều này rất hữu ích, nhưng tôi muốn làm cho tên tập tin năng động mà tôi không muốn đặt tên tập tin mọi lúc một mình. Có khả năng nào không? –

10

Tôi đã chạy vào một bài viết minh họa một phương thức mà dữ liệu từ cùng một bảng tính excel có thể được nhập vào bảng đã chọn cho đến khi không có sửa đổi nào nổi trội với các kiểu dữ liệu.

Nếu dữ liệu được chèn hoặc ghi đè bằng dữ liệu mới, quy trình nhập sẽ được thực hiện thành công và dữ liệu sẽ được thêm vào bảng trong cơ sở dữ liệu SQL.

Bài viết có thể được tìm thấy tại đây: http://www.sqlshack.com/using-ssis-packages-import-ms-excel-data-database/

Hy vọng điều đó sẽ hữu ích.

0

Tôi gặp sự cố tương tự và nhận thấy rằng việc xóa các tệp Excel càng đơn giản càng dễ dàng càng nhiều càng tốt. Là một phần của các bước đầu tiên trong gói của tôi, tôi đã sử dụng Powershell để trích xuất dữ liệu ra khỏi tệp Excel thành tệp CSV. file Excel của riêng tôi là đơn giản nhưng đây

Extract and convert all Excel worksheets into CSV files using PowerShell

là một bài viết xuất sắc của Tim Smith về giải nén dữ liệu từ nhiều file Excel và/hoặc nhiều sheet.

Khi các tệp Excel đã được chuyển đổi sang CSV, việc nhập dữ liệu ít phức tạp hơn nhiều.

Các vấn đề liên quan