Что нового

Перенос информации из файла xml в файл xls

Anna

Новичок
Сообщения
119
Репутация
2
Здравствуйте.
Как перенести информацию из файла формата xml в файл формата xls
Пример xml :

Код:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
- <Файл ИдФайл="NO_BOUPR_2536_2536_2537066923253601001_20161211_9d7ef562-ee9c-4021-9ede-12b7ca95f043" ВерсПрог="1С:ПРЕДПРИЯТИЕ 8.3 БП 2.0.65.45" ВерсФорм="5.01">
- <Документ КНД="710096" ДатаДок="11.12.2016" Период="34" ОтчетГод="2015" НомКорр="0" ОКЕИ="384">
- <СвНП ОКВЭД="45.41" ОКПО="15247732" ОКФС="16" ОКОПФ="65">
- <НПЮЛ НаимОрг="ООО "ДСервис"" ИННЮЛ="2537066923" КПП="253601001">
  <АдрРФ Индекс="690088" КодРегион="25" Город="Владивосток г" Улица="Алиева ул" Дом="14" Кварт="14" /> 
  </НПЮЛ>
  </СвНП>
- <Подписант ПрПодп="1">
  <ФИО Фамилия="Ворон" Имя="Иван" Отчество="Иванович" /> 
  </Подписант>
- <Баланс ОКУД="710001">
- <Актив КодСтроки="1600" СумОтч="1813" СумПрдщ="1813" СумПрдшв="1413">
  <МатВнеАкт КодСтроки="1150" СумОтч="1000" СумПрдщ="1000" СумПрдшв="1000" /> 
  <Запасы КодСтроки="1210" СумОтч="371" СумПрдщ="371" СумПрдшв="371" /> 
  <ДенежнСр КодСтроки="1250" СумОтч="0" /> 
  <ФинВлож КодСтроки="1230" СумОтч="442" СумПрдщ="442" СумПрдшв="42" /> 
  </Актив>
- <Пассив КодСтроки="1700" СумОтч="1813" СумПрдщ="1813" СумПрдшв="1413">
  <КапРез КодСтроки="1370" СумОтч="930" СумПрдщ="930" СумПрдшв="930" /> 
  <ДлгЗаемСредств КодСтроки="1410" СумОтч="0" /> 
  <КртЗаемСредств КодСтроки="1510" СумОтч="793" СумПрдщ="793" СумПрдшв="393" /> 
  <КредитЗадолж КодСтроки="1520" СумОтч="47" СумПрдщ="47" СумПрдшв="47" /> 
  <ДрКраткосрОбяз КодСтроки="1550" СумОтч="43" СумПрдщ="43" СумПрдшв="43" /> 
  </Пассив>
  </Баланс>
- <ПрибУб ОКУД="710002">
  <Выруч КодСтроки="2110" СумОтч="0" /> 
  <ПроцУпл КодСтроки="2330" СумОтч="0" /> 
  <ПрочРасход КодСтроки="2350" СумОтч="0" /> 
  <ЧистПрибУб КодСтроки="2400" СумОтч="0" СумПред="0" /> 
  </ПрибУб>
  </Документ>
  </Файл>
Код:
<ФинВлож КодСтроки="1230" СумОтч="442" СумПрдщ="442" СумПрдшв="42" />
Пример что хочу получить в xls
Наименование показателя КодСтроки СумОтч СумПрдщ СумПрдшв
ФинВлож 1230 442 442 42
 
Автор
A

Anna

Новичок
Сообщения
119
Репутация
2
Смотрела пример здесь
http://autoit-script.ru/index.php?topic=13054.0

но, видимо с тех пор произошли изменения, там вместо _Excel_BookNew используется _ExcelBookNew может, ещё что изменилось, в общем, не получается.
Помогите, пожалуйста.
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Пытаюсь осилить регулярные выражения, вот мой вариант :
Код:
#include <Excel.au3>
#include <Array.au3>

$sFilePath1 = @ScriptDir & "\result.xlsx" 
$sFilePath2 = @ScriptDir & "\1.xml" 

Local $aResult[2][5]
$aResult[0][0] = 'Наименование показателя'
$aResult[1][0] = 'ФинВлож'
$aFinVloj = StringRegExp(FileRead($sFilePath2), '<ФинВлож(.*?)/>', 1)

_Pokazatel($aFinVloj[0], "КодСтроки", 1)
_Pokazatel($aFinVloj[0], "СумОтч", 2)
_Pokazatel($aFinVloj[0], "СумПрдщ", 3)
_Pokazatel($aFinVloj[0], "СумПрдшв", 4)

$oExcel = _Excel_Open(False)
$oWorkbook = _Excel_BookNew($oExcel)
_Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, $aResult)
_Excel_BookSaveAs($oWorkbook, $sFilePath1)
_Excel_BookClose($oWorkbook)
_Excel_Close($oExcel)

Func _Pokazatel($Stroka, $parametr, $pole)
	$aParam = StringRegExp($Stroka, $parametr & '="(.*?)"', 1)
	$aResult[0][$pole] = $parametr
	$aResult[1][$pole] = $aParam[0]
EndFunc   ;==>_Pokazatel
видимо с тех пор произошли изменения
да, функции из старых UDF "Excel.au3" и "Word.au3" не совместимы с новыми версиями AutoIt
 
Автор
A

Anna

Новичок
Сообщения
119
Репутация
2
ra4o сказал(а):
Пытаюсь осилить регулярные выражения, вот мой вариант :
Код:
#include <Excel.au3>
#include <Array.au3>

$sFilePath1 = @ScriptDir & "\result.xlsx" 
$sFilePath2 = @ScriptDir & "\1.xml" 

Local $aResult[2][5]
$aResult[0][0] = 'Наименование показателя'
$aResult[1][0] = 'ФинВлож'
$aFinVloj = StringRegExp(FileRead($sFilePath2), '<ФинВлож(.*?)/>', 1)

_Pokazatel($aFinVloj[0], "КодСтроки", 1)
_Pokazatel($aFinVloj[0], "СумОтч", 2)
_Pokazatel($aFinVloj[0], "СумПрдщ", 3)
_Pokazatel($aFinVloj[0], "СумПрдшв", 4)

$oExcel = _Excel_Open(False)
$oWorkbook = _Excel_BookNew($oExcel)
_Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, $aResult)
_Excel_BookSaveAs($oWorkbook, $sFilePath1)
_Excel_BookClose($oWorkbook)
_Excel_Close($oExcel)

Func _Pokazatel($Stroka, $parametr, $pole)
	$aParam = StringRegExp($Stroka, $parametr & '="(.*?)"', 1)
	$aResult[0][$pole] = $parametr
	$aResult[1][$pole] = $aParam[0]
EndFunc   ;==>_Pokazatel
видимо с тех пор произошли изменения
да, функции из старых UDF "Excel.au3" и "Word.au3" не совместимы с новыми версиями AutoIt

Спасибо


Почему-то числовые значения строки "Запасы" не свою строку записываются, а в строку "ФинВлож" .
Где ошибка?

Код:
#include <Excel.au3>
#include <Array.au3>

$sFilePath1 = @ScriptDir & "\result1.xlsx"
$sFilePath2 = @ScriptDir & "\1.xml"

Local $aResult[3][5]
$aResult[0][0] = 'Наименование показателя'
$aResult[1][0] = 'ФинВлож'
$aResult[2][0] = 'Запасы'
$aZpas = StringRegExp(FileRead($sFilePath2), '<Запасы(.*?)/>', 1)
$aFinVloj = StringRegExp(FileRead($sFilePath2), '<ФинВлож(.*?)/>', 1)

_Pokazatel($aFinVloj[0], "КодСтроки", 1)
_Pokazatel($aFinVloj[0], "СумОтч", 2)
_Pokazatel($aFinVloj[0], "СумПрдщ", 3)
_Pokazatel($aFinVloj[0], "СумПрдшв", 4)

_Pokazatel($aZpas[0], "КодСтроки", 1)
_Pokazatel($aZpas[0], "СумОтч", 2)
_Pokazatel($aZpas[0], "СумПрдщ", 3)
_Pokazatel($aZpas[0], "СумПрдшв", 4)
$oExcel = _Excel_Open(False)
$oWorkbook = _Excel_BookNew($oExcel)
_Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, $aResult)
_Excel_BookSaveAs($oWorkbook, $sFilePath1)
_Excel_BookClose($oWorkbook)
_Excel_Close($oExcel)

Func _Pokazatel($Stroka, $parametr, $pole)
    $aParam = StringRegExp($Stroka, $parametr & '="(.*?)"', 1)
    $aResult[0][$pole] = $parametr
    $aResult[1][$pole] = $aParam[0]
EndFunc   ;==>_Pokazatel

На снимке “не правильно” то что сейчас получается,
на снимке “правильно” то что должно получиться.
Что изменить?
 

Вложения

  • не правильно.JPG
    не правильно.JPG
    23.9 КБ · Просмотры: 11
  • правильно.JPG
    правильно.JPG
    23.8 КБ · Просмотры: 13
A

Alofa

Гость
Anna, а может вы руками составите .XLSX документ из .XML в шапке темы.
Так будет понятней чего вы хотите.
 
Автор
A

Anna

Новичок
Сообщения
119
Репутация
2
Alofa сказал(а):
Anna, а может вы руками составите .XLSX документ из .XML в шапке темы.
Так будет понятней чего вы хотите.

Не пускает "Вы не можете отправить этот файл. Доступны только следующие....."
На файлообменник залила http://rgho.st/6xkQlZ7JP
В файле xml строки баланса имеют сокращенное наименование, не требуется переделывать сокращенные наименования в полные, как я записала в документе “ Капитал и резервы ” так и должно быть как в исходном xml “ КапРез ”
Alofa
Возможно, я непонятно сделала.
Первая страница документа, это как я делаю руками, а вторая это как должен делать скрипт, на снимке нужный результат.
 

Вложения

  • exx1.JPG
    exx1.JPG
    75 КБ · Просмотры: 12

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Вот , мой предыдущий вариант, только более универсален.
Код:
#include <Excel.au3>
#include <Array.au3>

$sFilePath1 = @ScriptDir & "\result.xlsx"
$sFilePath2 = @ScriptDir & "\1.xml"
Global $TextFile = FileRead($sFilePath2)
Global $n = 0

Global $aResult[1][5]
$aResult[0][0] = 'Наименование показателя'
Global $aPokazatel[4] = ["КодСтроки", "СумОтч", "СумПрдщ", "СумПрдшв"]
For $i = 0 To UBound($aPokazatel) - 1
	$aResult[0][$i + 1] = $aPokazatel[$i]
Next

_GetText('ФинВлож')
_GetText('Запасы')
_WriteExcel($aResult)

Func _GetText($BlocName)
	$n += 1
	ReDim $aResult[$n + 1][5]
	$Stroka = StringRegExp($TextFile, '<' & $BlocName & '(.*?)/>', 1)
	$aResult[$n][0] = $BlocName

	For $i = 0 To UBound($aPokazatel) - 1
		$aParam = StringRegExp($Stroka[0], $aPokazatel[$i] & '="(.*?)"', 1)
		$aResult[$n][$i + 1] = $aParam[0]
	Next

EndFunc   ;==>_GetText

Func _WriteExcel($aResult)
	$oExcel = _Excel_Open(False)
	$oWorkbook = _Excel_BookNew($oExcel)
	_Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, $aResult)
	_Excel_BookSaveAs($oWorkbook, $sFilePath1)
	_Excel_BookClose($oWorkbook)
	_Excel_Close($oExcel)
EndFunc   ;==>_WriteExcel
 
Автор
A

Anna

Новичок
Сообщения
119
Репутация
2
ra4o сказал(а):
Вот , мой предыдущий вариант, только более универсален.
Спасибо, большую часть строк записывает в документ xls.
Однако если снять комментарий с закомментированных строк, то не хочет работать.
Напротив каждой написала, как выглядит строка в документе 1.xml

Как записать строки перед которыми стоит знак ”-” и строки в которых меньше четырёх столбцов?

Код:
#include <Excel.au3>
#include <Array.au3>

$sFilePath1 = @ScriptDir & "\result.xlsx"
$sFilePath2 = @ScriptDir & "\1.xml"
Global $TextFile = FileRead($sFilePath2)
Global $n = 0

Global $aResult[1][5]
$aResult[0][0] = 'Наименование показателя'
Global $aPokazatel[4] = ["КодСтроки", "СумОтч", "СумПрдщ", "СумПрдшв"]
For $i = 0 To UBound($aPokazatel) - 1
    $aResult[0][$i + 1] = $aPokazatel[$i]
Next

;_GetText('Актив')    ; - <Актив КодСтроки="1600" СумОтч="1813" СумПрдщ="1813" СумПрдшв="1413">

_GetText('МатВнеАкт') ;   <МатВнеАкт КодСтроки="1150" СумОтч="1000" СумПрдщ="1000" СумПрдшв="1000" />

_GetText('Запасы')    ;    <Запасы КодСтроки="1210" СумОтч="371" СумПрдщ="371" СумПрдшв="371" />

;_GetText('ДенежнСр')  ;   <ДенежнСр КодСтроки="1250" СумОтч="0" />

_GetText('ФинВлож')    ;   <ФинВлож КодСтроки="1230" СумОтч="442" СумПрдщ="442" СумПрдшв="42" />

;_GetText('Пассив')   ;   - <Пассив КодСтроки="1700" СумОтч="1813" СумПрдщ="1813" СумПрдшв="1413">

;_GetText('ДлгЗаемСредств') ; <ДлгЗаемСредств КодСтроки="1410" СумОтч="0" />

_GetText('КртЗаемСредств') ; <КртЗаемСредств КодСтроки="1510" СумОтч="793" СумПрдщ="793" СумПрдшв="393" />

_GetText('КредитЗадолж')  ; <КредитЗадолж КодСтроки="1520" СумОтч="47" СумПрдщ="47" СумПрдшв="47" />

_GetText('ДрКраткосрОбяз') ; <ДрКраткосрОбяз КодСтроки="1550" СумОтч="43" СумПрдщ="43" СумПрдшв="43" />

_WriteExcel($aResult)

Func _GetText($BlocName)
    $n += 1
    ReDim $aResult[$n + 1][5]
    $Stroka = StringRegExp($TextFile, '<' & $BlocName & '(.*?)/>', 1)
    $aResult[$n][0] = $BlocName

    For $i = 0 To UBound($aPokazatel) - 1
        $aParam = StringRegExp($Stroka[0], $aPokazatel[$i] & '="(.*?)"', 1)
        $aResult[$n][$i + 1] = $aParam[0]
    Next

EndFunc   ;==>_GetText

Func _WriteExcel($aResult)
    $oExcel = _Excel_Open(False)
    $oWorkbook = _Excel_BookNew($oExcel)
    _Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, $aResult)
    _Excel_BookSaveAs($oWorkbook, $sFilePath1)
    _Excel_BookClose($oWorkbook)
    _Excel_Close($oExcel)
EndFunc   ;==>_WriteExcel
 
A

Alofa

Гость
Вот еще:
Код:
#include <Excel.au3>
#include <Array.au3>
Global $sTextInput = FileRead(@ScriptDir & '\Input.xml')
If @error Then Exit
Global $sFileOutput = @ScriptDir & '\Output.xlsx'
Global $aArray[][] = [[], _
		['', '', 'Коды'], _
		['', 'ОКУД', '<Баланс ОКУД="'], _
		['', 'Период', '<Документ.+Период="'], _
		['', 'по ОКПО', '<СвНП.+ОКПО="'], _
		['', 'ИНН', '<НПЮЛ.+ИННЮЛ="'], _
		['', 'по ОКВЭД', '<СвНП ОКВЭД="'], _
		['', 'ОКОПФ', '<СвНП.+ОКОПФ="'], _
		['', 'ОКФС', '<СвНП.+ОКФС="'], _
		['', 'по ОКЕИ', '<Документ.+ОКЕИ="'], _
		['', 'Организация', '<НПЮЛ НаимОрг="'], _
		['', 'Единица измерения:', 'в тыс. Рублей'], _
		['', 'Местонахождение (адрес)', '<АдрРФ([^/>]+)'], _
		[], _
		['', 'Наименование показателя', 'Код', '<Документ.+ОтчетГод="', '<Документ.+ОтчетГод="', '<Документ.+ОтчетГод="'], _
		['', 'АКТИВ'], _
		['', 'МатВнеАкт', '<МатВнеАкт КодСтроки="', '<МатВнеАкт.+СумОтч="', '<МатВнеАкт.+СумПрдщ="', '<МатВнеАкт.+СумПрдшв="'], _
		['', 'Запасы', '<Запасы КодСтроки="', '<Запасы.+СумОтч="', '<Запасы.+СумПрдщ="', '<Запасы.+СумПрдшв="'], _
		['', 'ФинВлож', '<ФинВлож КодСтроки="', '<ФинВлож.+СумОтч="', '<ФинВлож.+СумПрдщ="', '<ФинВлож.+СумПрдшв="'], _
		['', 'БАЛАНС', '<Актив КодСтроки="', '<Актив.+СумОтч="', '<Актив.+СумПрдщ="', '<Актив.+СумПрдшв="'], _
		['', 'ПАССИВ'], _
		['', 'Капитал и резервы', '<КапРез КодСтроки="', '<КапРез.+СумОтч="', '<КапРез.+СумПрдщ="', '<КапРез.+СумПрдшв="'], _
		['', 'Краткосрочные заемные средства', '<КртЗаемСредств КодСтроки="', '<КртЗаемСредств.+СумОтч="', '<КртЗаемСредств.+СумПрдщ="', '<КртЗаемСредств.+СумПрдшв="'], _
		['', 'Кредиторская задолженность', '<КредитЗадолж КодСтроки="', '<КредитЗадолж.+СумОтч="', '<КредитЗадолж.+СумПрдщ="', '<КредитЗадолж.+СумПрдшв="'], _
		['', 'Другие краткосрочные обязательства', '<ДрКраткосрОбяз КодСтроки="', '<ДрКраткосрОбяз.+СумОтч="', '<ДрКраткосрОбяз.+СумПрдщ="', '<ДрКраткосрОбяз.+СумПрдшв="'], _
		['', 'БАЛАНС', '<Пассив КодСтроки="', '<Пассив.+СумОтч="', '<Пассив.+СумПрдщ="', '<Пассив.+СумПрдшв="']]

Local $aStr
For $i = 2 To UBound($aArray) - 1
	$sPattern2 = ($i = 10) ? '(.+)"\hИНН' : '([^"]+)'
	For $j = 2 To 5
		Switch $i
			Case 11, 13, 15, 20
				ContinueLoop 2
			Case 14
				If $j = 2 Then ContinueLoop
		EndSwitch
		If $aArray[$i][$j] Then
			$aStr = StringRegExp($sTextInput, $aArray[$i][$j] & $sPattern2, 1)
			$aArray[$i][$j] = (IsArray($aStr)) ? $aStr[0] : ''
		EndIf
		If $i = 12 Then
			$aStr = StringRegExp($aArray[$i][$j], '=\h?"(.+?)"', 3)
			$aArray[$i][$j] = (UBound($aStr) = 6) ? ($aStr[0] & ', Регион ' & $aStr[1] & _
					', ' & $aStr[2] & ', ' & $aStr[3] & ', дом № ' & $aStr[4] & ', кв. ' & $aStr[5]) : ''
		EndIf
		If $i = 14 Then $aArray[$i][$j] = 'На 31 декабря ' & $aArray[$i][$j] & ' г.'
	Next
Next

;~ _ArrayDisplay($aArray)
;~ Exit

Local $oExcel = _Excel_Open(False)
Local $oWorkbook = _Excel_BookNew($oExcel)
_Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, $aArray)
_Excel_BookSaveAs($oWorkbook, $sFileOutput)
_Excel_BookClose($oWorkbook)
_Excel_Close($oExcel)
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Как записать строки перед которыми стоит знак ”-” и строки в которых меньше четырёх столбцов?
Исправил
Код:
#include <Excel.au3>
#include <Array.au3>

$sFilePath1 = @ScriptDir & "\result.xlsx"
$sFilePath2 = @ScriptDir & "\1.xml"
Global $TextFile = FileRead($sFilePath2)
Global $n = 0

Global $aResult[1][5]
$aResult[0][0] = 'Наименование показателя'
Global $aPokazatel[4] = ["КодСтроки", "СумОтч", "СумПрдщ", "СумПрдшв"]
For $i = 0 To UBound($aPokazatel) - 1
	$aResult[0][$i + 1] = $aPokazatel[$i]
Next

_GetText('Актив') ; - <Актив КодСтроки="1600" СумОтч="1813" СумПрдщ="1813" СумПрдшв="1413">

_GetText('МатВнеАкт') ;   <МатВнеАкт КодСтроки="1150" СумОтч="1000" СумПрдщ="1000" СумПрдшв="1000" />

_GetText('Запасы') ;    <Запасы КодСтроки="1210" СумОтч="371" СумПрдщ="371" СумПрдшв="371" />

_GetText('ДенежнСр') ;   <ДенежнСр КодСтроки="1250" СумОтч="0" />

_GetText('ФинВлож') ;   <ФинВлож КодСтроки="1230" СумОтч="442" СумПрдщ="442" СумПрдшв="42" />

_GetText('Пассив') ;   - <Пассив КодСтроки="1700" СумОтч="1813" СумПрдщ="1813" СумПрдшв="1413">

_GetText('ДлгЗаемСредств') ; <ДлгЗаемСредств КодСтроки="1410" СумОтч="0" />

_GetText('КртЗаемСредств') ; <КртЗаемСредств КодСтроки="1510" СумОтч="793" СумПрдщ="793" СумПрдшв="393" />

_GetText('КредитЗадолж') ; <КредитЗадолж КодСтроки="1520" СумОтч="47" СумПрдщ="47" СумПрдшв="47" />

_GetText('ДрКраткосрОбяз') ; <ДрКраткосрОбяз КодСтроки="1550" СумОтч="43" СумПрдщ="43" СумПрдшв="43" />

_WriteExcel($aResult)

Func _GetText($BlocName)
	$n += 1
	ReDim $aResult[$n + 1][5]
	$Stroka = StringRegExp($TextFile, '<' & $BlocName & '(.*?)>', 1)
	If Not @error Then
		$aResult[$n][0] = $BlocName
		For $i = 0 To UBound($aPokazatel) - 1
			$aParam = StringRegExp($Stroka[0], $aPokazatel[$i] & '="(.*?)"', 1)
			If Not @error Then $aResult[$n][$i + 1] = $aParam[0]
		Next
	EndIf

EndFunc   ;==>_GetText

Func _WriteExcel($aResult)
	$oExcel = _Excel_Open(False)
	$oWorkbook = _Excel_BookNew($oExcel)
	_Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, $aResult)
	_Excel_BookSaveAs($oWorkbook, $sFilePath1)
	_Excel_BookClose($oWorkbook)
	_Excel_Close($oExcel)
EndFunc   ;==>_WriteExcel

Вот, ещё дописал - создаётся документ в такой форме, как у Вас
Код:
#include <Excel.au3>
#include <Array.au3>

$sFilePath1 = @ScriptDir & "\result.xlsx"
$sFilePath2 = @ScriptDir & "\1.xml"
Global $TextFile = FileRead($sFilePath2)
Global $n = 0

Global $aResult[1][5]

Global $aPokazatel[4] = ["КодСтроки", "СумОтч", "СумПрдщ", "СумПрдшв"]
$aResult[$n][1] = 'Коды'
;Функция _GetText ищет значение в блоке и записывает в массив значение
;Последний параметр : 0 - Записывает в первую колонку название параметра
;                     1(или любое значение не "0" - записывает в первую колонку название блока
;Если второй параметр строка, то записывается только одно значение,
; Если второй параметр массив - несколько строк, сколько элементов в массиве
_GetText('Баланс', 'ОКУД', 0)
_GetText('Документ', 'Период', 0)
_GetText('СвНП', 'ОКПО', 0)
_GetText('НПЮЛ', 'ИННЮЛ', 0)
_GetText('СвНП', 'ОКВЭД', 0)
_GetText('СвНП', 'ОКОПФ', 0)
_GetText('СвНП', 'ОКФС', 0)
_GetText('Документ', 'ОКЕИ', 0)
$n += 1
ReDim $aResult[$n + 1][5]
$aResult[$n][0] = 'Организация'
;Функция _GetTextOnly - только возвращает название параметра без записи в массив результата
$aResult[$n][1] = _GetTextOnly('ФИО', 'Фамилия') & ' ' & _GetTextOnly('ФИО', 'Имя') & ' ' & _GetTextOnly('ФИО', 'Отчество')
$n += 1
ReDim $aResult[$n + 1][5]
$aResult[$n][0] = 'Единица измерения'
$aResult[$n][1] = 'в тыс рублей'
$n += 1
ReDim $aResult[$n + 1][5]
$aResult[$n][0] = 'Местонахождение (адрес)'
$aResult[$n][1] = _GetTextOnly('АдрРФ', 'Индекс') & ' ' & _GetTextOnly('АдрРФ', 'Город') & _
		' ' & _GetTextOnly('АдрРФ', 'Улица') & ' ' & _GetTextOnly('АдрРФ', 'Дом') & ' ' & _GetTextOnly('АдрРФ', 'Кварт')
$n += 1
ReDim $aResult[$n + 1][5]
$aResult[$n][0] = 'Наименование показателя'
For $i = 0 To UBound($aPokazatel) - 1
	$aResult[$n][$i + 1] = $aPokazatel[$i]
Next

_GetText('Актив', $aPokazatel) ; - <Актив КодСтроки="1600" СумОтч="1813" СумПрдщ="1813" СумПрдшв="1413">

_GetText('МатВнеАкт', $aPokazatel) ;   <МатВнеАкт КодСтроки="1150" СумОтч="1000" СумПрдщ="1000" СумПрдшв="1000" />

_GetText('Запасы', $aPokazatel) ;    <Запасы КодСтроки="1210" СумОтч="371" СумПрдщ="371" СумПрдшв="371" />

_GetText('ДенежнСр', $aPokazatel) ;   <ДенежнСр КодСтроки="1250" СумОтч="0" />

_GetText('ФинВлож', $aPokazatel) ;   <ФинВлож КодСтроки="1230" СумОтч="442" СумПрдщ="442" СумПрдшв="42" />

_GetText('Пассив', $aPokazatel) ;   - <Пассив КодСтроки="1700" СумОтч="1813" СумПрдщ="1813" СумПрдшв="1413">

_GetText('ДлгЗаемСредств', $aPokazatel) ; <ДлгЗаемСредств КодСтроки="1410" СумОтч="0" />

_GetText('КртЗаемСредств', $aPokazatel) ; <КртЗаемСредств КодСтроки="1510" СумОтч="793" СумПрдщ="793" СумПрдшв="393" />

_GetText('КредитЗадолж', $aPokazatel) ; <КредитЗадолж КодСтроки="1520" СумОтч="47" СумПрдщ="47" СумПрдшв="47" />

_GetText('ДрКраткосрОбяз', $aPokazatel) ; <ДрКраткосрОбяз КодСтроки="1550" СумОтч="43" СумПрдщ="43" СумПрдшв="43" />

;_ArrayDisplay($aResult)
_WriteExcel($aResult)


Func _GetText($BlocName, $Parametr, $dt = 1)
	$n += 1
	ReDim $aResult[$n + 1][5]
	$Stroka = StringRegExp($TextFile, '<' & $BlocName & '(.*?)>', 1)
	If Not @error Then
		If $dt Then
			$aResult[$n][0] = $BlocName
		Else
			$aResult[$n][0] = $Parametr
		EndIf

		If IsArray($Parametr) Then

			For $i = 0 To UBound($Parametr) - 1
				$aParam = StringRegExp($Stroka[0], $aPokazatel[$i] & '="(.*?)"', 1)
				If Not @error Then $aResult[$n][$i + 1] = $aParam[0]
			Next

		Else
			$aParam = StringRegExp($Stroka[0], $Parametr & '="(.*?)"', 1)
			If Not @error Then $aResult[$n][1] = $aParam[0]
		EndIf

	EndIf

EndFunc   ;==>_GetText

Func _GetTextOnly($BlocName, $Parametr)
	Local $Res = ''

	$Stroka = StringRegExp($TextFile, '<' & $BlocName & '(.*?)>', 1)
	If Not @error Then
		$aParam = StringRegExp($Stroka[0], $Parametr & '="(.*?)"', 1)
		If Not @error Then $Res = $aParam[0]
	EndIf
	Return $Res
EndFunc   ;==>_GetTextOnly

Func _WriteExcel($aResult)
	$oExcel = _Excel_Open(False)
	$oWorkbook = _Excel_BookNew($oExcel)
	_Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, $aResult)
	_Excel_BookSaveAs($oWorkbook, $sFilePath1)
	_Excel_BookClose($oWorkbook)
	_Excel_Close($oExcel)
EndFunc   ;==>_WriteExcel
 
Автор
A

Anna

Новичок
Сообщения
119
Репутация
2
Уважаемые Alofa, ra4o
Спасибо большое. Вы проделали грандиозную работу.
Подправила мелкое несоответствие. В одной строке исходного файла есть кавычки в кавычках,
Код:
- <НПЮЛ НаимОрг="ООО "ДальТрансСервис""
из-за этого в конечном файле появляется &quot.
Как этого избежать?
Код:
_GetText('Документ', 'ОКЕИ', 0)
_GetText('НПЮЛ', 'НаимОрг', 0);- <НПЮЛ НаимОрг="ООО "ДальТрансСервис""   здесь двойные кавчки
;получается такая строка НаимОрг ООО &quot;ДальТрансСервис&quot; как убрать &quot

$n += 1
ReDim $aResult[$n + 1][5]
$aResult[$n][0] = 'ФИО';'Организация'
;Функция _GetTextOnly - только возвращает название параметра без записи в массив результата
$aResult[$n][1] = _GetTextOnly('ФИО', 'Фамилия') & ' ' & _GetTextOnly('ФИО', 'Имя') & ' ' & _GetTextOnly('ФИО', 'Отчество')
$n += 1

такой же результат и в строке кода
Код:
['', 'Организация', '<НПЮЛ НаимОрг="'], _
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Исправил эти две функции
Код:
Func _GetText($BlocName, $Parametr, $dt = 1)
	$n += 1
	ReDim $aResult[$n + 1][5]
	$Stroka = StringRegExp($TextFile, '<' & $BlocName & '(.*?)>', 1)
	ConsoleWrite($BlocName & '   ' & $Parametr & @CR)
	If Not @error Then
		If $dt Then
			$aResult[$n][0] = $BlocName
		Else
			$aResult[$n][0] = $Parametr
		EndIf

		If IsArray($Parametr) Then

			For $i = 0 To UBound($Parametr) - 1
				$aParam = StringRegExp($Stroka[0], $aPokazatel[$i] & '="(.*?)"', 1)
				If Not @error Then $aResult[$n][$i + 1] = $aParam[0]
			Next

		Else
			$EndMask = '"'
			$EndName = ''
			If $Parametr = 'НаимОрг' And StringInStr($Stroka[0], '""') Then
				$EndMask = '""'
				$EndName = '"'
			EndIf
			$aParam = StringRegExp($Stroka[0], $Parametr & '="(.*?)' & $EndMask, 1)
			If Not @error Then $aResult[$n][1] = $aParam[0] & $EndName
		EndIf

	EndIf

EndFunc   ;==>_GetText

Func _GetTextOnly($BlocName, $Parametr)
	Local $Res = ''

	$Stroka = StringRegExp($TextFile, '<' & $BlocName & '(.*?)>', 1)
	If Not @error Then
		$EndMask = '"'
		$EndName = ''
		If $Parametr = 'НаимОрг' And StringInStr($Stroka[0], '""') Then
			$EndMask = '""'
			$EndName = '"'
		EndIf
		$aParam = StringRegExp($Stroka[0], $Parametr & '="(.*?)' & $EndMask, 1)
		If Not @error Then $Res = $aParam[0] & $EndName
	EndIf
	Return $Res
EndFunc   ;==>_GetTextOnly
 
Автор
A

Anna

Новичок
Сообщения
119
Репутация
2
Alofa сказал(а):
Нельзя ли исключить имя файла? Чтобы скрипт брал по очереди файлы имеющие расширение xml находящиеся в папке со скриптм. Сохранённых файлов xlsx будет столько же сколько исходных xml файлов.
То есть.
Итогом работы скрипта должны стать файлы Output 1.xlsx, Output 2.xlsx Output 3.xlsx и так далее.




Добавлено:
Сообщение автоматически объединено:

ra4o сказал(а):
Исправил эти две функции
Все равно, &quot; остолось )
НаимОрг ООО &quot;ДальТрансСервис&quot;
 
A

Alofa

Гость
Anna сказал(а):
Сохранённых файлов xlsx будет столько же сколько исходных xml файлов.

Код:
#include <Excel.au3>
#include <File.au3>

Local $aXMLList = _FileListToArray(@ScriptDir, '*.xml', 1, True)
If @error Then Exit MsgBox(4096 + 16, 'Ошибка!', 'Файлы .xml не найдены.')

;~ _ArrayDisplay($aXMLList)

Local $sFileText, $oWorkbook, $oExcel = _Excel_Open(False)
For $i = 1 To $aXMLList[0]
	$aXMLList[$i] = StringTrimRight($aXMLList[$i], 4)
	$sFileText = FileRead($aXMLList[$i] & '.xml')
	If @error Then ContinueLoop
	$oWorkbook = _Excel_BookNew($oExcel)
	_Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, _Pars($sFileText))
	_Excel_BookSaveAs($oWorkbook, $aXMLList[$i] & '.xlsx')
	_Excel_BookClose($oWorkbook)
Next
_Excel_Close($oExcel)

Func _Pars($sTextInput)
	Local $aArray[][] = [[], _
			['', '', 'Коды'], _
			['', 'ОКУД', '<Баланс ОКУД="'], _
			['', 'Период', '<Документ.+Период="'], _
			['', 'по ОКПО', '<СвНП.+ОКПО="'], _
			['', 'ИНН', '<НПЮЛ.+ИННЮЛ="'], _
			['', 'по ОКВЭД', '<СвНП ОКВЭД="'], _
			['', 'ОКОПФ', '<СвНП.+ОКОПФ="'], _
			['', 'ОКФС', '<СвНП.+ОКФС="'], _
			['', 'по ОКЕИ', '<Документ.+ОКЕИ="'], _
			['', 'Организация', '<НПЮЛ НаимОрг="'], _
			['', 'Единица измерения:', 'в тыс. Рублей'], _
			['', 'Местонахождение (адрес)', '<АдрРФ([^/>]+)'], _
			[], _
			['', 'Наименование показателя', 'Код', '<Документ.+ОтчетГод="', '<Документ.+ОтчетГод="', '<Документ.+ОтчетГод="'], _
			['', 'АКТИВ'], _
			['', 'МатВнеАкт', '<МатВнеАкт КодСтроки="', '<МатВнеАкт.+СумОтч="', '<МатВнеАкт.+СумПрдщ="', '<МатВнеАкт.+СумПрдшв="'], _
			['', 'Запасы', '<Запасы КодСтроки="', '<Запасы.+СумОтч="', '<Запасы.+СумПрдщ="', '<Запасы.+СумПрдшв="'], _
			['', 'ФинВлож', '<ФинВлож КодСтроки="', '<ФинВлож.+СумОтч="', '<ФинВлож.+СумПрдщ="', '<ФинВлож.+СумПрдшв="'], _
			['', 'БАЛАНС', '<Актив КодСтроки="', '<Актив.+СумОтч="', '<Актив.+СумПрдщ="', '<Актив.+СумПрдшв="'], _
			['', 'ПАССИВ'], _
			['', 'Капитал и резервы', '<КапРез КодСтроки="', '<КапРез.+СумОтч="', '<КапРез.+СумПрдщ="', '<КапРез.+СумПрдшв="'], _
			['', 'Краткосрочные заемные средства', '<КртЗаемСредств КодСтроки="', '<КртЗаемСредств.+СумОтч="', '<КртЗаемСредств.+СумПрдщ="', '<КртЗаемСредств.+СумПрдшв="'], _
			['', 'Кредиторская задолженность', '<КредитЗадолж КодСтроки="', '<КредитЗадолж.+СумОтч="', '<КредитЗадолж.+СумПрдщ="', '<КредитЗадолж.+СумПрдшв="'], _
			['', 'Другие краткосрочные обязательства', '<ДрКраткосрОбяз КодСтроки="', '<ДрКраткосрОбяз.+СумОтч="', '<ДрКраткосрОбяз.+СумПрдщ="', '<ДрКраткосрОбяз.+СумПрдшв="'], _
			['', 'БАЛАНС', '<Пассив КодСтроки="', '<Пассив.+СумОтч="', '<Пассив.+СумПрдщ="', '<Пассив.+СумПрдшв="']]
	Local $aStr, $sPattern2
	For $i = 2 To UBound($aArray) - 1
		$sPattern2 = ($i = 10) ? '(.+)"\hИНН' : '([^"]+)'
		For $j = 2 To 5
			Switch $i
				Case 11, 13, 15, 20
					ContinueLoop 2
				Case 14
					If $j = 2 Then ContinueLoop
			EndSwitch
			If $aArray[$i][$j] Then
				$aStr = StringRegExp($sTextInput, $aArray[$i][$j] & $sPattern2, 1)
				$aArray[$i][$j] = (IsArray($aStr)) ? $aStr[0] : ''
			EndIf
			If $i = 12 Then
				$aStr = StringRegExp($aArray[$i][$j], '=\h?"(.+?)"', 3)
				$aArray[$i][$j] = (UBound($aStr) = 6) ? ($aStr[0] & ', Регион ' & $aStr[1] & _
						', ' & $aStr[2] & ', ' & $aStr[3] & ', дом № ' & $aStr[4] & ', кв. ' & $aStr[5]) : ''
			EndIf
			If $i = 14 And $aArray[$i][$j] Then $aArray[$i][$j] = 'На 31 декабря ' & $aArray[$i][$j] & ' г.'
		Next
	Next
	Return $aArray
EndFunc   ;==>_Pars



Добавлено:
Сообщение автоматически объединено:

Anna сказал(а):
Прям как в Столе Заказов.
 
Автор
A

Anna

Новичок
Сообщения
119
Репутация
2
Alofa :smile:
Ругается на строку 4
#include <Array.au3> Добавила
Код:
 (4) : ==> Incorrect number of parameters in function call.:
Local $aXMLList = _FileListToArray(@ScriptDir, '*.xml', 1, True)
Local $aXMLList = ^ ERROR
 
Автор
A

Anna

Новичок
Сообщения
119
Репутация
2
Alofa
Да, я переустанавливала.
AutoIt3 Version 3, 3, 14, 2

SciTE-Lite Version 3.5.4
Sep 18 2015 15:04:36
 
A

Alofa

Гость
Anna, только для вас :smile::
Код:
#include <Excel.au3>

Local $aXMLList = _My_FileListToArray(@ScriptDir, '*.xml')
If @error Then Exit MsgBox(4096 + 16, 'Ошибка!', 'Файлы .xml не найдены.')

Local $sFileText, $oWorkbook, $oExcel = _Excel_Open(False)
For $i = 1 To $aXMLList[0]
	$aXMLList[$i] = StringTrimRight($aXMLList[$i], 4)
	$sFileText = FileRead($aXMLList[$i] & '.xml')
	If @error Then ContinueLoop
	$oWorkbook = _Excel_BookNew($oExcel)
	_Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, _Pars($sFileText))
	_Excel_BookSaveAs($oWorkbook, $aXMLList[$i] & '.xlsx')
	_Excel_BookClose($oWorkbook)
Next
_Excel_Close($oExcel)

Func _Pars($sTextInput)
	Local $aArray[][] = [[], _
			['', '', 'Коды'], _
			['', 'ОКУД', '<Баланс ОКУД="'], _
			['', 'Период', '<Документ.+Период="'], _
			['', 'по ОКПО', '<СвНП.+ОКПО="'], _
			['', 'ИНН', '<НПЮЛ.+ИННЮЛ="'], _
			['', 'по ОКВЭД', '<СвНП ОКВЭД="'], _
			['', 'ОКОПФ', '<СвНП.+ОКОПФ="'], _
			['', 'ОКФС', '<СвНП.+ОКФС="'], _
			['', 'по ОКЕИ', '<Документ.+ОКЕИ="'], _
			['', 'Организация', '<НПЮЛ НаимОрг="'], _
			['', 'Единица измерения:', 'в тыс. Рублей'], _
			['', 'Местонахождение (адрес)', '<АдрРФ([^/>]+)'], _
			[], _
			['', 'Наименование показателя', 'Код', '<Документ.+ОтчетГод="', '<Документ.+ОтчетГод="', '<Документ.+ОтчетГод="'], _
			['', 'АКТИВ'], _
			['', 'МатВнеАкт', '<МатВнеАкт КодСтроки="', '<МатВнеАкт.+СумОтч="', '<МатВнеАкт.+СумПрдщ="', '<МатВнеАкт.+СумПрдшв="'], _
			['', 'Запасы', '<Запасы КодСтроки="', '<Запасы.+СумОтч="', '<Запасы.+СумПрдщ="', '<Запасы.+СумПрдшв="'], _
			['', 'ФинВлож', '<ФинВлож КодСтроки="', '<ФинВлож.+СумОтч="', '<ФинВлож.+СумПрдщ="', '<ФинВлож.+СумПрдшв="'], _
			['', 'БАЛАНС', '<Актив КодСтроки="', '<Актив.+СумОтч="', '<Актив.+СумПрдщ="', '<Актив.+СумПрдшв="'], _
			['', 'ПАССИВ'], _
			['', 'Капитал и резервы', '<КапРез КодСтроки="', '<КапРез.+СумОтч="', '<КапРез.+СумПрдщ="', '<КапРез.+СумПрдшв="'], _
			['', 'Краткосрочные заемные средства', '<КртЗаемСредств КодСтроки="', '<КртЗаемСредств.+СумОтч="', '<КртЗаемСредств.+СумПрдщ="', '<КртЗаемСредств.+СумПрдшв="'], _
			['', 'Кредиторская задолженность', '<КредитЗадолж КодСтроки="', '<КредитЗадолж.+СумОтч="', '<КредитЗадолж.+СумПрдщ="', '<КредитЗадолж.+СумПрдшв="'], _
			['', 'Другие краткосрочные обязательства', '<ДрКраткосрОбяз КодСтроки="', '<ДрКраткосрОбяз.+СумОтч="', '<ДрКраткосрОбяз.+СумПрдщ="', '<ДрКраткосрОбяз.+СумПрдшв="'], _
			['', 'БАЛАНС', '<Пассив КодСтроки="', '<Пассив.+СумОтч="', '<Пассив.+СумПрдщ="', '<Пассив.+СумПрдшв="']]
	Local $aStr, $sPattern2
	For $i = 2 To UBound($aArray) - 1
		$sPattern2 = ($i = 10) ? '(.+)"\hИНН' : '([^"]+)'
		For $j = 2 To 5
			Switch $i
				Case 11, 13, 15, 20
					ContinueLoop 2
				Case 14
					If $j = 2 Then ContinueLoop
			EndSwitch
			If $aArray[$i][$j] Then
				$aStr = StringRegExp($sTextInput, $aArray[$i][$j] & $sPattern2, 1)
				$aArray[$i][$j] = (IsArray($aStr)) ? $aStr[0] : ''
			EndIf
			If $i = 12 Then
				$aStr = StringRegExp($aArray[$i][$j], '=\h?"(.+?)"', 3)
				$aArray[$i][$j] = (UBound($aStr) = 6) ? ($aStr[0] & ', Регион ' & $aStr[1] & _
						', ' & $aStr[2] & ', ' & $aStr[3] & ', дом № ' & $aStr[4] & ', кв. ' & $aStr[5]) : ''
			EndIf
			If $i = 14 And $aArray[$i][$j] Then $aArray[$i][$j] = 'На 31 декабря ' & $aArray[$i][$j] & ' г.'
		Next
	Next
	Return $aArray
EndFunc   ;==>_Pars

Func _My_FileListToArray($sFilePath, $sFilter = "*")
	Local $sDelimiter = "|", $sFileList = "", $sFileName = ""
	$sFilePath = StringRegExpReplace($sFilePath, "[\\/]+$", "") & "\"
	If $sFilter = Default Then $sFilter = "*"

	If Not FileExists($sFilePath) Then Return SetError(1, 0, 0)
	If StringRegExp($sFilter, "[\\/:><\|]|(?s)^\s*$") Then Return SetError(2, 0, 0)
	Local $hSearch = FileFindFirstFile($sFilePath & $sFilter)
	If @error Then Return SetError(4, 0, 0)
	While 1
		$sFileName = FileFindNextFile($hSearch)
		If @error Then ExitLoop
		If @extended Then ContinueLoop
		$sFileList &= $sDelimiter & $sFilePath & $sFileName
	WEnd
	FileClose($hSearch)
	If $sFileList = "" Then Return SetError(4, 0, 0)
	Return StringSplit(StringTrimLeft($sFileList, 1), $sDelimiter)
EndFunc   ;==>_My_FileListToArray
 
Автор
A

Anna

Новичок
Сообщения
119
Репутация
2
Alofa
Мерси :smile:
Что - же делать с этим несчастным &quot
В строке
Организация ООО &quot;ДальТрансСервис&quot;
Мешает
 
Верх