LibreOffice Basic宏命令将Calc cellRange转换为RTF / HTML

时间:2017-11-14 10:20:35

标签: html rtf libreoffice libreoffice-calc libreoffice-basic

我的目标是填写LibreOffice计算表,并在用户点击发送按钮时静默发送一个单元格区域(并再次确认)。

所以这有三个部分。

  • 带有确认请求的按钮。 (轻松完成。)
  • 选择单元格区域并将其转换为富文本格式(尚未找到)
  • 从工作表中发送富文本电子邮件。 (稍后将处理“沉默”部分)

我尝试使用unoService将范围复制到剪贴板,但它似乎过于复杂且充满了错误。

这就是我所拥有的:

''''Send by e-mail enriched text

Sub Main
    Dim Doc, Sheet, Range, Rtf, Exec as Object
End Sub

'Confirm it
Sub SendTableApproval
    If MsgBox ("Ready to email?", MB_YESNO + MB_DEFBUTTON2) = IDYES Then
        CopyTable()
    End If
End Sub

'Copy it
Sub CopyTable
    Doc = ThisComponent
    View = Doc.CurrentController
    Frame = View.Frame
    Sheet = Doc.Sheets.getByIndex(0)
    Range = Sheet.getCellrangeByName("a1:f45")
    Exec = createUnoService("com.sun.star.frame.DispatchHelper")

    View.Select(Range)
    Cells = View.getTransferable()
    Exec.executeDispatch(Frame, ".uno:Deselect", "", 0, array())   
    'SimpleMailTo(Cells)
End Sub

'Mail it
Sub SimpleMailTo(body)
    Dim launcher as object
    Dim eAddress, eSubject, eBody, aHTMLanchor as string
    launcher = CreateUnoService("com.sun.star.system.SystemShellExecute")
    eAddress = "tu@domo.eg"
    eSubject = "Cotidie agenda futuendane"
    eBody = body
    aHTMLanchor = "mailto:" & eAddress & "?subject=" & eSubject & "&&body=" & eBody
    launcher.execute(aHTMLanchor, "", 0)
End Sub

在对方法,属性,uno进行了三天的研究后,我仍然不知道。

我的问题是,简单地说,如何将可转移内容转换为HTML / RTF?

1 个答案:

答案 0 :(得分:0)

只需复制并粘贴到电子邮件中即可生成您要求的结果。 LibreOffice方面的代码应如下所示。

dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())

听起来你已经尝试过了,但是有些东西没有用。也许你可以详细说明出了什么问题。

另一种方法是write the spreadsheet到临时HTML或XHTML文件。然后解析临时文件以获取电子邮件所需的部分。

AFAIK没有这样的命令可以使用UNO将单元格区域转换为富文本格式。要这样做,您需要遍历每个单元格的每个text range,读取其格式属性,然后自己生成HTML。

修改

关于XTransferable的好主意。以下从the DevGuide改编的Java代码获取HTML字符串,然后将其打印出来。我相信这对您的需求是一个很好的解决方案。

public void displayHTMLFromClipboard()
{
    try
    {
        Object oClipboard = xMCF.createInstanceWithContext(
            "com.sun.star.datatransfer.clipboard.SystemClipboard", xContext);
        XClipboard xClipboard = (XClipboard)
            UnoRuntime.queryInterface(XClipboard.class, oClipboard);
        XTransferable xTransferable = xClipboard.getContents();
        DataFlavor[] aDflvArr = xTransferable.getTransferDataFlavors();
        System.out.println("Available clipboard formats:");
        DataFlavor aChosenFlv = null;
        for (int i=0;i<aDflvArr.length;i++)
        {
            System.out.println(
                "MimeType: " + aDflvArr[i].MimeType +
                " HumanPresentableName: " + aDflvArr[i].HumanPresentableName );
            if (aDflvArr[i].MimeType.equals("text/html"))
            {
                aChosenFlv = aDflvArr[i];
            }
        }
        System.out.println("");
        try
        {
            if (aChosenFlv != null)
            {
                System.out.println("HTML text on the clipboard...");
                Object aData = xTransferable.getTransferData(aChosenFlv);
                String s = new String((byte[])aData, Charset.forName("ISO-8859-1"));
                System.out.println(s);
            }
        }
        catch (UnsupportedFlavorException exc)
        {
            exc.printStackTrace();
        }
    }
    catch(com.sun.star.uno.Exception exc)
    {
        exc.printStackTrace();
    }
}

如果您打算使用Basic,那么对转换字节的正确方法进行一些研究可能是个好主意。我下面的代码似乎工作,但可能不可靠和不安全,并不适用于许多语言。我最初的一些尝试在此之前崩溃了。

Sub DisplayClipboardData
    oClipboard = createUnoService("com.sun.star.datatransfer.clipboard.SystemClipboard")
    xTransferable = oClipboard.getContents()
    aDflvArr = xTransferable.getTransferDataFlavors()
    For i = LBound(aDflvArr) To UBound(aDflvArr)
        If aDflvArr(i).MimeType = "text/html" Then
            Dim aData() As Byte
            aData = xTransferable.getTransferData(aDflvArr(i))
            Dim s As String
            For j = LBound(aData) to UBound(aData)
                s = s & Chr(aData(j))  'XXX: Probably a bad way to do this!
            Next j
            Print(s)
        End If
    Next
End Sub

还有一个建议:Python可能是更好的语言选择。在许多方面,使用Python和LibreOffice比Java更容易。与Basic不同,Python功能强大,可以轻松处理字节字符串。