簡體   English   中英

LibreOffice Basic Macro命令將calc cellRange轉換為RTF / HTML

[英]LibreOffice Basic Macro command converting Calc cellRange to RTF/HTML

我的目標是填寫LibreOffice計算表,並在用戶單擊“發送”按鈕時再次通過電子郵件以靜默方式發送單元格區域(並再次確認)。

因此,這包括三個部分。

  • 帶有確認請求的按鈕。 (容易完成)
  • 選擇“單元格范圍”並將其轉換為RTF格式(尚未找到)
  • 從工作表中發送富文本電子郵件。 (稍后將解決“靜音”部分)

我嘗試使用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

經過三天的方法,屬性研究,我仍然不知道。

我的問題是,簡單地說, 如何將可傳輸的內容轉換為HTML / RTF?

只需將其復制並粘貼到電子郵件中即可得到您想要的結果。 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的功能足以輕松處理字節字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM