Data van bepaalde kolommen uit Excel naar CSV met Powershell

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Andre Sonderman
  • Registratie: Januari 2003
  • Laatst online: 28-04 08:42
Mijn vraag
...Ik ben op zoek naar een manier om met een powershell scriptje de inhoud van bijvoorbeeld kolom 1, kolom 4 en kolom 6, naar een csv bestand te schrijven. Die csv wordt dan weer gebruikt als input voor een ander powershell script.

Relevante software en hardware die ik gebruik
...Windows, excel en powershell

Wat ik al gevonden of geprobeerd heb
...Ik ben echt nog een powershell beginner en heb nog niet zoveel kennis om zelf vanaf scratch een script te maken.

Alle reacties


Acties:
  • 0 Henk 'm!

  • P-Storm
  • Registratie: September 2006
  • Laatst online: 11:14
Zelf heb ik ook geen grote ervaring met powershell, maar probeer het probleem in stukken te knippen:
  1. Uitlezen van een cell in excel.
  2. Data transformeren
  3. Wegschrijven in CSV.
Stap 2 is optioneel.

Voor stap 1, als je er direct op googled zie ik meerdere suggesties.

Ook lijkt het van belang welke type Excel bestand dat je in probeerd te lezen, xlsx, xls, of anders?

Kortom, waar loop je precies vast?

Acties:
  • 0 Henk 'm!

  • Andre Sonderman
  • Registratie: Januari 2003
  • Laatst online: 28-04 08:42
Ik loop vast bij het begin.

Het is ook lastig om in een paar goede steekwoorden een zoekopdracht te maken. Ik krijg heel veel "rommel" in de resultaten. Dat is natuurlijk geen rommel, maar het is niet datgene dat ik zoek.

Ik ga even kijken bij de Google suggesties die je gegeven hebt. Bedankt alvast.

Acties:
  • 0 Henk 'm!

  • Killah_Priest
  • Registratie: Augustus 2001
  • Laatst online: 23:22
Op welk punt loop je vast? Welke code heb je tot nu toe zelf kunnen schrijven hiervoor?
Powershell icm Excel is helaas niet triviaal om mee te werken: je kunt bv de Excel Interop gebruiken (traag + je moet alle COM objecten eerst netjes opschonen als je klaar bent omdat anders Excel open blijft staan) OF je kunt een externe .NET library hiervoor gebruiken.

Simpel is dit echter niet voor een beginner met Powershell.

Heel simpel voorbeeld mbt het uitlezen van de data (let op: hier heb ik geen code ingevoegd om netjes de objecten weer op te schonen, Excel zal met deze code een instance open laten staan)

PowerShell:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$WorkbookPath = "C:\test\test.xlsx"
# maak een COM object voor Excel aan
$xls = New-Object -ComObject Excel.Application

# open het workbook
$WB = $xls.Workbooks.Open($WorkbookPath)

# Lees een cell waarde uit van een enkele cell => 1,1 = A1
$cellValue = $xls.Cells.Item(1,1)

# of lees een gehele column uit => 1 = A, 2 = B etc
$Column = $xls.Columns.Item(1)

# of op basis van een row => wederom 1 = row 1, 2 = row 2 etc
$Row = $xls.Rows.Item(1)


Het opschonen is vrij ingewikkeld als je niet bekend met het concept van Marshalling. Simpelweg de "quit" method aanroepen is niet voldoende om Excel netjes af te laten sluiten (excel blijft dan open staan in de achtergrond).
Met het volgende stukje code kun je dit "netjes" doen:
PowerShell:
1
2
3
4
5
6
7
8
# stop Excel
$xls.Quit()

# blijf loopen totdat de boel is opgeschoond
while ([System.Runtime.InteropServices.Marshal]::ReleaseComObject($xls) -ge 0)
{
    [System.Runtime.InteropServices.Marshal]::ReleaseComObject($xls)
}

Acties:
  • 0 Henk 'm!

  • Killah_Priest
  • Registratie: Augustus 2001
  • Laatst online: 23:22
Op welk punt loop je vast? Welke code heb je tot nu toe zelf kunnen schrijven hiervoor?
Powershell icm Excel is helaas niet triviaal om mee te werken: je kunt bv de Excel Interop gebruiken (traag + je moet alle COM objecten eerst netjes opschonen als je klaar bent omdat anders Excel open blijft staan) OF je kunt een externe .NET library hiervoor gebruiken.

Simpel is dit echter niet voor een beginner met Powershell.

Heel simpel voorbeeld mbt het uitlezen van de data (let op: hier heb ik geen code ingevoegd om netjes de objecten weer op te schonen, Excel zal met deze code een instance open laten staan)

PowerShell:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$WorkbookPath = "C:\test\test.xlsx"
# maak een COM object voor Excel aan
$xls = New-Object -ComObject Excel.Application

# open het workbook
$WB = $xls.Workbooks.Open($WorkbookPath)

# Lees een cell waarde uit van een enkele cell => 1,1 = A1
$cellValue = $xls.Cells.Item(1,1)

# of lees een gehele column uit => 1 = A, 2 = B etc
$Column = $xls.Columns.Item(1)

# of op basis van een row => wederom 1 = row 1, 2 = row 2 etc
$Row = $xls.Rows.Item(1)


Het opschonen is vrij ingewikkeld als je niet bekend met het concept van Marshalling. Simpelweg de "quit" method aanroepen is niet voldoende om Excel netjes af te laten sluiten (excel blijft dan open staan in de achtergrond).
Met het volgende stukje code kun je dit "netjes" doen:
PowerShell:
1
2
3
4
5
6
7
8
# stop Excel
$xls.Quit()

# blijf loopen totdat de boel is opgeschoond
while ([System.Runtime.InteropServices.Marshal]::ReleaseComObject($xls) -ge 0)
{
    [System.Runtime.InteropServices.Marshal]::ReleaseComObject($xls)
}



edit: hmm, preview gebruiken ivm formatten code resulteerde in een dubbele post