[英]LibreOffice Basic Macro command converting Calc cellRange to RTF/HTML
我的目標是填寫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
經過三天的方法,屬性研究,我仍然不知道。
我的問題是,簡單地說, 如何將可傳輸的內容轉換為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.