3

我有一个CellTable使用某种复杂而乏味的过程填充的 GWT。我希望用户能够打印或导出该表中的数据。

我宁愿不重新渲染表格内容以进行导出,因为这是一个乏味的过程。

如何从我的所有页面中获取所有行的内容,CellTable以便将文档放在一起进行打印或导出?

我可以使用一种获取表格的实际 HTML 的方法,或者一种用于迭代并从单元格中获取呈现内容的算法。如果有人有更好的建议,那也将不胜感激。

4

4 回答 4

1

似乎没有可行的方法可以在CellTable不重新渲染内容的情况下给我导出数据。由于这将花费与自己执行相同的执行时间,因此我求助于自己渲染它。我使用以下代码呈现 HTML 并将其显示在新的弹出窗口中以进行打印。print()从我的打印按钮调用该方法。

/**
 * Print in a new popup.
 * http://www.coderanch.com/t/564198/GWT/GWT-injecting-HTML-text-browser
 */
public static native void printHTMLString(String htmlString)/*-{
    var win = $wnd.open("_blank", "Print", "");
    win.document.open("text/html", "replace");
    win.document.write("<html><head></head><body>" + htmlString + "</body></html>");
    win.document.close();
    win.focus();
    var headID = win.document.getElementsByTagName("head")[0];
    var fileref = win.document.createElement("link");
    fileref.setAttribute("rel", "stylesheet");
    fileref.setAttribute("type", "text/css");
    fileref.setAttribute("href", "tables-min.css");
    headID.appendChild(fileref);
    win.print();
}-*/;

private void print() {
    //get the list from the ColumnSortHandler, so it keeps the sorting on the screen
    if (columnSortHandler.getList() == null || columnSortHandler.getList().isEmpty()) {
        Window.alert("Nothing to print");
        return;
    }

    SafeHtmlBuilder b = new SafeHtmlBuilder();
    b.appendHtmlConstant("<table class=\"pure-table\">"
            + "<thead><tr><th>Timestamp</th><th>Type</th><th>User</th>"
            + "<th>Screen</th><th>Client</th></tr></thead>");
    int count = 1;
    for (Record r : columnSortHandler.getList()) {
        b.appendHtmlConstant("<tr" + (count%2==0 ? ">" : " class='pure-table-odd'>"));

        b.appendHtmlConstant("<td>");
        b.appendEscaped(timestampFormat.format(timeStampColumn.getValue(r)));
        b.appendHtmlConstant("</td>");

        b.appendHtmlConstant("<td>");
        b.appendEscaped(typeColumn.getValue(r));
        b.appendHtmlConstant("</td>");

        b.appendHtmlConstant("<td>");
        b.appendEscaped(userColumn.getValue(r));
        b.appendHtmlConstant("</td>");

        b.appendHtmlConstant("<td>");
        b.appendEscaped(screenColumn.getValue(r));
        b.appendHtmlConstant("</td>");

        b.appendHtmlConstant("<td>");
        b.appendEscaped(clientColumn.getValue(r));
        b.appendHtmlConstant("</td>");


        b.appendHtmlConstant("</tr>");

        count++;
    }
    b.appendHtmlConstant("</table>");
    printHTMLString(b.toSafeHtml().asString());
}
于 2013-11-01T17:06:45.340 回答
1

要导出 XLS,请使用以下类。

要打印使用gwt-print-it

下面的类在没有服务器端的情况下做到这一点。

public class TableToExcel {
    public static final <T> void save(final CellTable<T> table, String filename) {
        final AnchorElement a = Document.get().createAnchorElement();
        a.setHref("data:application/vnd.ms-excel;base64," + base64(table.getElement().getString()));
        a.setPropertyString("download", (filename.endsWith(".xls") || filename.endsWith(".xlsx")) ? filename : filename + ".xls");

        Document.get().getBody().appendChild(a);
        Scheduler.get().scheduleEntry(new ScheduledCommand() {
            @Override
            public void execute() {
                click(a);
                a.removeFromParent();
            }
        });
    }

    private static native void click(Element elem) /*-{
        elem.click();
    }-*/;

    public static native String base64(String data) /*-{
        return btoa(data);
    }-*/;
}
于 2014-04-03T14:30:36.993 回答
0

您可以尝试gwt-table-to-excel模块。

要点是 excel 和其他现代电子表格知道如何呈现 html 表格,因此只需使用正确的 mime 类型打开动态构建的 html 表格,仅此而已。

我从来没有用过,但描述听起来不错。

于 2013-10-31T20:52:23.493 回答
0

您可以使用getInnerHTMLgetInnerText

for(int i=0; i<cellTable.getRowCount();i++)
{
    TableRowElement rowElement = cellTable.getRowElement(i);
    for(int j =0; j<rowElement.getCells().getLength(); j++)
    {
        //System.out.println( rowElement.getCells().getItem(j).getInnerHTML() );
        System.out.println( rowElement.getCells().getItem(j).getInnerText() );

    }       
}
于 2013-10-31T20:30:56.297 回答