Lotus + Openoffce На Linux И Win

Тема в разделе "Lotus - Программирование", создана пользователем RixPvl, 6 янв 2012.

Наш партнер Genesis Hackspace
  1. RixPvl

    RixPvl Well-Known Member

    Регистрация:
    30 ноя 2011
    Сообщения:
    85
    Симпатии:
    0
    В общем, необходимо написать CLASS по работе с OpenOffice(OO) для формирования отчета на стороне сервера, я уже начал писать и написал пока для Win, но хотелось бы сделать его кросс платформенным. В общем нужна Ваша помощь в его написании :lovecodeby:
    Вот то что я уже написал
    Код (LotusScript):
    %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 сори, за дубликаты, что то какая ошибка вылезла при создании поста
     
  2. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    эээ, кагдбэ CreateObject function - CreateObject is not supported under OS/2 or UNIX

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

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

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


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

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

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

    КОНЕЦ ( константа )
     
  3. RixPvl

    RixPvl Well-Known Member

    Регистрация:
    30 ноя 2011
    Сообщения:
    85
    Симпатии:
    0
    Курил, но ни как не могу выкурить :(

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

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

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    ну так конвертните готовый шалон в XML - 3 секунды займёт
     
  5. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.120
    Симпатии:
    301
    http://codeby.net/forum/threads/41201.html?pi...mp;#entry210192
    форматирования не делал (точилась, в основном, под загрузку)
    выгрузка сделана для хехеля и csv
    есть и др. либы для хехеля, например http://www.andykhan.com/jexcelapi/tutorial.html
    если цель - получение отчёта, лучше использовать ПДФ, либа для универсального метода - jasperreports
    там получаем хмл, а на выходе хоть хехель, хоть ворд, хоть ПДФ
     
  6. RixPvl

    RixPvl Well-Known Member

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

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.120
    Симпатии:
    301
    то что я описал выше выполняется на любой платформе, где есть домина
    при том - не нужно устанавливать никакого офиса и прочего, соответ. либы выложить в jvm/lib/ext
    либы все фришные, мало того - ОСС
    никакой винды никаких офисов... :)
     
  8. rinsk

    rinsk Well-Known Member
    Lotus team

    Регистрация:
    12 ноя 2009
    Сообщения:
    815
    Симпатии:
    79
    Дак вроде уже есть готовый класс для работ с ODF или чего то не понял? http://www.ibm.com/developerworks/ru/libra...mphony-toolkit/
     
  9. akat

    akat Well-Known Member
    Lotus team

    Регистрация:
    16 июн 2010
    Сообщения:
    243
    Симпатии:
    7
    >Дак вроде уже есть готовый класс для работ с ODF или чего то не понял?
    Оно работает только на клиенте и начиная с 8.5.1
     
  10. rinsk

    rinsk Well-Known Member
    Lotus team

    Регистрация:
    12 ноя 2009
    Сообщения:
    815
    Симпатии:
    79
    8.5.1 - это понятно. Где есть указание что только на клиенте?
     
  11. rinsk

    rinsk Well-Known Member
    Lotus team

    Регистрация:
    12 ноя 2009
    Сообщения:
    815
    Симпатии:
    79
    Нашел: http://www-03.ibm.com/software/lotus/symph...0E002C906D?Open
    если не поправили в 8.5.3 то эт печально...
     
  12. akat

    akat Well-Known Member
    Lotus team

    Регистрация:
    16 июн 2010
    Сообщения:
    243
    Симпатии:
    7
    >8.5.1 - это понятно. Где есть указание что только на клиенте?
    Имхо, всеже с 8.5.2.
    Симфони ставится в комплекте с LN а не с Domino. Соответственно и использовани классов возможно в клиенте, а не на сервере.
     
Загрузка...

Поделиться этой страницей