首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用数据透视表将CSV转换为Excel

使用数据透视表将CSV转换为Excel
EN

Stack Overflow用户
提问于 2019-11-27 11:36:21
回答 1查看 257关注 0票数 0

因此,我正在尝试编写一个简单的代码来将csv转换为excel,插入一个数据透视表,然后保存它。下面的代码运行良好,但是excel文件被保存为$name而不是$name的内容...另外,我可以在powershell脚本中使用VBA代码吗?我想插入一个数据透视表,但我只能找到它的vba代码...

代码语言:javascript
复制
    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)

因此,在修复代码之后,这里是最终产品...

代码语言:javascript
复制
    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吗?

代码语言:javascript
复制
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..。我迷失了,因为到现在为止,代码本身就是几个小时的修补……

EN

回答 1

Stack Overflow用户

发布于 2019-11-27 11:54:27

这是因为这正是您告诉它要做的。

代码语言:javascript
复制
$excel.Workbooks.item(1).SaveAs('C:\Users\User\Desktop\$name.xlsx',51)

引号很重要。单引号表示按原样传递字符串。

如帮助文件中所定义的。

变量必须展开,并且在字符串中必须使用双引号。

代码语言:javascript
复制
$excel.Workbooks.item(1).SaveAs("C:\Users\User\Desktop\$name.xlsx",51)

这里也有几篇很好的文章供你在这个主题上有所启发:

注意事项:如果您所做的只是将文本输出到屏幕上,则不需要Write-Host。在Powe3rShell中输出到屏幕是默认的。此外,根据您使用的PowerShell版本,写主机会清空缓冲区,之后的任何内容都不能在其他地方使用。PowerShell的后续版本不会出现此问题,但最好还是避免写主机,除非您要将彩色文本发送到屏幕,或者其他自定义格式设置方案。

其他阅读:

  • Write-Host Considered Harmful

..。自2016年5月起,杰弗里·斯诺弗改变了他的立场。

带有PowerShell v5写主机的

不再“杀死小狗”。数据被捕获到信息流中...

https://twitter.com/jsnover/status/727902887183966208 ...

https://docs.microsoft.com/en-us/powershell/module/Microsoft.PowerShell.Utility/Write-Information?view=powershell-5.1

最后,你没有完全清理自己的背后。虽然您要退出Excel,但您并没有退出Excel进程,从而释放了这些资源和COM内容。因此,停止该进程和垃圾收集是有必要的。

例如:

代码语言:javascript
复制
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
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59062618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档