1

我的目标是填写 LibreOffice 计算表,并在用户单击发送按钮(并再次确认)时通过电子邮件静默发送单元格范围。

所以这有三个部分。

  • 带有确认请求的按钮。(简单易行。)
  • 选择 Cell Range 并转成富文本格式(还没找到)
  • 从工作表中发送富文本电子邮件。(稍后将解决“沉默”部分)

我尝试使用 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?

4

1 回答 1

0

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

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

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

另一种方法是将电子表格写入临时 HTML 或 XHTML 文件。然后解析临时文件以获取电子邮件所需的部分。

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

编辑

关于XTransferable的好主意。以下从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 足够强大,可以轻松处理字节字符串。

于 2017-11-14T15:05:51.043 回答