【问题标题】:Powershell writing data into excel filePowershell将数据写入excel文件
【发布时间】:2013-07-01 14:25:12
【问题描述】:

希望对我在这里想要实现的目标有所帮助。

我有两个数组 $ActiveUsers 和 $InactiveUsers,每个数组有 4 个字段和以下数据

$ActiveUsers = fahe532|Allyson Sullivan|34563|Cain,Ashley J
               pers274|Martha Walsh|53732|Mckenny,Josh
               fgh8458|Kayla Benson|95463|Trot,Cook K
               ndcf846|Sam Huff|56737|Mcghee,John
               vdfg456|Mark Jones |67843|Hart,Josh W
               fasf345|Amber Sean|24678|John,Kneel G

$InavtiveUsers = fasd034|Colin Hart|35473|David, Casper
                 aertp56|Andy Matthews|56849|Debby, Gould K
                 ahshb86|Mark Michael|46848|Ty, Justin H
                 gkr5057|Josh Meeker|56848|Ashley, Rhonda R
                 irrk106|Tom Mortin|64838|Becks, Alan
                 eqer348|Nathan Willis|469894|Baker ,John T

现在,我正在尝试从 $ActiveUsers 中提取每一行并将其添加到我正在创建的 Excel 文件中。我对 $InactiveUsers 中的每一行都做了同样的事情,并将它们添加到一个新的 Excel 文件中

要求略有变化,而不是将两个数组添加到两个 Excel 文件中,我必须将所有内容放在一个 excel 文件中,另外我需要突出显示(用某种颜色)我从 $ 获得的行InactiveUsers 在我正在编写所有内容的那个 excel 文件中。

有没有一种方法可以同时遍历两个数组并通过突出显示从 $InactiveUsers 获得的行将行写入一个 excel 文件?以下是我目前写的内容

$ExcelObject = new-Object -comobject Excel.Application  
$ExcelObject.visible = $false 
$ExcelObject.DisplayAlerts =$false
$date= get-date -format "yyyyMMddHHss"
$strPath1="o:\UserCert\Active_Users_$date.xlsx" 
if (Test-Path $strPath1) {  
  #Open the document  
$ActiveWorkbook = $ExcelObject.WorkBooks.Open($strPath1)  
$ActiveWorksheet = $ActiveWorkbook.Worksheets.Item(1)  
} else {  
# Create Excel file  
$ActiveWorkbook = $ExcelObject.Workbooks.Add()  
$ActiveWorksheet = $ActiveWorkbook.Worksheets.Item(1)  

#Add Headers to excel file
$ActiveWorksheet.Cells.Item(1,1) = "User_Id"  
$ActiveWorksheet.cells.item(1,2) = "User_Name" 
$ActiveWorksheet.cells.item(1,3) = "CostCenter"
$ActiveWorksheet.cells.item(1,4) = "Approving Manager"
$format = $ActiveWorksheet.UsedRange
$format.Interior.ColorIndex = 19
$format.Font.ColorIndex = 11
$format.Font.Bold = "True"
} 
#Loop through the Array and add data into the excel file created.
foreach ($line in $Activeusers){
     ($user_id,$user_name,$Costcntr,$ApprMgr) = $line.split('|')
      $introw = $ActiveWorksheet.UsedRange.Rows.Count + 1  
      $ActiveWorksheet.cells.item($introw, 1) = $user_id  
      $ActiveWorksheet.cells.item($introw, 2) = $user_name
      $ActiveWorksheet.cells.item($introw, 3) = $Costcntr
      $ActiveWorksheet.cells.item($introw, 4) = $ApprMgr 
      $ActiveWorksheet.UsedRange.EntireColumn.AutoFit();
      }

我为 $InactiveUsers 重复了上述内容。

【问题讨论】:

    标签: powershell foreach comobject


    【解决方案1】:

    如果两个数组的记录数相同,您可以这样做:

    for ($i = 0, $i -lt $activeUsers.Length; $i++) {
      ($user_id,$user_name,$Costcntr,$ApprMgr) = $activeUsers[$i].split('|')
      $row = 2 * $i + 2
      $ActiveWorksheet.Cells.Item($i, 1) = $user_id  
      $ActiveWorksheet.Cells.Item($i, 2) = $user_name
      $ActiveWorksheet.Cells.Item($i, 3) = $Costcntr
      $ActiveWorksheet.Cells.Item($i, 4) = $ApprMgr
      ($user_id,$user_name,$Costcntr,$ApprMgr) = $inactiveUsers[$i].split('|')
      $ActiveWorksheet.Cells.Item($i+1, 1) = $user_id  
      $ActiveWorksheet.Cells.Item($i+1, 2) = $user_name
      $ActiveWorksheet.Cells.Item($i+1, 3) = $Costcntr
      $ActiveWorksheet.Cells.Item($i+1, 4) = $ApprMgr
      $ActiveWorksheet.Rows.Item($i+1).EntireRow.Interior.ColorIndex = 3
    }
    

    如果两个数组的长度不同,你可以这样做:

    if ($activeUsers.Length -gt $inactiveUsers.Length) {
      $larger  = $activeUsers
      $smaller = $inactiveUsers
    } else {
      $larger  = $inactiveUsers
      $smaller = $activeUsers
    }
    for ($i = 0, $i -lt $smaller.Length; $i++) {
      ($user_id,$user_name,$Costcntr,$ApprMgr) = $smaller[$i].split('|')
      ...
      ($user_id,$user_name,$Costcntr,$ApprMgr) = $larger[$i].split('|')
      ...
    }
    for ($i = $smaller.Length, $i -lt $larger.Length; $i++) {
      ($user_id,$user_name,$Costcntr,$ApprMgr) = $larger[$i].split('|')
      ...
    }
    

    然而,更好的解决方案可能是引入一个额外的列,指示帐户的状态:

    $ActiveWorksheet.Cells.Item(1,5) = "Inactive"
    ...
    for ($i = 0, $i -lt $activeUsers.Length; $i++) {
      ($user_id,$user_name,$Costcntr,$ApprMgr) = $activeUsers[$i].split('|')
      $row = 2 * $i + 2
      $ActiveWorksheet.Cells.Item($i, 1) = $user_id  
      $ActiveWorksheet.Cells.Item($i, 2) = $user_name
      $ActiveWorksheet.Cells.Item($i, 3) = $Costcntr
      $ActiveWorksheet.Cells.Item($i, 4) = $ApprMgr
      ($user_id,$user_name,$Costcntr,$ApprMgr) = $inactiveUsers[$i].split('|')
      $ActiveWorksheet.Cells.Item($i+1, 1) = $user_id  
      $ActiveWorksheet.Cells.Item($i+1, 2) = $user_name
      $ActiveWorksheet.Cells.Item($i+1, 3) = $Costcntr
      $ActiveWorksheet.Cells.Item($i+1, 4) = $ApprMgr
      $ActiveWorksheet.Cells.Item($i+1, 5) = "x"
    }
    

    然后您可以使用条件格式突出显示第 5th 列的值为“x”的行(该格式的公式为 =(INDIRECT("E"&ROW()))="x")。

    如果您要引入上述附加列,您甚至可以像这样简化脚本:

    $users =  $activeUsers | % { $_ + "|" }
    $users += $inactiveUsers | % { $_ + "|x" }
    ...
    $ActiveWorksheet.Cells.Item(1,5) = "Inactive"
    ...
    for ($i = 0, $i -lt $users.Length; $i++) {
      ($user_id,$user_name,$Costcntr,$ApprMgr,$inactive) = $users[$i].split('|')
      $ActiveWorksheet.Cells.Item($i+2, 1) = $user_id  
      $ActiveWorksheet.Cells.Item($i+2, 2) = $user_name
      $ActiveWorksheet.Cells.Item($i+2, 3) = $Costcntr
      $ActiveWorksheet.Cells.Item($i+2, 4) = $ApprMgr
      $ActiveWorksheet.Cells.Item($i+2, 5) = $inactive
    }
    

    【讨论】:

    • 不幸的是,数组中的记录数不同。我可以将活动和非活动用户放入一个数组并写入一个 excel 文件,前提是如果 $CostCntr 为 $null 则高亮显示记录,否则按原样写入?
    • 我添加了处理不同数组长度的解决方案。是的,您可以根据特定字段的值对行进行着色,但在您的示例中,$CostCntr 对所有帐户都有一个值(即使没有,该值也将是空字符串 "",而不是 @ 987654328@).
    • :@Angar 没关系,我忘了放一些 excel 语句,这就是我没有创建 excel 文件的原因,请忽略我之前的 cmets
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-08
    • 2011-03-09
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多