【发布时间】: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