ProductivityTools.ImportExcelToSQL.psm1
function Import-ExcelToSql() { [cmdletbinding()] param ( [Parameter(Mandatory=$false)] [string]$Directory, [Parameter(Mandatory=$true)] [string]$SqlInstance, [Parameter(Mandatory=$true)] [string]$DatabaseName, [Parameter(Mandatory=$false)] [string]$SchemaName="xlsx", [Parameter(Mandatory=$false)] [Switch]$DropDatabase=$false, [Parameter(Mandatory=$false)] [string]$DatabaseDirectory) Write-Verbose "Import Excel started" if ($Directory -eq "") { $Directory=$((Resolve-Path .\).Path) } Write-Verbose "Directory $Directory" Write-Verbose "SqlInstance $SqlInstance" Write-Verbose "DatabaseName $DatabaseName" Write-Verbose "SchemaName $SchemaName" Write-Verbose "DropDatabase $DropDatabase" Write-Verbose "DatabaseDirectory $DatabaseDirectory" CreateStructure $Directory $SqlInstance $DatabaseName $SchemaName $DropDatabase $DatabaseDirectory ImportData $Directory $SqlInstance $DatabaseName $SchemaName InvokeAdditionalSQL -Directory $Directory -SqlInstance $SqlInstance -DatabaseName $DatabaseName } function InvokeAdditionalSql([string]$Directory,[string]$SqlInstance,[string]$DatabaseName) { Ivoke-SQLScripts -SqlInstance $SqlInstance -DatabaseName $DatabaseName -Directory $Directory } function ImportData() { [cmdletbinding()] param ([string]$directory,[string]$sqlInstance,[string]$databaseName,[string]$schemaName) Write-Verbose "$Directory $SqlInstance $DatabaseName $Schema" $excelFiles=GetFiles($directory) foreach($file in $excelFiles) { $excel=Import-Excel $file $tableName=GetTableName $file foreach($row in $excel) { Insert $sqlInstance $databaseName $schemaName $tableName $row } } } function Insert() { [cmdletbinding()] param ([string]$sqlInstance, [string]$databaseName, [string]$schemaName,[string]$tableName,$row) $headers="" $values="'" $columnNames=Get-Member -InputObject $row |where {$_.MemberType -eq "NoteProperty"} |select Name foreach($column in $columnNames) { $columnName= $column.Name $headers+="[$columnName]"+',' $values+=$row."$columnName" $values+="','" } $headers=$headers.Trim(',') $values=$values.TrimEnd("'").TrimEnd(",") $query="INSERT INTO [$schemaName].[$tableName]($headers) VALUES ($values)" Invoke-SQLQuery -SqlInstance $SqlInstance -DatabaseName $DatabaseName -Query $Query -Verbose:$VerbosePreference } function GetFiles([string]$directory) { $path="$directory\*.xlsx" $excelFiles=Get-ChildItem -Path $path return $excelFiles } function GetTableName($file) { $tableName=$file.BaseName return $tableName } function CreateStructure() { [cmdletbinding()] param ([string]$directory,[string]$sqlInstance,[string]$databaseName,[string]$schemaName,[bool]$DropDatabase=$false,[string]$DatabaseDirectory) Write-Verbose "Create structure started" if ($DropDatabase) { New-SQLDatabase -Path $DatabaseDirectory -SqlInstance $sqlInstance -DatabaseName $databaseName -Force -Verbose:$VerbosePreference } else { New-SQLDatabase -Path $DatabaseDirectory -SqlInstance $sqlInstance -DatabaseName $databaseName -Verbose:$VerbosePreference } $excelFiles=GetFiles($directory) foreach($file in $excelFiles) { $tableName=GetTableName $file New-SQLTable -SqlInstance $sqlInstance -DatabaseName $databaseName -SchemaName $schemaName -TableName $tableName -Force -Verbose:$VerbosePreference CreateColumns $file $tableName $schemaName } } function CreateColumns() { [cmdletbinding()] param ($file, $TableName, $schemaName) $excel=Import-Excel $file $properties = Get-Member -InputObject $excel[1] |where {$_.MemberType -eq "NoteProperty"} foreach($property in $properties) { $columnName = $property.Name $type = $($property.Definition).split(' ')[0] $sqlType="VARCHAR(Max)"; switch ($type) { "double" { $sqlType="FLOAT"} } New-SQLColumn -SqlInstance $SqlInstance -DataBaseName $DatabaseName -SchemaName $schemaName -TableName $TableName -ColumnName $columnName -Type $sqlType -Verbose:$VerbosePreference } } Export-ModuleMember Import-ExcelToSql |