Vinnaren i pepparkakshustävlingen!
2015-07-16, 10:05
  #1
Moderator
Humbugs avatar
Jag har ett litet prekärt problem. Jag har importerat en .csv-fil och ska nu spara ned den till .xlsx.
Jag har helt sonika kopierat följande script hämtat från:
http://www.lucd.info/2010/05/29/beyo...sv-export-xls/

Eftersom systemet jag kör på använder powershell 2 blir det tydligen lite problem med ordningen av fälten i excel-arket. De hamnar lite hur som helst.
För att fixa till ordningen av fälten kan man byta ut en del av scriptet till följande, en lösning hämtad från: http://www.widecodes.com/0QzeWjUUUg/...nto-excel.html

Kod:
function Add-Array2Clipboard {
        
param (
            [
PSObject[]]$ConvertObject,
            [switch]
$Header
        
)
        
process{
            
$array = @();
            
$line =""
            
if ($Header) {

                
$line = @()
                
$row $ConvertObject Select -First 1
                $row
.psobject.properties | Foreach {$line += "$($_.Name)" }
                
$array += [String]::Join("`t"$line)


            }
            else {
                foreach(
$row in $ConvertObject){
                    
$line =""
                    
$vals = @()
                    
$row.psobject.properties | Foreach {$vals +=  $_.Value}                      
                    
$array += [String]::Join("`t"$vals)

                }

            }
            
$array clip.exe
        }

    } 

Det löser ordningen, men introducerar ett nytt problem: åäö försvinner från xlsx-filen.
Om någon har en lösning på detta blir jag enormt lycklig och dig evigt tacksam


Originalscript nedan:

Kod:
function Export-Xls{
 
  
param(
  [
parameter(ValueFromPipeline $true,Position=1)]
  [
ValidateNotNullOrEmpty()]
  
$InputObject,
  [
parameter(Position=2)]
  [
ValidateNotNullOrEmpty()]
  [
string]$Path,
  [
string]$WorksheetName = ("Sheet " + (Get-Date).Ticks),
  [
string]$SheetPosition "begin",
  [
PSObject]$ChartType,
  [switch]
$NoTypeInformation $true,
  [switch]
$AppendWorksheet $true
  
)
 
  
begin{
    [
System.Reflection.Assembly]::LoadWithPartialName("Microsoft.Office.Interop.Excel")
    if(
$ChartType){
      [
microsoft.Office.Interop.Excel.XlChartType]$ChartType $ChartType
    
}
 
    function 
Set-ClipBoard{
      
param(
        [
string]$text
      
)
      
process{
        
Add-Type -AssemblyName System.Windows.Forms
        $tb 
= New-Object System.Windows.Forms.TextBox
        $tb
.Multiline $true
        $tb
.Text $text
        $tb
.SelectAll()
        
$tb.Copy()
      }
    }
 
   function 
Add-Array2Clipboard {
      
param (
        [
PSObject[]]$ConvertObject,
        [switch]
$Header
      
)
      
process{
        
$array = @()
 
        if (
$Header) {
          
$line =""
          
$ConvertObject Get-Member -MemberType Property,NoteProperty,CodeProperty Select -Property Name |  %{
            
$line += ($_.Name.tostring() + "`t")
          }
          
$array += ($line.TrimEnd("`t") + "`r")
        }
        else {
          foreach(
$row in $ConvertObject){
            
$line =""
            
$row Get-Member -MemberType Property,NoteProperty |  %{
              
$Name $_.Name
              
if(!$Row.$Name){$Row.$Name ""}
              
$line += ([string]$Row.$Name "`t")
            }
            
$array += ($line.TrimEnd("`t") + "`r")
          }
        }
        
Set-ClipBoard $array
      
}
    }
 
    
$excelApp = New-Object -ComObject "Excel.Application"
    
$originalAlerts $excelApp.DisplayAlerts
    $excelApp
.DisplayAlerts $false
    
if(Test-Path -Path $Path -PathType "Leaf"){
      
$workBook $excelApp.Workbooks.Open($Path)
    }
    else{
      
$workBook $excelApp.Workbooks.Add()
    }
    
$sheet $excelApp.Worksheets.Add($workBook.Worksheets.Item(1))
    if(!
$AppendWorksheet){
      
$workBook.Sheets where {$_ -ne $sheet} | %{$_.Delete()}
    }
    
$sheet.Name $WorksheetName
    
if($SheetPosition -eq "end"){
      
$nrSheets $workBook.Sheets.Count
      2.
.($nrSheets) |%{
        
$workbook.Sheets.Item($_).Move($workbook.Sheets.Item($_ 1))
      }
    }
    
$sheet.Activate()
    
$array = @()
  }
 
  
process{
    
$array += $InputObject
  
}
 
  
end{
    
Add-Array2Clipboard $array -Header:$False
    $selection 
$sheet.Range("A1")
    
$selection.Select() | Out-Null
    $sheet
.Paste()
    
$Sheet.UsedRange.HorizontalAlignment = [microsoft.Office.Interop.Excel.XlHAlign]::xlHAlignCenter
    Add
-Array2Clipboard $array
    $selection 
$sheet.Range("A2")
    
$selection.Select() | Out-Null
    $sheet
.Paste() | Out-Null
    $selection 
$sheet.Range("A1")
    
$selection.Select() | Out-Null
 
    $sheet
.UsedRange.EntireColumn.AutoFit() | Out-Null
    $workbook
.Sheets.Item(1).Select()
    if(
$ChartType){
      
$sheet.Shapes.AddChart($ChartType) | Out-Null
    
}
    
$workbook.SaveAs($Path)
    
$excelApp.DisplayAlerts $originalAlerts
    $excelApp
.Quit()
    
Stop-Process -Name "Excel"
  
}

Citera
2015-07-16, 11:53
  #2
Moderator
vhes avatar
Nu vet jag, helt ärligt, inte ett skvatt om PowerShell, men i god Flashbackanda tänker jag inte låta det stoppa mig från att kommentera!

Lite googlande pratar om en variabel som heter $OutputEncoding som säger vad powershells "cmdlets" skall använda för encoding när de spottar ur sig text. Detta är tydligen ASCII per default. Du kan vilja ta reda på vad du har för encoding i din csv-fil (troligen cp1252, då du är på Windows), och sätta till samma.

Sedan så ser jag iofs också det är flera källor som verkar spekulera i att clip.exe manglar teckenkodningar, det kan du ju vilja ta en titt på.
Citera
2015-07-16, 14:40
  #3
Moderator
Humbugs avatar
Citat:
Ursprungligen postat av vhe
Nu vet jag, helt ärligt, inte ett skvatt om PowerShell, men i god Flashbackanda tänker jag inte låta det stoppa mig från att kommentera!

Lite googlande pratar om en variabel som heter $OutputEncoding som säger vad powershells "cmdlets" skall använda för encoding när de spottar ur sig text. Detta är tydligen ASCII per default. Du kan vilja ta reda på vad du har för encoding i din csv-fil (troligen cp1252, då du är på Windows), och sätta till samma.

Sedan så ser jag iofs också det är flera källor som verkar spekulera i att clip.exe manglar teckenkodningar, det kan du ju vilja ta en titt på.

$OutputEncoding löste det hela alldeles utmärkt. När jag tidigare testat att spara filen csv-filen i UTF8 fungerade det inte, men med denna var mina problem all.

Ett stort tack till dig!
Citera
2016-02-08, 21:48
  #4
Medlem
Fleptuts avatar
Citat:
Ursprungligen postat av vhe
Nu vet jag, helt ärligt, inte ett skvatt om PowerShell, men i god Flashbackanda tänker jag inte låta det stoppa mig från att kommentera!

Detta är anledningen till att man kan fråga saker på Flashback, en ärlig inledning och sen levereras en trolig lösning. Den visar sig dessutom vara fungerande

Flep
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback