2015-01-22 1 views
0

XLSX 형식의 28KB 크기의 작은 Excel 파일이 있는데 PowerShell로 수정하고 싶습니다. 이 파일에는 59 개의 행과 366 개의 열이 있습니다.Powershell을 사용하여 Excel 파일을 읽는 것이 왜 그렇게 느립니다?

내 코드는 첫 번째 열을 탐색하고 특정 항목을 검색 한 다음 찾은 열을 탐색하고 발견 된 행과 주먹의 내용을 출력합니다. 이것은 코드입니다 :

# Define some parameters. 
$year = "2015" 
$filename = "C:\...\file.xlsx" 
$person = "Lastname, Firstname" 

# Open Excel file and select worksheet. 
$excel = New-Object -ComObject Excel.Application 
$excel.Visible = $false 
$workbook = $excel.Workbooks.Open($filename) 
$worksheet = $workbook.sheets.item($year) 
$cells = $worksheet.cells 

# Search person name in first column. 
$rows = $worksheet.UsedRange.Rows.count 
"Rows: $rows" 
$row = 1 

while ($row -le $rows) 
{ 
    $cell = $cells.item($row,1).value2 
    if ($person -eq $cell) { 
    break 
    } 
    $row++ 
} 

# List row 
$cols = $worksheet.UsedRange.Columns.count 
"Cols: $cols" 
foreach ($col in 2..$cols) 
{ 
    $date = $cells.item(1,$col).value2 
    $data = $cells.item($row,$col).value2 
    $date = [DateTime]::FromOADate($date) 
    $msg = $date.ToString("yyyy-MM-dd") + " " + $data 
    "$msg" 
} 

# Close workbook and Excel file and release COM object. 
$workbook.close() 
$excel.quit() 
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) 

내 문제 : 프로그램이 끔찍합니다. 366 열을 반복하는 데 5 분 이상 걸립니다!

 
PS C:\...> Measure-Command { .\program.ps1 } 

Days    : 0 
Hours    : 0 
Minutes   : 5 
Seconds   : 33 
Milliseconds  : 580 
Ticks    : 3335806616 
TotalDays   : 0,00386088728703704 
TotalHours  : 0,0926612948888889 
TotalMinutes  : 5,55967769333333 
TotalSeconds  : 333,5806616 
TotalMilliseconds : 333580,6616 

나는 이것이 거의 믿을 수 없다. 대신 내 프로그램에는 뭔가 잘못된 것이 있다고 생각합니다. 그러나 나는 그것이 무엇인지 전혀 모른다.

더 빨리 바꾸려면 어떻게해야합니까?

+0

Excel에서이 작업을 수행해야합니까? 데이터를 조작하기 위해 프로그래밍 방식으로 데이터를 CSV로 변환 할 수 있습니다. 이것은 왜 느린지에 대한 대답이 아닙니다. – Matt

+0

@Matt Excel 파일은 많은 장식과 많은 기능을 가지고 있으며,이 정보를 보존하는 데 많은 도움이 될 것 같습니다. 이것이 펄 파일을 처음부터 새로 만들어야하는 펄 솔루션을 폐지 한 이유이다. 엑셀 파일을 읽는 펄 모듈과 엑셀 파일을 작성하는 펄 모듈이 존재하지만 Excel 파일을 업데이트하는 펄 모듈이 없기 때문이다. – ceving

+0

나는 Excel 파일을 잃어버린 것이 아닙니다. csv 복사본으로 작업하십시오. 우리는 프로그래밍 방식으로 그렇게 할 수 있습니다. 탁월한 변화는 없습니다. 변경 사항을 쿼리 데이터로 저장하는 것으로 표시되지 않습니다. – Matt

답변

0

루프를 사용하여 Excel에서 셀 값을 바꾸면 찾기가 영원히 걸릴 것입니다 ... 대체 할 셀이 111 개이며 완료하는 데 약 40 초가 걸립니다. 그러나 Replace 명령을 상당히 빠르게 사용할 수 있습니다. 그러나 상대 셀에서 값을 제공하려면 Excel 응용 프로그램 참조 스타일을 xlR1c1로 변경해야합니다. 다음은 모든 셀을 "등록 된 호스트 이름 없음"문자열로 대체하는 방법에 대한 내용입니다. 왼쪽에있는 셀의 값은 내 데이터의 IP 주소입니다. 는 난 단지 필요한 모든 변경 이전에 비교 완료 분할 초 소요 대체 사용하여 당신이 당신이 고려할 수 있습니다 업데이 트를 할 의도 때문에 내가 이전 을 사용 while 루프 ...

$Range=$WorkSheet.Range("B1").EntireColumn 
# Replace Cells with No registered hostname 
$SearchString="No registered hostname" 
# Using Excel reference style xlR1C1 to set the formula for replace 
$xls.Application.ReferenceStyle=2 
$Range.Replace($SearchString, "=RC[-1]") 
# while ($NoDNS=$Range.find($SearchString)) 
# { 
# $NoDNS.Activate() 
# $RefRow=$NoDNS.Row 
# $NoDNS.value()=$WorkSheet.Cells.Item($RefRow, 1).Text 
# } 
$xls.Application.ReferenceStyle=1 

을 댓글을 달았 while 루프.

관련 문제