我的目标是填写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?
答案 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功能强大,可以轻松处理字节字符串。