Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Как написать скрипт для преобразования файла в формате excel .xls в формат .csv

Ответить
Настройки темы
PowerShell - [решено] Как написать скрипт для преобразования файла в формате excel .xls в формат .csv

Забанен


Сообщения: 63
Благодарности: 0

Профиль | Сайт | Цитировать


Изменения
Автор: sea707
Дата: 01-09-2012
Доброго времени суток! Как написать скрипт для преобразования файла в формате 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

Отправлено: 05:08, 01-09-2012

 

Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


sea707, Вам что — надо без участия самого Excel сие делать?

Отправлено: 05:57, 01-09-2012 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Забанен


Сообщения: 63
Благодарности: 0

Профиль | Сайт | Цитировать


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

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

Отправлено: 15:03, 01-09-2012 | #3


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


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()

Последний раз редактировалось Iska, 01-09-2012 в 18:14. Причина: Добавил скобки

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:44, 01-09-2012 | #4


Ветеран


Contributor


Сообщения: 2726
Благодарности: 1696

Профиль | Отправить PM | Цитировать


То же самое (.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
Чтобы эксел не переспрашивал сохранение

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:40, 01-09-2012 | #5


Забанен


Сообщения: 63
Благодарности: 0

Профиль | Сайт | Цитировать


Цитата Iska:
$oWorkbook.Close() »
$oWorkbook.Close(6)

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

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

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

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

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

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

Последний раз редактировалось sea707, 02-09-2012 в 12:51.


Отправлено: 12:42, 02-09-2012 | #6


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата sea707:
А что означает цифра 6, формат сохраняйемого файла? и как можно посмотреть, что означают цифры? »
SaveAs MethodXlFileFormat Enumeration:
Цитата:
Name Value Description

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

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

Итого:
Код: Выделить весь код
$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()
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:30, 02-09-2012 | #7


Забанен


Сообщения: 63
Благодарности: 0

Профиль | Сайт | Цитировать


Отлично ))) Всё работает )))

Отправлено: 13:45, 02-09-2012 | #8


Забанен


Сообщения: 63
Благодарности: 0

Профиль | Сайт | Цитировать


блин, тока кодировка файла должна быть utf-8 для далнейшей работы с powershell

Отправлено: 16:07, 02-09-2012 | #9


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Не должна.

Отправлено: 04:10, 03-09-2012 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Как написать скрипт для преобразования файла в формате excel .xls в формат .csv

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
VBA - Помогите написать макрос в Excel, экспорт данных из Excel в Word. E.v.g Программирование и базы данных 7 03-05-2018 22:18
2007 - Создание таблицы с защищенными ячейками (Excel 2007) v2 -KeyMaster- Microsoft Office (Word, Excel, Outlook и т.д.) 6 14-06-2012 16:11
2003/XP/2000 - excel таблица из другой excel таблицы sesves Microsoft Office (Word, Excel, Outlook и т.д.) 2 16-03-2012 01:24
2003/XP/2000 - Excel 2003 | Как напечатать определённые строки таблицы? ondo Microsoft Office (Word, Excel, Outlook и т.д.) 3 13-07-2010 17:12
excel , повтор шапки таблицы на каждой странице bool Хочу все знать 2 15-12-2007 19:14




 
Переход