在之前的工作中,为一家前雇主构建了一个PowerShell应用程序,该程序可以根据Excel电子表格中的规范构建SharePoint网站。问题在于,Excel中的每个工作表都需要导出为CSV格式,这使得维护变得非常困难。因此,进行了研究,并发现了Robert M. Troups, Jr的博客,其中介绍了将Excel导入到PowerShell的方法,以及Michael Sorens(msorens)在论坛上发表的帖子,讨论了如何利用该方法创建一个Import-Excel函数。这太酷了!复制并在虚拟机(VM)上运行了它,但是遇到了问题...需要安装Excel。
没有在虚拟机上安装Excel,希望这个脚本尽可能通用(且成本低)。此外,不能指望它安装在客户服务器上。以下是解决方案...
此解决方案使用了可再分发的Access下载,但这是免费的!
下载并安装:
接下来,在PowerShell脚本顶部包含以下函数,或者将其放入另一个ps1文件,并使用PowerShell包含方法(一个点后面跟着函数文件的路径)来“安装”它,以便在想要导入Excel对象为PSObject之前。
function Import-Excel {
param (
[string]$FileName,
[string]$WorksheetName
)
if ($FileName -eq "") {
throw "请提供Excel文件的路径"
Exit
}
if (-not (Test-Path $FileName)) {
throw "路径 '$FileName' 不存在。"
Exit
}
$strSheetName = $WorksheetName + '$'
$query = 'select * from ['+$strSheetName+']';
$connectionString =
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source='"$FileName'";Extended
Properties='"Excel 12.0 Xml;HDR=YES'";"
$conn = New-Object System.Data.OleDb.OleDbConnection($connectionString)
$conn.open()
$cmd = New-Object System.Data.OleDb.OleDbCommand($query,$conn)
$dataAdapter = New-Object System.Data.OleDb.OleDbDataAdapter($cmd)
$dataTable = New-Object System.Data.DataTable
$dataAdapter.fill($dataTable)
$conn.close()
$myDataRow ="";
$columnArray =@();
foreach($col in $dataTable.Columns)
{
$columnArray += $col.toString();
}
$returnObject = @();
foreach($rows in $dataTable.Rows)
{
$i=0;
$rowObject = @{};
foreach($columns in $rows.ItemArray){
$rowObject += @{$columnArray[$i]=$columns.toString()};
$i++;
}
$returnObject += new-object PSObject -Property $rowObject;
}
return $returnObject;
}
像这样调用Import-Excel函数...
$listOne = Import-Excel "test.xlsx" -WorksheetName:"list Sample One"
$listTwo= Import-Excel "test.xlsx" -WorksheetName:"list Sample Two"