![]() |
Как написать скрипт для преобразования файла в формате excel .xls в формат .csv
Доброго времени суток! Как написать скрипт для преобразования файла в формате excel .xls в формат .csv
Пытался сделать скрипт для преобразования файла в формате excel .xls в формат .csv, находил скрипты где это функция реализована, но чтото до ума так и не довёл ((( Пример скрипта с этой функцией 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 |
sea707, Вам что — надо без участия самого Excel сие делать?
|
Мне надо в автоматическом режиме переобразовать файл excel в формат csv, в принципе даже не важно с помощью какого скриптового языка... главное, на выходе должен быть файл csv...
Значение не имеет, с использование офисного пакета или без, другие дополнительные компонеты... установить не проблема... |
sea707, если на машине есть установленный Office — то можно просто использовать Excel, наподобие:
Код:
$oExcel = New-Object -ComObject "Excel.Application" |
То же самое (.vbs-скрипт)
Код:
Set XL = CreateObject("Excel.Application") XL.ActiveWorkbook.Saved = True Чтобы эксел не переспрашивал сохранение |
Цитата:
P.S.: Чтоб ексел не спрашивал, сохранить изменения в файле... Цитата:
Цитата:
Цитата:
И ещё, один, важный момент: по умолчанию - открывает и сохраняет текущий лист файла, а как указать другой лист в книге excel? $oExcel.Workbooks | get-member Sheets Property Sheets Sheets () {get} OnSheetActivate Property string OnSheetActivatчтe () {get} {set} Что есть, но не пойму как этим воспользоваться ((( Цитата:
По умолчанию, если файл существуют - оба скрипта говорят о перезаписи файла... |
Цитата:
Цитата:
Цитата:
Код:
$oWorkbook.Close($false) Цитата:
Код:
$oWorkbook.Sheets.Item("Лист5").SaveAs("C:\Documents and Settings\User\Мои документы\Some Workbook.csv", 6) Цитата:
а) проверить существование файла и удалить его перед записью; б) отключить предупреждения приложения. Итого: Код:
$oExcel = New-Object -ComObject "Excel.Application" |
Отлично ))) Всё работает )))
|
:( блин, тока кодировка файла должна быть utf-8 для далнейшей работы с powershell
|
Не должна.
|
Время: 21:36. |
Время: 21:36.
© OSzone.net 2001-