mirror of
https://github.com/dfinke/ImportExcel.git
synced 2026-01-06 18:43:25 +00:00
Merge remote-tracking branch 'dfinke/master'
This commit is contained in:
@@ -1,4 +1,93 @@
|
||||
function ConvertFrom-ExcelToSQLInsert {
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Generate SQL insert statements from Excel spreadsheet.
|
||||
|
||||
.DESCRIPTION
|
||||
Generate SQL insert statements from Excel spreadsheet.
|
||||
|
||||
.PARAMETER TableName
|
||||
Name of the target database table.
|
||||
|
||||
.PARAMETER Path
|
||||
Path to an existing .XLSX file
|
||||
|
||||
This parameter is passed to Import-Excel as is.
|
||||
|
||||
.PARAMETER WorkSheetname
|
||||
Specifies the name of the worksheet in the Excel workbook to import. By default, if no name is provided, the first worksheet will be imported.
|
||||
|
||||
This parameter is passed to Import-Excel as is.
|
||||
|
||||
.PARAMETER StartRow
|
||||
The row from where we start to import data, all rows above the StartRow are disregarded. By default this is the first row.
|
||||
|
||||
When the parameters ‘-NoHeader’ and ‘-HeaderName’ are not provided, this row will contain the column headers that will be used as property names. When one of both parameters are provided, the property names are automatically created and this row will be treated as a regular row containing data.
|
||||
|
||||
.PARAMETER Header
|
||||
Specifies custom property names to use, instead of the values defined in the column headers of the TopRow.
|
||||
|
||||
In case you provide less header names than there is data in the worksheet, then only the data with a corresponding header name will be imported and the data without header name will be disregarded.
|
||||
|
||||
In case you provide more header names than there is data in the worksheet, then all data will be imported and all objects will have all the property names you defined in the header names. As such, the last properties will be blanc as there is no data for them.
|
||||
|
||||
.PARAMETER NoHeader
|
||||
Automatically generate property names (P1, P2, P3, ..) instead of the ones defined in the column headers of the TopRow.
|
||||
|
||||
This switch is best used when you want to import the complete worksheet ‘as is’ and are not concerned with the property names.
|
||||
|
||||
.PARAMETER DataOnly
|
||||
Import only rows and columns that contain data, empty rows and empty columns are not imported.
|
||||
|
||||
|
||||
.PARAMETER ConvertEmptyStringsToNull
|
||||
If specified, cells without any data are replaced with NULL, instead of an empty string.
|
||||
|
||||
This is to address behviors in certain DBMS where an empty string is insert as 0 for INT column, instead of a NULL value.
|
||||
|
||||
.EXAMPLE
|
||||
Generate SQL insert statements from Movies.xlsx file, leaving blank cells as empty strings:
|
||||
|
||||
----------------------------------------------------------
|
||||
| File: Movies.xlsx - Sheet: Sheet1 |
|
||||
----------------------------------------------------------
|
||||
| A B C |
|
||||
|1 Movie Name Year Rating |
|
||||
|2 The Bodyguard 1992 9 |
|
||||
|3 The Matrix 1999 8 |
|
||||
|4 Skyfall 2012 9 |
|
||||
|5 The Avengers 2012 |
|
||||
----------------------------------------------------------
|
||||
|
||||
PS C:\> Import-Excel -TableName "Movies" -Path 'C:\Movies.xlsx'
|
||||
INSERT INTO Movies ('Movie Name', 'Year', 'Rating') Values('The Bodyguard', '1992', '9');
|
||||
INSERT INTO Movies ('Movie Name', 'Year', 'Rating') Values('The Matrix', '1999', '8');
|
||||
INSERT INTO Movies ('Movie Name', 'Year', 'Rating') Values('Skyfall', '2012', '9');
|
||||
INSERT INTO Movies ('Movie Name', 'Year', 'Rating') Values('The Avengers', '2012', '');
|
||||
|
||||
.EXAMPLE
|
||||
Generate SQL insert statements from Movies.xlsx file, specify NULL instead of an empty string.
|
||||
|
||||
----------------------------------------------------------
|
||||
| File: Movies.xlsx - Sheet: Sheet1 |
|
||||
----------------------------------------------------------
|
||||
| A B C |
|
||||
|1 Movie Name Year Rating |
|
||||
|2 The Bodyguard 1992 9 |
|
||||
|3 The Matrix 1999 8 |
|
||||
|4 Skyfall 2012 9 |
|
||||
|5 The Avengers 2012 |
|
||||
----------------------------------------------------------
|
||||
|
||||
PS C:\> ConvertFrom-ExcelToSQLInsert -TableName "Movies" -Path "C:\Movies.xlsx" -ConvertEmptyStringsToNull
|
||||
INSERT INTO Movies ('Movie Name', 'Year', 'Rating') Values('The Bodyguard', '1992', '9');
|
||||
INSERT INTO Movies ('Movie Name', 'Year', 'Rating') Values('The Matrix', '1999', '8');
|
||||
INSERT INTO Movies ('Movie Name', 'Year', 'Rating') Values('Skyfall', '2012', '9');
|
||||
INSERT INTO Movies ('Movie Name', 'Year', 'Rating') Values('The Avengers', '2012', NULL);
|
||||
|
||||
.NOTES
|
||||
#>
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[Parameter(Mandatory = $true)]
|
||||
$TableName,
|
||||
@@ -8,39 +97,34 @@ function ConvertFrom-ExcelToSQLInsert {
|
||||
$Path,
|
||||
[Alias("Sheet")]
|
||||
$WorkSheetname = 1,
|
||||
[int]$HeaderRow = 1,
|
||||
[Alias('HeaderRow', 'TopRow')]
|
||||
[ValidateRange(1, 9999)]
|
||||
[Int]$StartRow,
|
||||
[string[]]$Header,
|
||||
[switch]$NoHeader,
|
||||
[switch]$DataOnly
|
||||
[switch]$DataOnly,
|
||||
[switch]$ConvertEmptyStringsToNull
|
||||
)
|
||||
|
||||
$null = $PSBoundParameters.Remove('TableName')
|
||||
$null = $PSBoundParameters.Remove('ConvertEmptyStringsToNull')
|
||||
|
||||
$params = @{} + $PSBoundParameters
|
||||
|
||||
ConvertFrom-ExcelData @params {
|
||||
param($propertyNames, $record)
|
||||
|
||||
$ColumnNames = "'" + ($PropertyNames -join "', '") + "'"
|
||||
$values = foreach ($propertyName in $PropertyNames) { $record.$propertyName }
|
||||
$targetValues = "'" + ($values -join "', '") + "'"
|
||||
$values = foreach ($propertyName in $PropertyNames) {
|
||||
if ($ConvertEmptyStringsToNull.IsPresent -and [string]::IsNullOrEmpty($record.$propertyName)) {
|
||||
'NULL'
|
||||
}
|
||||
else {
|
||||
"'" + $record.$propertyName + "'"
|
||||
}
|
||||
}
|
||||
$targetValues = ($values -join ", ")
|
||||
|
||||
"INSERT INTO {0} ({1}) Values({2});" -f $TableName, $ColumnNames, $targetValues
|
||||
}
|
||||
# $data = Import-Excel @params
|
||||
|
||||
# $PropertyNames = $data[0].psobject.Properties |
|
||||
# Where-Object {$_.membertype -match 'property'} |
|
||||
# Select-Object -ExpandProperty name
|
||||
|
||||
# $ColumnNames = "'" + ($PropertyNames -join "', '") + "'"
|
||||
|
||||
# foreach ($record in $data) {
|
||||
# $values = $(foreach ($propertyName in $PropertyNames) {
|
||||
# $record.$propertyName
|
||||
# })
|
||||
|
||||
# $targetValues = "'" + ($values -join "', '") + "'"
|
||||
|
||||
# "INSERT INTO {0} ({1}) Values({2});" -f $TableName, $ColumnNames, $targetValues
|
||||
# }
|
||||
}
|
||||
34
ConvertFromExcelToSQLInsert.tests.ps1
Normal file
34
ConvertFromExcelToSQLInsert.tests.ps1
Normal file
@@ -0,0 +1,34 @@
|
||||
Import-Module .\ImportExcel.psd1 -Force
|
||||
|
||||
$xlFile = ".\testSQL.xlsx"
|
||||
|
||||
Describe "ConvertFrom-ExcelToSQLInsert" {
|
||||
|
||||
BeforeEach {
|
||||
|
||||
$([PSCustomObject]@{
|
||||
Name="John"
|
||||
Age=$null
|
||||
}) | Export-Excel $xlFile
|
||||
}
|
||||
|
||||
AfterAll {
|
||||
Remove-Item $xlFile -Recurse -Force -ErrorAction Ignore
|
||||
}
|
||||
|
||||
It "Should be empty double single quotes" {
|
||||
$expected="INSERT INTO Sheet1 ('Name', 'Age') Values('John', '');"
|
||||
|
||||
$actual = ConvertFrom-ExcelToSQLInsert -Path $xlFile Sheet1
|
||||
|
||||
$actual | should be $expected
|
||||
}
|
||||
|
||||
It "Should have NULL" {
|
||||
$expected="INSERT INTO Sheet1 ('Name', 'Age') Values('John', NULL);"
|
||||
|
||||
$actual = ConvertFrom-ExcelToSQLInsert -Path $xlFile Sheet1 -ConvertEmptyStringsToNull
|
||||
|
||||
$actual | should be $expected
|
||||
}
|
||||
}
|
||||
@@ -42,7 +42,7 @@ Set-Format -Address $sheet1.Cells["E:E"] -Width 12
|
||||
Set-Format -Address $sheet1.Cells["I:I"] -Width 12
|
||||
|
||||
$BorderBottom = "Thick"
|
||||
$BorderColor = "LightBlue"
|
||||
$BorderColor = "Black"
|
||||
|
||||
Set-Format -Address $sheet1.Cells["A2"] -BorderBottom $BorderBottom -BorderColor $BorderColor
|
||||
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
$xlFile=".\testPivot.xlsx"
|
||||
Remove-Item $xlFile -ErrorAction Ignore
|
||||
|
||||
|
||||
$data =@"
|
||||
Region,Area,Product,Units,Cost
|
||||
North,A1,Apple,100,.5
|
||||
@@ -19,4 +18,4 @@ $data |
|
||||
-AutoSize -AutoFilter `
|
||||
-IncludePivotTable `
|
||||
-PivotRows Product `
|
||||
-PivotData @{"Units"="sum"} -PivotFilter Region, Area
|
||||
-PivotData @{"Units"="sum"} -PivotFilter Region, Area
|
||||
|
||||
14
README.md
14
README.md
@@ -1,7 +1,9 @@
|
||||
PowerShell Import-Excel
|
||||
-
|
||||
|
||||
This PowerShell Module allows you to read and write Excel files without installing Microsoft Excel on your system. No need to bother with the cumbersome Excel COM-objects thanks to the .NET EPPlus DLL (http://epplus.codeplex.com/) which is included in the module. Creating Tables, Pivot Tables, Charts and much more has just become a lot easier.
|
||||
Install from the [PowerShell Gallery](https://www.powershellgallery.com/packages/ImportExcel/).
|
||||
|
||||
This PowerShell Module allows you to read and write Excel files without installing Microsoft Excel on your system. No need to bother with the cumbersome Excel COM-object. Creating Tables, Pivot Tables, Charts and much more has just become a lot easier.
|
||||
|
||||

|
||||
|
||||
@@ -31,9 +33,13 @@ iex (new-object System.Net.WebClient).DownloadString('https://raw.github.com/dfi
|
||||
|
||||
# What's new
|
||||
|
||||
#### 4/10/2018
|
||||
Thanks to the community yet again, [ili101](https://github.com/ili101) for fixes and features
|
||||
- Removed `[PSPlot]` as OutputType. Fixes it throwing an error
|
||||
#### 4/22/2018
|
||||
Thanks to the community yet again
|
||||
- [ili101](https://github.com/ili101) for fixes and features
|
||||
- Removed `[PSPlot]` as OutputType. Fixes it throwing an error
|
||||
- [Nasir Zubair](https://github.com/nzubair) added `ConvertEmptyStringsToNull` to the function `ConvertFrom-ExcelToSQLInsert`
|
||||
- If specified, cells without any data are replaced with NULL, instead of an empty string. This is to address behviors in certain DBMS where an empty string is insert as 0 for INT column, instead of a NULL value.
|
||||
|
||||
|
||||
#### 4/10/2018
|
||||
-New parameter `-ReZip`. It ReZips the xlsx so it can be imported to PowerBI
|
||||
|
||||
BIN
Testimonials/t1.png
Normal file
BIN
Testimonials/t1.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 35 KiB |
BIN
images/ImportHtmlSecretaryOfState.gif
Normal file
BIN
images/ImportHtmlSecretaryOfState.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 385 KiB |
Reference in New Issue
Block a user