来自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列中有用户名和电子邮件地址,我只想将数据写入新列。乙
谢谢!
答案 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列中。