【问题标题】:Performance Issue: convert csv to excel using Powershell性能问题:使用 Powershell 将 csv 转换为 excel
【发布时间】:2016-03-16 08:42:04
【问题描述】:

我正在使用以下 power shell 代码将 csv 转换为 excel。但是性能似乎很差,对于一个 200mb 的 csv 文件,我已经等了 20 分钟。任何人都知道如何提高性能。还是我必须务实地做,(使用java using apache poi library)?

   function convertToExcel { 
   param($fileName, $outputDir) # the two parameters. 
   #generate OutputFileName
   $outputFilename = -join($fileName.BaseName, ".xlsx"); 

   #prepare excel sheet
    $excel = New-Object -ComObject Excel.Application
    #$excel.visible = $true
    $workbook = $excel.workbooks.add()
    $sheets = $workbook.sheets
    $sheetCount = $Sheets.count
    $mySheet = 1
    $mySheetName = "Sheet" + $mySheet
    $s1 = $sheets | where{$_.name -eq $mySheetName}
    $s1.Activate()

    #Delete all other Sheets
    If ($sheetCount -gt 1) {
        $Sheets | ForEach {
            $tmpSheetName = $_.Name
            $tmpSheet = $_
            If ($tmpSheetName -ne "Sheet1") {
                $tmpSheet.Delete()
            }
        }
    }

   #copy paste data from csv
   #$s1.Name = $fileName.BaseName
   $s1.Name = "sheet1"
   $s1.Activate()
   $s1Data = Import-Csv $file.FullName -Delimiter '^'
   $s1Data | ConvertTo-Csv -Delimiter "`t" -NoTypeInformation | Clip
   $s1.cells.item(1,1).Select()
   $s1.Paste()

   $workbook.SaveAs("$outputDir\$outputFilename")
   $excel.Quit()
   } 

   #Read Input from Arguments
   if ($args.length -ne 3){
   }else{
   $fileName = $Args[0]   #read fileName
   $inputFolder = $Args[1] #read inputFolder
   $outputFolder = $Args[2] #read outputFolder

   $files = dir -Path $inputFolder $fileName

   ForEach ($file in $files) {
   convertToExcel $file $outputFolder
  }
 }

【问题讨论】:

  • 您需要经常转换此类CSV文件吗?花时间用 Java 重写脚本是否值得,或者你可以在它运行的时候离开去吃午饭吗?
  • 是的,我需要它经常运行。它用于每周报告。报告最多可达数百 MB。
  • 有没有考虑直接用excel打开CSV文件?
  • 每周一次20分钟以上有关系吗?我不认为那么频繁(当我问它是否经常运行时,我的意思是每天多次)
  • 在你的$excel.Quit()之后,别忘了[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)Remove-Variable excel,否则Excel不会退出,你会泄露引用。

标签: java excel powershell


【解决方案1】:

您是否尝试过仅在 Excel 中打开 CSV 文件?这可能是最快的方法。

$app = New-Object -ComObject Excel.Application
$app.Visible = $true
$app.DisplayAlerts = $False
$app.Workbooks.Open("yourcsvfile.csv")

另一种方法是逐行读取文件并添加整行,但速度会慢一些。

但是,转换为 PS 对象并逐个单元格写入总是最慢的。

编辑:这是一个完整的功能...

function ConvertToExcel { 
    param($fileName)    
    $outputFilename = -join($fileName.split('.')[0], ".xls")
    $excel = New-Object -ComObject Excel.Application
    #$excel.Visible = $true
    $excel.DisplayAlerts = $False
    $wb = $excel.Workbooks.Open($fileName)
    $wb.SaveAs("$outputFilename", [Microsoft.Office.Interop.Excel.XlFileFormat]::xlExcel8)
    Start-Sleep -Milliseconds 200
    $excel.Quit()
    [System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)
    Remove-Variable excel
}

ConvertToExcel "D:\tst\serverlist.csv"

【讨论】:

  • 是的,我知道excel可以直接打开csv..问题是我需要将它自动转换为excel。没有我点击打开excel并另存为。
  • 别跟着,上面的代码会打开csv,你已经有代码可以把它保存为xls。不涉及任何按钮。
  • 我已经为答案添加了完整的功能。
猜你喜欢
  • 2021-02-17
  • 2017-05-06
  • 1970-01-01
  • 1970-01-01
  • 2015-08-23
  • 2020-10-08
  • 2017-09-18
  • 2017-09-21
相关资源
最近更新 更多