因此,我正在尝试编写一个简单的代码来将csv转换为excel,插入一个数据透视表,然后保存它。下面的代码运行良好,但是excel文件被保存为$name而不是$name的内容...另外,我可以在powershell脚本中使用VBA代码吗?我想插入一个数据透视表,但我只能找到它的vba代码...
Add-Type -AssemblyName System.Windows.Forms
$FileBrowser = New-Object System.Windows.Forms.OpenFileDialog -Property @{
InitialDirectory = [Environment]::GetFolderPath('Desktop')
Filter = 'SpreadSheet (*.csv)|*.csv'
}
$FileBrowser.ShowDialog()
$file = $FileBrowser.FileName
$name= $FileBrowser.SafeFileName
Write-Host $name
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $true
$excel.DisplayAlerts = $false
$excel.Workbooks.Open($file)
$excel.Workbooks.item(1).SaveAs('C:\Users\User\Desktop\$name.xlsx',51)
$excel.Quit()
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($excel)因此,在修复代码之后,这里是最终产品...
Add-Type -AssemblyName System.Windows.Forms
$FileBrowser = New-Object System.Windows.Forms.OpenFileDialog -Property @{
InitialDirectory = [Environment]::GetFolderPath('Desktop')
Filter = 'SpreadSheet (*.csv)|*.csv'
}
$FileBrowser.ShowDialog()
$file = $FileBrowser.FileName
$name = $FileBrowser.SafeFileName -replace ".{4}$"
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $true
$excel.DisplayAlerts = $false
$excel.Workbooks.Open($file)
#$excel.Workbooks.Item(1).activate()
#$excel.ActiveSheet.Cells.Select()
$excel.Workbooks.item(1).SaveAs("C:\Users\User\Desktop\$name.xlsx",51)
$excel.Quit()
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($excel)现在,我想向其中添加一个透视表。我添加了激活工作簿并选择所有单元格的行...现在我有了VBA代码,但是有人能帮我把它翻译成powershell吗?
Sheets.Add
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
"2!R1C1:R1048576C27", Version:=6).CreatePivotTable TableDestination:= _
"Sheet1!R3C1", TableName:="PivotTable3", DefaultVersion:=6
Sheets("Sheet1").Select
Cells(3, 1).Select
With ActiveSheet.PivotTables("PivotTable3").PivotFields("Domain")
.Orientation = xlRowField
.Position = 1上面的VBA是我录制的一个宏,它为我们提供了步骤...现在我们只需要把它转换成power shell..。我迷失了,因为到现在为止,代码本身就是几个小时的修补……
发布于 2019-11-27 11:54:27
这是因为这正是您告诉它要做的。
$excel.Workbooks.item(1).SaveAs('C:\Users\User\Desktop\$name.xlsx',51)引号很重要。单引号表示按原样传递字符串。
如帮助文件中所定义的。
变量必须展开,并且在字符串中必须使用双引号。
$excel.Workbooks.item(1).SaveAs("C:\Users\User\Desktop\$name.xlsx",51)这里也有几篇很好的文章供你在这个主题上有所启发:
注意事项:如果您所做的只是将文本输出到屏幕上,则不需要Write-Host。在Powe3rShell中输出到屏幕是默认的。此外,根据您使用的PowerShell版本,写主机会清空缓冲区,之后的任何内容都不能在其他地方使用。PowerShell的后续版本不会出现此问题,但最好还是避免写主机,除非您要将彩色文本发送到屏幕,或者其他自定义格式设置方案。
其他阅读:
..。自2016年5月起,杰弗里·斯诺弗改变了他的立场。
带有PowerShell v5写主机的
不再“杀死小狗”。数据被捕获到信息流中...
https://twitter.com/jsnover/status/727902887183966208 ...
最后,你没有完全清理自己的背后。虽然您要退出Excel,但您并没有退出Excel进程,从而释放了这些资源和COM内容。因此,停止该进程和垃圾收集是有必要的。
例如:
Get-Process -Name 'EXCEL' | Stop-Process
Function Clear-ResourceEnvironment
{
# Clear any PowerShell sessions created
Get-PSSession | Remove-PSSession
# Release any COM object created
$null = [System.Runtime.InteropServices.Marshal]::ReleaseComObject([System.__ComObject]$Shell)
# Perform garbage collection on session resources
[System.GC]::Collect()
[GC]::Collect()
[GC]::WaitForPendingFinalizers()
<#
Remove any custom variables created
some list of your variable, or a wildcard when prefix was used.
#>
Get-Variable -Name MyShell -ErrorAction SilentlyContinue | Remove-Variable
}https://stackoverflow.com/questions/59062618
复制相似问题