16

下面的脚本读取 Excel 文档的工作表名称....

我该如何改进它,以便它可以提取每个工作表中 B 列的所有内容(从第 5 行开始 - 所以第 1-4 行被忽略)并创建一个对象?

例如,如果工作表 1(称为伦敦)中的 B 列具有以下值:

Marleybone
Paddington
Victoria
Hammersmith

工作表 2(称为)诺丁汉中的 C 列具有以下值:

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

5 回答 5

25

这假设内容在每张纸的 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()
于 2013-10-06T22:31:10.167 回答
6

对不起,我知道这是一个旧的,但仍然想帮忙^_^

也许这是我读这个的方式,但假设 excel 表 1 被称为“伦敦”并且有这个信息;B5="马利伯恩" B6="帕丁顿" B7="维多利亚" B8="哈默史密斯"。而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()

这应该是输出(不带逗号):

城市、地区
--------
伦敦、马利伯恩
伦敦、帕丁顿伦敦
、维多利亚
伦敦、汉默史密斯
诺丁汉、阿尔弗顿
诺丁汉、安妮斯利
诺丁汉、阿诺德
诺丁汉、阿斯汉姆

于 2016-12-30T11:02:43.053 回答
3

在尝试使用 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 多部电话和分机,但没人愿意这样做。

于 2018-07-13T15:38:37.543 回答
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 "," }
于 2019-09-03T14:50:16.587 回答
0

您可以使用 使用 OfficeOpenXml 的ImportExcel

于 2021-08-22T09:46:46.860 回答