我有一个GWT CellTable
,它使用一些复杂而繁琐的过程来填充。我希望用户能够打印或导出该表中的数据。
我宁愿不重新渲染表内容以进行导出,因为这是一个繁琐的过程。
如何从CellTable
的所有页面获取所有行的内容,以便我可以将文档放在一起打印或导出?
我可以使用一种方法来获取表格的实际HTML,或者用于迭代并从单元格中抓取渲染内容的算法。如果有人有更好的建议,那也值得赞赏。
答案 0 :(得分: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());
}
答案 1 :(得分: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);
}-*/;
}
答案 2 :(得分:0)
您可以使用getInnerHTML
或getInnerText
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() );
}
}
答案 3 :(得分:0)
您可以尝试gwt-table-to-excel模块。
重点是excel和其他现代电子表格知道如何渲染html表,所以只需用正确的mime类型打开动态构建的html表,就是这样。
我从未使用它,但描述听起来不错。