sea707
01-09-2012, 05:08
Доброго времени суток! Как написать скрипт для преобразования файла в формате excel .xls в формат .csv
Пытался сделать скрипт для преобразования файла в формате excel .xls в формат .csv, находил скрипты где это функция реализована, но чтото до ума так и не довёл (((
Пример скрипта с этой функцией (http://imamyshev.wordpress.com/2012/01/25/sync_active_directory2/)
xlstocsv.ps1
$XLSSource=“c:\tmp\file.xlsx”
$SharePath=“c:\tmp”
#===============================================================================
#=== Конвертирование файла формата .XLSX в файл формата .CSV
#=== без использования ПО MS Office Excel
#=== Вызов функции: convertXLSXtoCSV “C:\file1.xlsx” [sheet1|sheet2|..]
#=== На выходе одноименный файл в формате CSV: C:\file1.csv
#===============================================================================
functionconvertXLSXtoCSV ([string] $xlspath, $sheet=“sheet1″)
{
functionINTto26
{
param ([int]$x)
$m=$x% 26
if($x-gt 0 -and$m-eq 0){$m= 26}
if(($x-$m) -gt 0)
{
$d= ($x-$m)/26
$dummy= 0
intto26$d
}
$m
}
functionSTRINGto26INT ([string]$s)
{
([int[]][char[]]$s.toupper())[-1..-$s.length] | %{$_-64} |
%{$m= 1}{$_*$m;$m*=26} | Measure-Object-Sum |
Select-Object-ExpandPropertysum
}
functionInt26toSTRING ([int]$i)
{
$ofs=“”
[string][char[]]((INTto26$i) | %{$_+64})
}
$mincol= 16384
$maxcol= 1
$minrow= [int]::MaxValue
$maxrow= 1
$shellApplication=new-object-comshell.application
$file=Get-Item$xlspath
$destination=Split-Path$xlspath
if(!(Test-Path“$destination\temp”)){ [void] (New-Item-Path$destination-Nametemp-ItemTypedirectory) }
Rename-Item$xlspath“$xlspath.zip”
$zipPackage=$shellApplication.NameSpace(“$xlspath.zip”)
$destinationFolder=$shellApplication.NameSpace(“$destination\temp”)
$destinationFolder.CopyHere($zipPackage.Items().item(2))
#
$sharedstr= ([xml] (Get-Content“$destination\temp\xl\sharedStrings.xml”-Encodingutf8)).sst.si |
Select-Object-ExpandPropertyt | %{ if($_-is [System.Xml.XmlElement]){$_.“#text”}else{$_} }
#
$sh= [xml](Get-Content“$destination\temp\xl\worksheets\$sheet.xml”-Encodingutf8)
$basedata=$sh.worksheet.sheetData | %{$_.row} | %{$_.c} | %{
$col=$_.r -replace“\d+”,“”
if((STRINGto26INT$col) -gt$maxcol){$maxcol= (STRINGto26INT$col)}
if((STRINGto26INT$col) -lt$mincol){$mincol= (STRINGto26INT$col)}
$row=$_.r -replace“[a-z]+”,“”
if([int]$row-gt [int]$maxrow){$maxrow=$row}
if([int]$row-lt [int]$minrow){$minrow=$row}
$value=if($_.t -eq“s”){$sharedstr[($_.v)]}elseif($_.t -ne“E”){$_.v}
New-Object-TypeNamePSObject-Property @{col =$col; row =$row; value =$value}
}
#
Remove-Item“$destination\temp”-Confirm:$false-Force-Recurse
Rename-Item“$xlspath.zip”$xlspath
#
$h= @{}
$mincol..$maxcol | %{Int26toSTRING$_} | %{$h.$_=“”}
$th= @{}
$minrow..$maxrow | %{$th.$_=New-Object-TypeNamepsobject-Property$h}
$basedata | %{ ($th.([int]$_.row)).($_.col) =$_.value }
#
$th.keys | Sort-Object |%{$th.$_}|
Select-Object-Property ($mincol..$maxcol | %{Int26toSTRING$_} ) |
Export-Csv-Path ($xlspath-replace‘xlsx$’,“csv”) -NoTypeInformation-UseCulture-Encodingutf8
}
Ошибка при выполнении:
PS C:\tmp> C:\tmp\xlstocsv.ps1
Неожиданный токен "destination" в выражении или инструкции.
C:\tmp\xlstocsv.ps1:45 знак:34
+ if(!(Test-Path“$destination <<<< \temp”)){ [void] (New-Item-Path$destination-Nametemp-ItemTypedirectory) }
+ CategoryInfo : ParserError: (destination:String) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnexpectedToken
Пытался сделать скрипт для преобразования файла в формате excel .xls в формат .csv, находил скрипты где это функция реализована, но чтото до ума так и не довёл (((
Пример скрипта с этой функцией (http://imamyshev.wordpress.com/2012/01/25/sync_active_directory2/)
xlstocsv.ps1
$XLSSource=“c:\tmp\file.xlsx”
$SharePath=“c:\tmp”
#===============================================================================
#=== Конвертирование файла формата .XLSX в файл формата .CSV
#=== без использования ПО MS Office Excel
#=== Вызов функции: convertXLSXtoCSV “C:\file1.xlsx” [sheet1|sheet2|..]
#=== На выходе одноименный файл в формате CSV: C:\file1.csv
#===============================================================================
functionconvertXLSXtoCSV ([string] $xlspath, $sheet=“sheet1″)
{
functionINTto26
{
param ([int]$x)
$m=$x% 26
if($x-gt 0 -and$m-eq 0){$m= 26}
if(($x-$m) -gt 0)
{
$d= ($x-$m)/26
$dummy= 0
intto26$d
}
$m
}
functionSTRINGto26INT ([string]$s)
{
([int[]][char[]]$s.toupper())[-1..-$s.length] | %{$_-64} |
%{$m= 1}{$_*$m;$m*=26} | Measure-Object-Sum |
Select-Object-ExpandPropertysum
}
functionInt26toSTRING ([int]$i)
{
$ofs=“”
[string][char[]]((INTto26$i) | %{$_+64})
}
$mincol= 16384
$maxcol= 1
$minrow= [int]::MaxValue
$maxrow= 1
$shellApplication=new-object-comshell.application
$file=Get-Item$xlspath
$destination=Split-Path$xlspath
if(!(Test-Path“$destination\temp”)){ [void] (New-Item-Path$destination-Nametemp-ItemTypedirectory) }
Rename-Item$xlspath“$xlspath.zip”
$zipPackage=$shellApplication.NameSpace(“$xlspath.zip”)
$destinationFolder=$shellApplication.NameSpace(“$destination\temp”)
$destinationFolder.CopyHere($zipPackage.Items().item(2))
#
$sharedstr= ([xml] (Get-Content“$destination\temp\xl\sharedStrings.xml”-Encodingutf8)).sst.si |
Select-Object-ExpandPropertyt | %{ if($_-is [System.Xml.XmlElement]){$_.“#text”}else{$_} }
#
$sh= [xml](Get-Content“$destination\temp\xl\worksheets\$sheet.xml”-Encodingutf8)
$basedata=$sh.worksheet.sheetData | %{$_.row} | %{$_.c} | %{
$col=$_.r -replace“\d+”,“”
if((STRINGto26INT$col) -gt$maxcol){$maxcol= (STRINGto26INT$col)}
if((STRINGto26INT$col) -lt$mincol){$mincol= (STRINGto26INT$col)}
$row=$_.r -replace“[a-z]+”,“”
if([int]$row-gt [int]$maxrow){$maxrow=$row}
if([int]$row-lt [int]$minrow){$minrow=$row}
$value=if($_.t -eq“s”){$sharedstr[($_.v)]}elseif($_.t -ne“E”){$_.v}
New-Object-TypeNamePSObject-Property @{col =$col; row =$row; value =$value}
}
#
Remove-Item“$destination\temp”-Confirm:$false-Force-Recurse
Rename-Item“$xlspath.zip”$xlspath
#
$h= @{}
$mincol..$maxcol | %{Int26toSTRING$_} | %{$h.$_=“”}
$th= @{}
$minrow..$maxrow | %{$th.$_=New-Object-TypeNamepsobject-Property$h}
$basedata | %{ ($th.([int]$_.row)).($_.col) =$_.value }
#
$th.keys | Sort-Object |%{$th.$_}|
Select-Object-Property ($mincol..$maxcol | %{Int26toSTRING$_} ) |
Export-Csv-Path ($xlspath-replace‘xlsx$’,“csv”) -NoTypeInformation-UseCulture-Encodingutf8
}
Ошибка при выполнении:
PS C:\tmp> C:\tmp\xlstocsv.ps1
Неожиданный токен "destination" в выражении или инструкции.
C:\tmp\xlstocsv.ps1:45 знак:34
+ if(!(Test-Path“$destination <<<< \temp”)){ [void] (New-Item-Path$destination-Nametemp-ItemTypedirectory) }
+ CategoryInfo : ParserError: (destination:String) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnexpectedToken