Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

21 Сентябрь 2018, 07:15 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Доступно и просто о работе в офисных пакетах
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Xml в CALC  (Прочитано 809 раз)
0 Пользователей и 1 Гость смотрят эту тему.
pfantom
Участник
**
Offline Offline

Сообщений: 17


« Стартовое сообщение: 6 Март 2018, 11:22 »

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

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


« Последнее редактирование: 6 Март 2018, 11:46 от pfantom » Записан
Bigor
Опытный пользователь
***
Offline Offline

Пол: Мужской
Сообщений: 306


« Ответ #1: 6 Март 2018, 11:36 »

Делал, но просто открывал xml  как текст и построчно читал, так что вариант тормозной Улыбка
Записан
pfantom
Участник
**
Offline Offline

Сообщений: 17


« Ответ #2: 6 Март 2018, 11:40 »

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

скинь гляну плз
Записан
Bigor
Опытный пользователь
***
Offline Offline

Пол: Мужской
Сообщений: 306


« Ответ #3: 6 Март 2018, 11:52 »

Писал на 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

« Последнее редактирование: 6 Март 2018, 12:10 от Bigor » Записан
Bigor
Опытный пользователь
***
Offline Offline

Пол: Мужской
Сообщений: 306


« Ответ #4: 6 Март 2018, 12:52 »

Нашел еще посвежее Улыбка и на 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
Записан
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!