在Powershell中阅读Excel表格

时间:2013-10-06 17:20:13

标签: excel powershell

以下脚本读取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

4 个答案:

答案 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 "," }