ฉันรู้ว่านี่เป็นด้ายเก่า สำหรับคนอย่างผมที่ยังคงมีปัญหานี้โดยใช้ Office 2013 ผ่านทาง PowerShell คอมวัตถุสามารถใช้วิธี OpenText ปัญหาคือว่าวิธีนี้มีข้อโต้แย้งมากมายซึ่งบางครั้งก็ไม่สามารถใช้ร่วมกันได้ ในการแก้ไขปัญหานี้คุณสามารถใช้วิธีเรียกชื่อพารามิเตอร์ที่แนะนำในโพสต์นี้ ตัวอย่างจะเป็น
$ex = New-Object -com "Excel.Application"
$ex.visible = $true
$csv = "path\to\your\csv.csv"
Invoke-NamedParameter ($ex.workbooks) "opentext" @{"filename"=$csv; "Semicolon"= $true}
น่าเสียดายที่ฉันเพิ่งค้นพบว่าวิธีการนี้จะแบ่ง csv แยกเมื่อเซลล์มี linebreaks นี่คือการสนับสนุนจาก csv แต่การใช้งานไมโครซอฟท์ดูเหมือนว่าจะเป็นบั๊ก อีกทั้งมันก็ไม่ได้ตรวจจับตัวอักษรเฉพาะของเยอรมัน การให้วัฒนธรรมที่ถูกต้องไม่เปลี่ยนพฤติกรรมนี้ ไฟล์ทั้งหมด (csv และสคริปต์) จะถูกบันทึกด้วยการเข้ารหัส utf8 แรกฉันเขียนรหัสต่อไปนี้เพื่อแทรกเซลล์ csv โดยเซลล์
$ex = New-Object -com "Excel.Application"
$ex.visible = $true;
$csv = "path\to\your\csv.csv";
$ex.workbooks.add();
$ex.activeWorkbook.activeSheet.Cells.NumberFormat = "@";
$data = import-csv $csv -encoding utf8 -delimiter ";";
$row = 1;
$data | %{ $obj = $_; $col = 1; $_.psobject.properties.Name |%{if($row -eq1){$ex.ActiveWorkbook.activeSheet.Cells.item($row,$col).Value2= $_ };$ex.ActiveWorkbook.activeSheet.Cells.item($row+1,$col).Value2 =$obj.$_; $col++ }; $row++;}
แต่นี่ช้ามากซึ่งเป็นสาเหตุที่ฉันมองหาทางเลือก ปรากฏชัด Excel ช่วยให้คุณกำหนดค่าของช่วงของเซลล์ด้วยเมทริกซ์ ดังนั้นฉันจึงใช้อัลกอริทึมในบล็อกนี้เพื่อแปลง csv ในรูปแบบมัลติเรย์
function csvToExcel($csv,$delimiter){
$a = New-Object -com "Excel.Application"
$a.visible = $true
$a.workbooks.add()
$a.activeWorkbook.activeSheet.Cells.NumberFormat = "@"
$data = import-csv -delimiter $delimiter $csv;
$array = ($data |ConvertTo-MultiArray).Value
$starta = [int][char]'a' - 1
if ($array.GetLength(1) -gt 26) {
$col = [char]([int][math]::Floor($array.GetLength(1)/26) + $starta) + [char](($array.GetLength(1)%26) + $Starta)
} else {
$col = [char]($array.GetLength(1) + $starta)
}
$range = $a.activeWorkbook.activeSheet.Range("a1:"+$col+""+$array.GetLength(0))
$range.value2 = $array;
$range.Columns.AutoFit();
$range.Rows.AutoFit();
$range.Cells.HorizontalAlignment = -4131
$range.Cells.VerticalAlignment = -4160
}
function ConvertTo-MultiArray {
param(
[Parameter(Mandatory=$true, Position=1, ValueFromPipeline=$true)]
[PSObject[]]$InputObject
)
BEGIN {
$objects = @()
[ref]$array = [ref]$null
}
Process {
$objects += $InputObject
}
END {
$properties = $objects[0].psobject.properties |%{$_.name}
$array.Value = New-Object 'object[,]' ($objects.Count+1),$properties.count
# i = row and j = column
$j = 0
$properties |%{
$array.Value[0,$j] = $_.tostring()
$j++
}
$i = 1
$objects |% {
$item = $_
$j = 0
$properties | % {
if ($item.($_) -eq $null) {
$array.value[$i,$j] = ""
}
else {
$array.value[$i,$j] = $item.($_).tostring()
}
$j++
}
$i++
}
$array
}
}
csvToExcel "storage_stats.csv" ";"
คุณสามารถใช้รหัสข้างต้นตามที่ควรแปลง csvs ใด ๆ ให้เป็น excel เพียงแค่เปลี่ยนเส้นทางเป็น csv และตัวคั่นที่ด้านล่าง