Xml в CALC

Автор pfantom, 6 марта 2018, 11:22

0 Пользователи и 1 гость просматривают эту тему.

pfantom

Здрасте всем.  Полазел быстро по форуму не нашел нужного. Вообщем есть папка в ней лежат XML. Xml файлы формируються через программу. Задача в следующем открыть все файлы из папки(можно указывать путь а могут люди и ложить в определеную папку), взять их из файла данные( но не все) и загрузить в таблицу.
Если кто-то подобное делал скиньте пожалуйста. По мере прогресса буду писать.

один фаил одна строка в calc
в идеале ещё будет шаблон с шапкой  и низом
который будет считать кое чего и данных загруженых в отчет



bigor

Делал, но просто открывал xml  как текст и построчно читал, так что вариант тормозной :)
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

pfantom

там из 100 строк нужно всего 4

скинь гляну плз

bigor

#3
Писал на vbs

Код немного почистил :) , но смысл понятен должен быть.
Как считываем последние нужные данные из файла  flag=false

Set ServiceManager = CreateObject("com.sun.star.ServiceManager")
Set Desktop = ServiceManager.createInstance("com.sun.star.frame.Desktop")
Dim Param(1)
Set Param(0) = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
Set Param(1) = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")

Dim oFile
Dim fso, oFiles, oFolder          
Set fso = CreateObject("Scripting.FileSystemObject")
path_ = GetPath()  'задаем текущую папку
'msgbox path_


path_u = dos2unix(path_ ,"\\" ,"/" )&"/" ' конвертируем путь в формат ООО


Set oFolder = fso.GetFolder(path_)  
Set oFiles = oFolder.Files        
For Each oFile In oFiles          
   if Right(oFile.Name,3)="XML" Or Right(oFile.Name,3)="xml" then  
'outFileName = Left(oFile.Name,len(oFile.Name)-3)
inF = oFile.Name ' имя файла сведений
fileIn = path_ & inF     ' полные имена файлов.
'MsgBox fileIn

' Открываем и читаем файл построчно
Set oFileIn1 = fso.OpenTextFile(fileIn)    
flag=true 'флаг


Do While Not (oFileIn1.atEndOfStream) And flag 'перебираем все строки до конца
' или пока флаг истин

    Text = oFileIn1.ReadLine             ' читаем строку. И ищем нужные данные

If left(replace(Text," ",""),29)="<ххххххххххх>011-011" Or  left(replace(Text," ",""),29)="<ххххххххххх>011-011" Then
RegN = mid (Text,instr(1, Text, ">")+1, instr(1,Text,"</")-instr(1, Text, ">")-1)
end if
If left(replace(Text," ",""),5)="<ИНН>" Or  left(replace(Text," ",""),5)="<ИНН>" Then
INN = mid (Text,instr(1, Text, ">")+1, instr(1,Text,"</")-instr(1, Text, ">")-1)
end if

loop
' открываем файл шаблона
Param(0).Name = "Hidden" ' делаем все скрытно :)
Param(0).Value = true
Param(1).Name = "Hidden"
Param(1).Value = true


Set Document = Desktop.LoadComponentFromURL("file:///"&path_u&"shablon.odt", "_blank", 0, Param)

set oBookMark = Document.getBookmarks().getByName("RegN")
oBookMark.getAnchor.setString(RegN)

set oBookMark = Document.getBookmarks().getByName("INN")
oBookMark.getAnchor.setString(INN)

Fnout = "test1." & rf
' сохраняем шаблон как текстовый документ в кодировке 1251
Param(0).Name = "FilterName"
Param(0).Value = "Text (encoded)"
Param(1).Name = "FilterOptions"
Param(1).Value = "MS_1251,CRLF,Courier New,ru-RU,"
           

Document.storeToURL "file:///"&path_u& "out/" &Fnout, Param
Document.close True ' закрываем шаблон
' сбрасываем переменные

RegN=""
INN=""



End IF
Next

msgbox   "Отработал. "


Function dos2unix(txt, expr1, expr2) ' функция конвертирования путей
   ' Замена строк
   Dim oReg

   Set oReg = New RegExp        ' Открываем регулярные выражения.
   oReg.Global = True           ' меняем все
   oReg.IgnoreCase = True       ' игнорируем регистр

   ' Replace all expr1 with expr2.
   oReg.Pattern = expr1          ' что меняем.
   dos2unix = oReg.Replace(txt, expr2)
End Function

Function GetPath
   ' Получаем путь к сценарию
   Dim path
   path = WScript.ScriptFullName  ' Имя скрипта
   GetPath = Left(path, InStrRev(path, "\"))
End Function

Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

bigor

Нашел еще посвежее :) и на starbasic
sub FindFile
Dim sFileName As String             'Last name returned from DIR
  Dim i As Integer                    'Count number of dirs and files
  Dim sPath
  Dim args(0) as new com.sun.star.beans.PropertyValue
  url =  "c:\app\szv62txt"
  doc = StarDesktop.LoadComponentFromURL(ConverttoURL(url & "\tabl.odt"), "_blank", 0, args())
 
                            'Current path with path separator at end
  sPath =url & "\szv6" & GetPathSeparator()   'With no separator, DIR returns the
  sFileName = Dir(sPath, 0)             'directory rather than what it contains
  i = 0                               'Initialize the variable
  Do While (sFileName <> "")          'While something returned
                                      'Count the directories
           

args(0).Name = "FilterName"
args(0).Value = "Text"

doc1 = StarDesktop.LoadComponentFromURL(ConverttoURL(url  & "\szv6\" & sFileName), "_blank", 0, args())


Dim oDescriptor 'описатель поиска
Dim oFound 'найденный диапазон
oDescriptor = doc1.createSearchDescriptor()
With oDescriptor
. SearchString ="<Количество>.*</Количество>" 
. SearchRegularExpression = True
. SearchCaseSensitive = False 'Тек установка одного в False - избыточна
End With

oFound = doc1. findFirst(oDescriptor)
Do While Not IsNull (oFound)

oFound = ThisComponent. findNext(oFound. End, oDescriptor)
if Not IsNull (oFound) then Kol = mid(oFound. getString(),InStr(oFound. getString(),">")+1,InStr(oFound. getString(),"</")-InStr(oFound. getString(),">")-1)
Loop



REM Позволим документу создать текстовую таблицу.
Kol = val(Kol)+2

oTable = doc.createInstance("com.sun.star.text.TextTable")
oTable.initialize(kol, 5) 'количество строк и 3 столбца
oInsertPoint = doc.Text. getEnd()
oInsertPoint.getText().insertTextContent(oInsertPoint , oTable, False)

  With oDescriptor
. SearchString ="<Название>.*</Название>" 
. SearchRegularExpression = True
. SearchCaseSensitive = False 'Тек установка одного в False - избыточна
End With

oFound = doc1. findFirst(oDescriptor)
if Not IsNull (oFound) then Per = mid(oFound. getString(),InStr(oFound. getString(),">")+1,InStr(oFound. getString(),"</")-InStr(oFound. getString(),">")-1)
' Print per
oTable.getCellByPosition(1,0).setString(Per)
Per=""

  With oDescriptor
. SearchString ="<Квартал>.*</Квартал>" 
. SearchRegularExpression = True
. SearchCaseSensitive = False 'Тек установка одного в False - избыточна
End With

oFound = doc1. findFirst(oDescriptor)
if Not IsNull (oFound) then Per = mid(oFound. getString(),InStr(oFound. getString(),">")+1,InStr(oFound. getString(),"</")-InStr(oFound. getString(),">")-1)
' Print per
oTable.getCellByPosition(2,0).setString(Per)
  Per=""

  With oDescriptor
. SearchString ="<Год>.*</Год>" 
. SearchRegularExpression = True
. SearchCaseSensitive = False 'Тек установка одного в False - избыточна
End With

oFound = doc1. findFirst(oDescriptor)
if Not IsNull (oFound) then Per = mid(oFound. getString(),InStr(oFound. getString(),">")+1,InStr(oFound. getString(),"</")-InStr(oFound. getString(),">")-1)
' Print per
oTable.getCellByPosition(3,0).setString(Per)
  Per=""

  With oDescriptor
. SearchString ="<РегистрационныйНомер>.*</РегистрационныйНомер>" 
. SearchRegularExpression = True
. SearchCaseSensitive = False 'Тек установка одного в False - избыточна
End With

oFound = doc1. findFirst(oDescriptor)
if Not IsNull (oFound) then Per = mid(oFound. getString(),InStr(oFound. getString(),">")+1,InStr(oFound. getString(),"</")-InStr(oFound. getString(),">")-1)
' Print per
oTable.getCellByPosition(0,0).setString(Per)
  Per=""


  With oDescriptor
. SearchString ="<СтраховойНомер>.*</СтраховойНомер>"
. SearchRegularExpression = True
. SearchCaseSensitive = False 'Тек установка одного в False - избыточна
End With
oFound = doc1. findFirst(oDescriptor)
i=1
If not IsNull (oFound) then SNILS = mid(oFound. getString(),InStr(oFound. getString(),">")+1,InStr(oFound. getString(),"</")-InStr(oFound. getString(),">")-1)
oTable.getCellByPosition(1, i).setString(SNILS)
Do
i=i+1
oFound = ThisComponent. findNext(oFound. End, oDescriptor)
if IsNull (oFound) Then Exit Do
SNILS = mid(oFound. getString(),InStr(oFound. getString(),">")+1,InStr(oFound. getString(),"</")-InStr(oFound. getString(),">")-1)
oTable.getCellByPosition(1, i).setString(SNILS)

Loop  While Not IsNull (oFound)

With oDescriptor
. SearchString ="<Фамилия>.*</Фамилия>"
. SearchRegularExpression = True
. SearchCaseSensitive = False 'Тек установка одного в False - избыточна
End With
i=1
oFound = doc1. findFirst(oDescriptor)
if Not IsNull (oFound) then SNILS = mid(oFound. getString(),InStr(oFound. getString(),">")+1,InStr(oFound. getString(),"</")-InStr(oFound. getString(),">")-1)
oTable.getCellByPosition(2, i).setString(SNILS)

Do
i=i+1
oFound = ThisComponent. findNext(oFound. End, oDescriptor)
if  IsNull (oFound) then Exit Do
SNILS = mid(oFound. getString(),InStr(oFound. getString(),">")+1,InStr(oFound. getString(),"</")-InStr(oFound. getString(),">")-1)
oTable.getCellByPosition(2, i).setString(SNILS)

Loop  While Not IsNull (oFound)

With oDescriptor
. SearchString ="<Имя>.*</Имя>"
. SearchRegularExpression = True
. SearchCaseSensitive = False 'Тек установка одного в False - избыточна
End With
i=1
oFound = doc1. findFirst(oDescriptor)
if Not IsNull (oFound) then SNILS = mid(oFound. getString(),InStr(oFound. getString(),">")+1,InStr(oFound. getString(),"</")-InStr(oFound. getString(),">")-1)
oTable.getCellByPosition(3, i).setString(SNILS)

Do
i=i+1
oFound = ThisComponent. findNext(oFound. End, oDescriptor)
if IsNull (oFound) Then Exit Do
  SNILS = mid(oFound. getString(),InStr(oFound. getString(),">")+1,InStr(oFound. getString(),"</")-InStr(oFound. getString(),">")-1)
oTable.getCellByPosition(3, i).setString(SNILS)

Loop  While Not IsNull (oFound)


  With oDescriptor
. SearchString ="<Отчество>.*</Отчество>"
. SearchRegularExpression = True
. SearchCaseSensitive = False 'Тек установка одного в False - избыточна
End With
i=1
oFound = doc1. findFirst(oDescriptor)
if Not IsNull (oFound) then SNILS = mid(oFound. getString(),InStr(oFound. getString(),">")+1,InStr(oFound. getString(),"</")-InStr(oFound. getString(),">")-1)
oTable.getCellByPosition(4, i).setString(SNILS)
oTable.getCellByPosition(0, i).setString(i)
Do
i=i+1
oFound = ThisComponent. findNext(oFound. End, oDescriptor)
if IsNull (oFound) Then Exit Do
SNILS = mid(oFound. getString(),InStr(oFound. getString(),">")+1,InStr(oFound. getString(),"</")-InStr(oFound. getString(),">")-1)
oTable.getCellByPosition(4, i).setString(SNILS)
oTable.getCellByPosition(0, i).setString(i)

Loop  While Not IsNull (oFound)
doc1.close (true)

sFileName = Dir()                 'Get the next directory name
  Loop
End Sub
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут