• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Lotus + Openoffce На Linux И Win

  • Автор темы RixPvl
  • Дата начала
R

RixPvl

В общем, необходимо написать CLASS по работе с OpenOffice(OO) для формирования отчета на стороне сервера, я уже начал писать и написал пока для Win, но хотелось бы сделать его кросс платформенным. В общем нужна Ваша помощь в его написании :lovecodeby:
Вот то что я уже написал
Код:
%REM
Class Name: Open Office Calc
Created: 29.12.2011
%END REM
Public Class OO_Calc
Private Obj As Variant
Private ObjServiceManager As Variant
Private ObjCoreReflection As Variant
Private ObjDesktop As Variant
Private Sheet As Variant
Private RangeObj As Variant
Private Session As NotesSession
Private NoArgs() As Variant
Private pLastError As String
Private pLastErrorLine As Integer
Private pLastErrorCode As Integer

Public Property Set Value(Pos As String) As String
Call SetValue(Pos, Value)
End Property	

Public Property Get LastError As Variant
LastError = pLastError	
End Property	

Public Property Get LastErrorCode As Variant
LastErrorCode = pLastErrorCode	
End Property	

Public Property Get LastErrorLine As Variant
pLastErrorLine = pLastErrorLine	
End Property	

Public Property Get Range As Variant
Set Range = RangeObj	
End Property	

' Create Object's
Public Sub New()
On Error GoTo ERRLINE
Set Session = New NotesSession
Set ObjServiceManager = CreateObject("com.sun.star.ServiceManager")
Set ObjCoreReflection = objServiceManager.createInstance("com.sun.star.reflection.CoreReflection")
Set ObjDesktop = objServiceManager.createInstance("com.sun.star.frame.Desktop")

Set Obj = objDesktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, NoArgs)

End If

EXT_:
Exit Sub
ERRLINE:
pLastError = Error$
pLastErrorLine = Erl
pLastErrorCode = Err
MsgBox "Ошибка: " & Error$ & " line: " & Erl,16,"Class: Open Office Calc"
Resume EXT_
End Sub

Public Function Sheets(index) As Variant
On Error GoTo ERRLINE
Dim Res(1) As String

If IsNumeric(Index) Then
Set Sheet = Obj.getSheets().getByIndex(Index)
Else
Set Sheet = Obj.getSheets().getByName(Index)
End If

Res(0) = "1"
Res(1) = ""
EXT_:
SetSheets = Res
Exit Function
ERRLINE:
Res(0) = "0"
Res(1) = "SetSheets - Code: " & CStr(Err) & " Text: " & Error$ & " Line: " & CStr(Erl)
Print Res(1)
pLastError = Error$
pLastErrorLine = Erl
pLastErrorCode = Err
Resume EXT_
End Function

' convert To URL For WIN
Private Function ConvertToUrl(strFile) As String
strFile = Replace(strFile, "\", "/")
strFile = Replace(strFile, ":", "|")
strFile = Replace(strFile, " ", "%20")
strFile = "file:///" + strFile
ConvertToUrl = strFile
End Function

'Save Doc
Public Function Save(Path) As Boolean
On Error GoTo err_
Dim aNoArgs()
If Path = "" Then
Path = "C:\" & CStr(Date)
Path = Replace(Path, ".", "_")
Path = Path + ".ods"
End If
Call Obj.storeToURL(ConvertToUrl(Path), aNoArgs)
Save = True
ext_:
Exit Function
err_:
Save = False
pLastError = Error$
pLastErrorLine = Erl
pLastErrorCode = Err
Resume ext_
End Function

' SetValue
Private Sub SetValue(Pos, Value As String) 
On Error Resume Next
Dim xy
If CStr(Pos)="" Then Error 5000, {Param 'Range' is empty}
xy = Split(Pos, ":")
If UBound(xy) <> 1 Then	Error 5001, {Param 'Range' is error}

ForAll x In xy
If Not IsNumeric(x) Then Error 5002, {Param 'Range' is not numeric: } & x
End ForAll

If Sheet Is Nothing Then Error 5003, {Param 'Sheet' is nothing}
Call Sheet.getCellByPosition(xy(0), xy(1)).setString(Value)
Exit sub
ERRLINE:
Print "SetValue - Code: " & CStr(Err) & " Text: " & Error$ & " Line: " & CStr(Erl)
pLastError = Error$
pLastErrorLine = Erl
pLastErrorCode = Err
Resume Next
End Sub

' Select Range
Public Sub SetRange(Pos)
On Error Resume Next
fPos = Split(Pos, ":")
Set RangeObj = Sheet.getCellRangeByPosition(fPos(0), fPos(1), fPos(2), fPos(3))
End Sub

' Border Line
Public Function CellBorderLine(nColor, nInnerLineWidth, nOuterLineWidth, nLineDistance) As Variant
On Error GoTo ERRLINE
Dim oSM As Variant
Dim oBorderLine As Variant
Set oSM = CreateObject("com.sun.star.ServiceManager")
Set oBorderLine = oSM.Bridge_GetStruct("com.sun.star.table.BorderLine")

With oBorderLine
.Color = nColor
.InnerLineWidth = nInnerLineWidth
.OuterLineWidth = nOuterLineWidth
.LineDistance = nLineDistance
End With

Set CellBorderLine = oBorderLine

ERRLINE:
Print "CellBorderLine - Code: " & CStr(Err) & " Text: " & Error$ & " Line: " & CStr(Erl)
pLastError = Error$
pLastErrorLine = Erl
pLastErrorCode = Err
Resume Next
End Function

' All Border Make
Public Sub Border(nColor, nInnerLineWidth, nOuterLineWidth, nLineDistance)
Set RangeObj.TopBorder 		= CellBorderLine(nColor, nInnerLineWidth, nOuterLineWidth, nLineDistance)
Set RangeObj.RightBorder 	= CellBorderLine(nColor, nInnerLineWidth, nOuterLineWidth, nLineDistance)
Set RangeObj.LeftBorder 	= CellBorderLine(nColor, nInnerLineWidth, nOuterLineWidth, nLineDistance)
Set RangeObj.BottomBorder 	= CellBorderLine(nColor, nInnerLineWidth, nOuterLineWidth, nLineDistance)
End Sub

Private Function MakePropertyValue(cName, uValue) As Variant
On Error GoTo ERRLINE
Dim oPropertyValue As Variant
Dim oSM As Variant
Dim Res(1) As String

Set oPropertyValue = ObjServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
oPropertyValue.Name = cName
oPropertyValue.Value = uValue
Set MakePropertyValue = oPropertyValue
Res(0) = "1"
Res(1) = ""
EXT_:
MakePropertyValue = Res
Exit Function
ERRLINE:
Res(0) = "0"
Res(1) = "MakePropertyValue - Code: " & CStr(Err) & " Text: " & Error$ & " Line: " & CStr(Erl)
Print Res(1)
pLastError = Error$
pLastErrorLine = Erl
pLastErrorCode = Err
Resume EXT_
End Function
End Class

PS сори, за дубликаты, что то какая ошибка вылезла при создании поста
 
M

morpheus

хотелось бы сделать его кросс платформенным.

эээ, кагдбэ CreateObject function - CreateObject is not supported under OS/2 or UNIX

Думаю крутить надо начинать

Добавлено: Если скрипт будет выполняться на стороне сервера, то может легче формировать XML документ (работать как с текстовым файлом).

например взять готовый шаблон Эксель/Калк файла, сохранить его аки XML, выбрать заголовочные теги и закрывающие теги, а посередине писать уже вывод инормации


на пальцах структура файла будет:

ШАПКА ( константа )

мои 300 строк отчета

КОНЕЦ ( константа )
 
R

RixPvl

Курил, но ни как не могу выкурить :(

Добавлено: Точно, но все же хотел бы довести этот класс до ума :lovecodeby:

Добавлено: Ну а так же существует момент такой, что нужно составить отчет по шаблону, то есть нужно открыть шаблон екселя и вбивать туда данные. как бы с этим?
 
M

morpheus

Добавлено: Ну а так же существует момент такой, что нужно составить отчет по шаблону, то есть нужно открыть шаблон екселя и вбивать туда данные. как бы с этим?
ну так конвертните готовый шалон в XML - 3 секунды займёт
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
215
https://codeby.net/threads/41201.html?pi...mp;#entry210192
форматирования не делал (точилась, в основном, под загрузку)
выгрузка сделана для хехеля и csv
есть и др. либы для хехеля, например
если цель - получение отчёта, лучше использовать ПДФ, либа для универсального метода - jasperreports
там получаем хмл, а на выходе хоть хехель, хоть ворд, хоть ПДФ
 
R

RixPvl

Видите ли мне нужно составлять отчет на стороне сервера используя лицензионное ПО, ОпенОфис один из бесплатных, использовать продукты MS запретили. Да и ОО крос платформенный. Вот в общем идея использовать XML я как понимаю удобно для статичного отчета, с конкретной формой, а мне нужно вот что
действия на стороне клиента:
Пользователь выбрал отчет, задал форму, указал поля и запустил.
действия на стороне сервера:
Сервер автоматический запускает отчет, берет указанный шаблон подставляет туда данные сохраняет и высылает пользователю на почту.
С тем классом то что я ранее написал, это получается но только на платформе NT, а теперь мне нужно сделать его и для UNIX(Linux) вот и все...
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
215
то что я описал выше выполняется на любой платформе, где есть домина
при том - не нужно устанавливать никакого офиса и прочего, соответ. либы выложить в jvm/lib/ext
либы все фришные, мало того - ОСС
никакой винды никаких офисов... :)
 
A

akat

>Дак вроде уже есть готовый класс для работ с ODF или чего то не понял?
Оно работает только на клиенте и начиная с 8.5.1
 
A

akat

>8.5.1 - это понятно. Где есть указание что только на клиенте?
Имхо, всеже с 8.5.2.
Симфони ставится в комплекте с LN а не с Domino. Соответственно и использовани классов возможно в клиенте, а не на сервере.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!