Powershell 2.0回写xlsx

时间:2014-06-25 15:21:19

标签: excel powershell

来自powershell.org的交叉帖子..

我试图让Powershell读取xlsx用于用户名信息,转换为csv(要导入)然后将内容写回xlsx,以便下次它不会重新导入相同的用户。 我不想删除xlsx中的用户,但我想添加一个日期列或其他一些数据可能是单词" created"并让powershell在可用列中写入此数据。但是,如果包含旧日期或创建的单词,我必须让我的脚本忽略这个新列吗?

<br> Current xlsx columns headers
<br>      A            B              C 
<br> 1 Full Name, Personal Email,  "write back data"
<br> 2 John Doe   Jdoe@gmail.com,  Created (Sample write back data)
<br> 3 Don Juan   Djuan@gmail.com, Date Imported (sample write back data)

转换为csv代码(这部分工作正常。)

$File = "C:\Scripts\Excel\Accounts.xlsx"
$Savepath1 = "C:\Scripts\Csv\Employee Accounts.csv"
$SheetName1 = "Employee Accounts"
$ObjExcel = New-Object -ComObject Excel.Application
$Objexcel.Visible = $false
$Objworkbook=$ObjExcel.Workbooks.Open($File)
$Objworksheet=$Objworkbook.worksheets.item($Sheetname1) 
$Objworksheet.Activate() 
$Objexcel.application.DisplayAlerts= $False
$Objworkbook.SaveAs($SavePath1,6)
$Objworkbook.Close($True)
$ObjExcel.Quit()

这是我当前的import-csv代码

$EmployeeAccounts = Import-Csv $savepath1 | Where-Object { $_.Fullname -and $_.PersonalEmail}

需要考虑的事项: 在添加到xlsx的其他字段中可能还有其他连接信息。因此,如果字段中包含公式,则excel可能会将这些计为已使用的行。因此,如果A和A列中有用户名和电子邮件地址,我只想将数据写入新列。乙

谢谢!

1 个答案:

答案 0 :(得分:0)

说实话,导入整个内容更简单,对“更新”字段中没有任何内容的条目执行过程过滤,更新您处理的每个条目的“更新”字段,然后只是把整个东西写回文件。所以,像:

$Users = Import-CSV $FilePath
$Users | ?{[String]::IsNullOrEmpty($_.Updated)} | %{
    Do stuff here
    $_.Updated = Get-Date    
}
$Users | Export-CSV $FilePath -Force -NoTypeInfo

编辑:那么,这确实会让事情变得复杂一些。所以,这个插件确实需要一个插件,但它是一个插件,我全心全意地认为应该包含在几乎所有功能上经常使用的装置中。 PowerShell社区扩展(PSCX)可以从pscx.codeplex.com获得,并允许您访问命令Out-Clipboard,这对于您想要执行的操作非常棒。

$Users = Import-CSV $FilePath
$Users | ?{[String]::IsNullOrEmpty($_.Updated)} | %{
    Do stuff here
    $_.Updated = Get-Date    
}
$Users | Select Updated | ConvertTo-CSV -Delimiter "`t" -NoTypeInformation | Out-Clipboard
$SheetName1 = "Employee Accounts"
$ObjExcel = New-Object -ComObject Excel.Application
$Objexcel.Visible = $false
$Objworkbook=$ObjExcel.Workbooks.Open($File)
$Objworksheet=$Objworkbook.worksheets.item($Sheetname1) 
$Objworksheet.Activate()
$Range = $Objworksheet.Range("C1","C1")
$Objworksheet.Paste($Range, $false)
$Objexcel.DisplayAlerts = $false
$Objworkbook.Save()
$Objexcel.DisplayAlerts = $true
$Objworkbook.Close()
$Objexcel.Quit()
[void][System.Runtime.Interopservices.Marshal]::FinalReleaseComObject($Objexcel)

这会将您的数据(包括标题)粘贴到C列中。