以下脚本读取Excel文档的工作表名称....
我怎样才能改进它,以便它可以在每个工作表中提取B列的所有内容(从第5行开始 - 因此忽略第1-4行)并创建一个对象?
E.g。如果工作表1中的列B(称为伦敦)具有以下值:
Marleybone
Paddington
Victoria
Hammersmith
工作表2中的和C列(称为)Nottingham具有以下值:
Alverton
Annesley
Arnold
Askham
我想要创建一个看起来像这样的对象:
City,Area
London,Marleybone
London,Paddington
London,Victoria
London,Hammersmith
Nottingham,Alverton
Nottingham,Annesley
Nottingham,Arnold
Nottingham,Askham
到目前为止,这是我的代码:
clear all
sheetname = @()
$excel=new-object -com excel.application
$wb=$excel.workbooks.open("c:\users\administrator\my_test.xls")
for ($i=1; $i -le $wb.sheets.count; $i++)
{
$sheetname+=$wb.Sheets.Item($i).Name;
}
$sheetname
答案 0 :(得分:16)
这假设内容在每张纸上的B列中(因为不清楚如何确定每张纸上的列。)而该列的最后一行也是纸张的最后一行。
$xlCellTypeLastCell = 11
$startRow = 5
$col = 2
$excel = New-Object -Com Excel.Application
$wb = $excel.Workbooks.Open("C:\Users\Administrator\my_test.xls")
for ($i = 1; $i -le $wb.Sheets.Count; $i++)
{
$sh = $wb.Sheets.Item($i)
$endRow = $sh.UsedRange.SpecialCells($xlCellTypeLastCell).Row
$city = $sh.Cells.Item($startRow, $col).Value2
$rangeAddress = $sh.Cells.Item($startRow + 1, $col).Address() + ":" + $sh.Cells.Item($endRow, $col).Address()
$sh.Range($rangeAddress).Value2 | foreach
{
New-Object PSObject -Property @{ City = $city; Area = $_ }
}
}
$excel.Workbooks.Close()
答案 1 :(得分:2)
抱歉,我知道这是一个旧的,但仍然感觉像帮忙^ _ ^
也许这就是我读这篇文章的方式,但假设excel表1被称为“伦敦”并且有这个信息; B5 =“Marleybone”B6 =“Paddington”B7 =“Victoria”B8 =“Hammersmith”。并且excel表2被称为“诺丁汉”并且具有该信息; C5 =“Alverton”C6 =“Annesley”C7 =“Arnold”C8 =“Askham”。然后我认为下面的代码可行。 ^ _ ^
$xlCellTypeLastCell = 11
$startRow = 5
$excel = new-object -com excel.application
$wb = $excel.workbooks.open("C:\users\administrator\my_test.xls")
for ($i = 1; $i -le $wb.sheets.count; $i++)
{
$sh = $wb.Sheets.Item($i)
$endRow = $sh.UsedRange.SpecialCells($xlCellTypeLastCell).Row
$col = $col + $i - 1
$city = $wb.Sheets.Item($i).name
$rangeAddress = $sh.Cells.Item($startRow, $col).Address() + ":" + $sh.Cells.Item($endRow, $col).Address()
$sh.Range($rangeAddress).Value2 | foreach{
New-Object PSObject -Property @{City = $city; Area=$_}
}
}
$excel.Workbooks.Close()
这应该是输出(没有逗号):
城市,区域
---- ----
伦敦,Marleybone
伦敦,帕丁顿
伦敦,维多利亚
伦敦,哈默史密斯
诺丁汉,阿尔弗顿
诺丁汉,Annesley
诺丁汉,阿诺德
诺丁汉,Askham
答案 2 :(得分:1)
当尝试使用Excel电子表格作为源自动进行Cisco SIP电话配置时,这对我非常有用。我唯一的问题是当我尝试制作一个数组并使用$array | Add-Member ...
填充它时,稍后需要使用它来生成配置文件。只需定义一个数组并使其成为for循环就可以正确存储它。
$lastCell = 11
$startRow, $model, $mac, $nOF, $ext = 1, 1, 5, 6, 7
$excel = New-Object -ComObject excel.application
$wb = $excel.workbooks.open("H:\Strike Network\Phones\phones.xlsx")
$sh = $wb.Sheets.Item(1)
$endRow = $sh.UsedRange.SpecialCells($lastCell).Row
$phoneData = for ($i=1; $i -le $endRow; $i++)
{
$pModel = $sh.Cells.Item($startRow,$model).Value2
$pMAC = $sh.Cells.Item($startRow,$mac).Value2
$nameOnPhone = $sh.Cells.Item($startRow,$nOF).Value2
$extension = $sh.Cells.Item($startRow,$ext).Value2
New-Object PSObject -Property @{ Model = $pModel; MAC = $pMAC; NameOnPhone = $nameOnPhone; Extension = $extension }
$startRow++
}
我以前在使用Add-Member向阵列添加信息方面没有任何问题,但是那是在PSv2 / 3中实现的,而且我已经离开了一段时间。尽管简单的解决方案为我省去了手动配置100多个电话和分机的麻烦,但没人愿意这样做。
答案 3 :(得分:0)
有可能使某些东西变得更酷!
# Powershell
$xl = new-object -ComObject excell.application
$doc=$xl.workbooks.open("Filepath")
$doc.Sheets.item(1).rows |
% { ($_.value2 | Select-Object -first 3 | Select-Object -last 2) -join "," }