web-dev-qa-db-fra.com

Code permettant de lire la feuille xlsx dans une table d'une base de données SQL Server

J'essaie de lire les données d'une feuille Excel (fichier .xlsx) dans une table de SQL Server 2008. Je souhaite que cela soit exécuté quotidiennement en tant que travail par lots et, par conséquent, je souhaite écrire du code SQL dans une procédure stockée.

Quelqu'un pourrait-il m'aider? J'ai des droits d'administrateur.

~ TIA

16
aaryan

Cela devrait faire ... 

SELECT *
FROM OPENROWSET(
    'Microsoft.ACE.OLEDB.12.0',
    'Excel 8.0;HDR=NO;Database=T:\temp\Test.xlsx',
    'select * from [sheet1$]')

Mais nous sommes conscients que, parfois, cela ne fonctionne tout simplement pas. J'avais ce travail pour les administrateurs locaux seulement. 

Il existe un moyen de faire cela en utilisant également SSIS.

21
kiri

Pour importer/exporter des données vers/depuis Excel (.xls), vous devez disposer de Microsoft.Jet.OLEDB.4.0 et, pour Excel 2007 (.xlsx), du pilote Office System 2007: composants de connectivité de données. Vous pouvez télécharger de ICI

Importer des données de Excel vers un nouveau fichier de table SQL Server Excel 2003 (.Xls):

select * into SQLServerTable FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database=D:\testing.xls;HDR=YES', 'SELECT * FROM [Sheet1$]')

Fichier Excel 2007 (.Xlsx):

Select * into SQLServerTable FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;Database=D:\testing.xlsx;HDR=YES', 'SELECT * FROM [Sheet1$]')

Importer des données de Excel vers un fichier de table SQL Server Excel 2003 (.Xls) existant:

Insert into SQLServerTable Select * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database=D:\testing.xls;HDR=YES', 'SELECT * FROM [Sheet1$]')

Fichier Excel 2007 (.Xlsx):

INSERT INTO SQLServerTable select * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;Database=D:\testing.xlsx;HDR=YES', 'SELECT * FROM [Sheet1$]')
4
Jitendra Sawant

Faites un clic droit sur la base de données -> Tâches -> Importer des données ... Passez par l'assistant.

1
Dave.Gugg

Emprunter à GridWizard https://gridwizard.wordpress.com/2014/12/23/tsql-utility-to-read-csv-and-Excel-files/

/*
Usage:
exec sp_ReadExcelFile ‘C:\tmp’, ‘EmpData’, ‘EmpData.xls’, ‘[Sheet1$]’, ‘Col1,Col2,Col3,Col4,Col5′
*/
CREATE PROCEDURE sp_ReadExcelFile
(
@TargetFolder varchar(255), /* For example, ‘C:\tmp’ */
@TargetTable varchar(255), /* For example, ‘EmpData’ */
@ExcelFile varchar(255), /* For example, ‘EmpData.xls’ */
@ExcelSheet varchar(255), /* For example, ‘[Sheet1$]’ */
@ExcelFields varchar(8000) /* Comma separate list, for example: ‘Col1,Col2,Col3,Col4,Col5′ */
)
AS
BEGIN
declare @SqlStmt nvarchar(max)
declare @FirstColumn nvarchar(255)

set @SqlStmt = ‘IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N”[dbo].[‘ + @TargetTable + ‘]”) AND type in (N”U”))’
set @SqlStmt = @SqlStmt + ‘ DROP TABLE ‘ + @TargetTable
PRINT @SqlStmt
exec sp_executesql @SqlStmt

select top 1 @FirstColumn=[part] from fn_SplitString(@ExcelFields, ‘,’)
print ‘FirstColumn: ‘ + @FirstColumn

set @SqlStmt = ‘SELECT ‘ + @ExcelFields + ‘ INTO ‘ + @TargetTable + ‘ FROM OPENROWSET(”Microsoft.ACE.OLEDB.12.0”,
”Excel 12.0;DATABASE=’ + @TargetFolder + ‘\’ + @ExcelFile + ‘;IMEX=1”, ”Select * from ‘ + @ExcelSheet + ”’)’
+ ‘WHERE NOT ‘ + @FirstColumn + ‘ IS NULL’
PRINT @SqlStmt
exec sp_executesql @SqlStmt
END
GO

/*
Taken from: http://stackoverflow.com/questions/697519/split-function-equivalent-in-t-sql
Usage: select top 1 part from fn_SplitString(‘aaa,bbb,ccc,ddd,eee’,’,’)
*/
CREATE FUNCTION [dbo].[fn_SplitString]
(
@sString nvarchar(2048),
@cDelimiter nchar(1)
)
RETURNS @tParts TABLE ( part nvarchar(2048) )
AS
BEGIN
if @sString is null return
declare @iStart int,
@iPos int
if substring( @sString, 1, 1 ) = @cDelimiter
begin
set @iStart = 2
insert into @tParts
values( null )
end
else
set @iStart = 1
while 1=1
begin
set @iPos = charindex( @cDelimiter, @sString, @iStart )
if @iPos = 0
set @iPos = len( @sString )+1
if @iPos – @iStart > 0
insert into @tParts
values ( substring( @sString, @iStart, @iPos-@iStart ))
else
insert into @tParts
values( null )
set @iStart = @iPos+1
if @iStart > len( @sString )
break
end
RETURN
END
GO
1
Jaye

Juste une autre alternative rapide 

Si vous n'avez pas besoin d'importer votre fichier Excel par programme à l'aide de code, vous pouvez le faire très rapidement manuellement à l'aide du menu de SQL Management Studio.:

Comment importer un fichier Excel dans SQL Server?

0
Spyder

La méthode la plus simple consiste probablement à importer/exporter Wizard dans SQL Server Management Studio. Voici un site qui explique comment: http://www.mssqltips.com/sqlservertutorial/203/simple-way-to-import-data-into-sql-server/

0
Jerrad