PDA

Показать полную графическую версию : [решено] Как написать скрипт для преобразования файла в формате excel .xls в формат .csv


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

Iska
01-09-2012, 05:57
sea707, Вам что — надо без участия самого Excel сие делать?

sea707
01-09-2012, 15:03
Мне надо в автоматическом режиме переобразовать файл excel в формат csv, в принципе даже не важно с помощью какого скриптового языка... главное, на выходе должен быть файл csv...

Значение не имеет, с использование офисного пакета или без, другие дополнительные компонеты... установить не проблема...

Iska
01-09-2012, 15:44
sea707, если на машине есть установленный Office — то можно просто использовать Excel, наподобие:
$oExcel = New-Object -ComObject "Excel.Application"
$oWorkbook = $oExcel.Workbooks.Open("C:\Documents and Settings\User\Мои документы\Some Workbook.xls")
$oWorkbook.SaveAs("C:\Documents and Settings\User\Мои документы\Some Workbook.csv", 6)
$oWorkbook.Close()
$oExcel.Quit()

megaloman
01-09-2012, 16:40
То же самое (.vbs-скрипт) Set XL = CreateObject("Excel.Application")
XL.Visible = False

XL.Workbooks.Open "E:\DDDDD\ExcelFile.xls"
XL.ActiveWorkbook.SaveAs "E:\DDDDD\ExcelFile.csv",6
XL.ActiveWorkbook.Saved = True

XL.ActiveWindow.Close
XL.Quit
Важна строка
XL.ActiveWorkbook.Saved = True
Чтобы эксел не переспрашивал сохранение

sea707
02-09-2012, 12:42
$oWorkbook.Close() »
$oWorkbook.Close(6)

P.S.: Чтоб ексел не спрашивал, сохранить изменения в файле...

$oWorkbook.SaveAs("C:\Documents and Settings\User\Мои документы\Some Workbook.csv", 6) »
XL.ActiveWorkbook.SaveAs "E:\DDDDD\ExcelFile.csv",6 »
А что означает цифра 6, формат сохраняйемого файла? и как можно посмотреть, что означают цифры?

Важна строка
XL.ActiveWorkbook.Saved = True
Чтобы эксел не переспрашивал сохранение »
Есть ли подобный параметр в PowerShell

И ещё, один, важный момент: по умолчанию - открывает и сохраняет текущий лист файла, а как указать другой лист в книге excel?
$oExcel.Workbooks | get-member
Sheets Property Sheets Sheets () {get}
OnSheetActivate Property string OnSheetActivatчтe () {get} {set}
Что есть, но не пойму как этим воспользоваться (((

Важна строка
XL.ActiveWorkbook.Saved = True
Чтобы эксел не переспрашивал сохранение »
А есть ли параметр, на перезапись существующего файла?

По умолчанию, если файл существуют - оба скрипта говорят о перезаписи файла...

Iska
02-09-2012, 13:30
А что означает цифра 6, формат сохраняйемого файла? и как можно посмотреть, что означают цифры? »
SaveAs Method (http://msdn.microsoft.com/en-us/library/office/bb214129(v=office.12).aspx) → XlFileFormat Enumeration (http://msdn.microsoft.com/en-us/library/office/bb241279(v=office.12).aspx):
Name Value Description

xlCSV 6 CSV

Есть ли подобный параметр в PowerShell »
Я бы делал так:
$oWorkbook.Close($false)
И ещё, один, важный момент: по умолчанию - открывает и сохраняет текущий лист файла, а как указать другой лист в книге excel? »
Метод «.SaveAs()» применим как к рабочей книге, так и к отдельному рабочему листу/диаграмме:
$oWorkbook.Sheets.Item("Лист5").SaveAs("C:\Documents and Settings\User\Мои документы\Some Workbook.csv", 6)
А есть ли параметр, на перезапись существующего файла? »
Нет. Но можно:

а) проверить существование файла и удалить его перед записью;
б) отключить предупреждения приложения.

Итого:
$oExcel = New-Object -ComObject "Excel.Application"
$oExcel.DisplayAlerts = $false
$oWorkbook = $oExcel.Workbooks.Open("C:\Documents and Settings\User\Мои документы\Some Workbook.xls")
$oWorkbook.Sheets.Item("Лист5").SaveAs("C:\Documents and Settings\User\Мои документы\Some Workbook.csv", 6)
$oWorkbook.Close($false)
$oExcel.Quit()

sea707
02-09-2012, 13:45
Отлично ))) Всё работает )))

sea707
02-09-2012, 16:07
:( блин, тока кодировка файла должна быть utf-8 для далнейшей работы с powershell

Iska
03-09-2012, 04:10
Не должна.




© OSzone.net 2001-2012