Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GWT获取用于打印或导出的CellTable内容_Gwt_Celltable - Fatal编程技术网

GWT获取用于打印或导出的CellTable内容

GWT获取用于打印或导出的CellTable内容,gwt,celltable,Gwt,Celltable,我有一个GWTCellTable,它使用一个复杂而乏味的过程填充。我希望用户能够打印或导出该表中的数据 我宁愿不重新呈现要导出的表内容,因为这是一个乏味的过程 如何从我的CellTable的所有页面中获取所有行的内容,以便我可以将文档放在一起进行打印或导出 我可以使用一种获取表的实际HTML的方法,或者一种迭代并从单元格中获取呈现内容的算法。如果有人有更好的建议,我们也将不胜感激。您可以使用getInnerHTML或getInnerText for(int i=0; i<cellTable

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

我宁愿不重新呈现要导出的表内容,因为这是一个乏味的过程

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


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

您可以使用
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() );

    }       
}
对于(inti=0;i您可以尝试该模块

主要的一点是,excel和其他现代电子表格知道如何呈现html表,所以只需使用正确的mime类型打开动态构建的html表即可


我从未使用过它,但描述听起来不错。

似乎没有可行的方法让
CellTable
在不重新呈现内容的情况下为我提供导出数据。因为这将花费与我自己相同的执行时间,所以我求助于自己呈现它。我使用以下代码呈现HTML并以图形形式显示它用于打印的新弹出窗口。从“我的打印”按钮调用
print()
方法

/**
*在新弹出窗口中打印。
* http://www.coderanch.com/t/564198/GWT/GWT-injecting-HTML-text-browser
*/
公共静态本机void printHTMLString(字符串htmlString)/*-{
var win=$wnd.open(“_blank”、“Print”和“);
打开(“文本/html”、“替换”);
win.document.write(“+htmlString+”);
win.document.close();
win.focus();
var headID=win.document.getElementsByTagName(“head”)[0];
var fileref=win.document.createElement(“链接”);
setAttribute(“rel”、“样式表”);
fileref.setAttribute(“类型”、“文本/css”);
fileref.setAttribute(“href”,“tables-min.css”);
headID.appendChild(fileref);
win.print();
}-*/;
私人作废打印(){
//从ColumnSortHandler获取列表,这样它就可以在屏幕上保持排序
if(columnSortHandler.getList()==null | | columnSortHandler.getList().isEmpty()){
Window.alert(“无需打印”);
返回;
}
SafeHtmlBuilder b=新的SafeHtmlBuilder();
b、 附录HtmlConstant(“”)
+“TimestampTypeUser”
+“客户”);
整数计数=1;
for(记录r:columnSortHandler.getList()){
b、 appendHtmlConstant(“:”class='pure-table-odd'>”);
b、 附录HTMLConstant(“”);
b、 AppendExpired(timestampFormat.format(timeStampColumn.getValue(r));
b、 附录HTMLConstant(“”);
b、 附录HTMLConstant(“”);
b、 appendexpected(typeColumn.getValue(r));
b、 附录HTMLConstant(“”);
b、 附录HTMLConstant(“”);
b、 AppendExpired(userColumn.getValue(r));
b、 附录HTMLConstant(“”);
b、 附录HTMLConstant(“”);
b、 appendExpired(screenColumn.getValue(r));
b、 附录HTMLConstant(“”);
b、 附录HTMLConstant(“”);
b、 appendExpired(clientColumn.getValue(r));
b、 附录HTMLConstant(“”);
b、 附录HTMLConstant(“”);
计数++;
}
b、 附录HTMLConstant(“”);
printHTMLString(b.toSafeHtml().asString());
}

要导出XLS,请使用下面的类

打印使用

下面的类在不使用服务器端的情况下执行此操作

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);
    }-*/;
}
公共类TableToExcel{
公共静态最终作废保存(最终单元格表,字符串文件名){
final AnchoreElement a=Document.get().CreateAnchoreElement();
a、 setHref(“数据:application/vnd.ms excel;base64,”+base64(table.getElement().getString());
a、 setPropertyString(“下载”;(filename.endsWith(“.xls”)| | filename.endsWith(“.xlsx”))?filename:filename+“.xls”);
Document.get().getBody().appendChild(a);
Scheduler.get().scheduleEntry(新的ScheduledCommand()){
@凌驾
public void execute(){
点击(a);
a、 removeFromParent();
}
});
}
私有静态本机void单击(元素元素元素)/*-{
元素单击();
}-*/;
公共静态本机字符串base64(字符串数据)/*-{
返回btoa(数据);
}-*/;
}

你好,谢谢你的回答。其他页面的数据如何?这将从当前可见的页面获取数据。来自其他页面的数据甚至可能不在浏览器上,即使它们在浏览器上,我也不知道如何获取未呈现页面的呈现文本。我想您需要在后台生成/渲染所有页面,然后对每个页面使用上面的代码来获得渲染的内容。我希望有某种方法可以迭代表中的页面并获取行,但想想看,这需要相同的渲染量。我将只使用列呈现器手动呈现可打印页面的数据。谢谢你的帮助。嗨,谢谢你的回答。该库看起来不错,但我认为它需要将整个表的HTML作为POST请求传递。这看起来不是一个非常可行的解决方案。它也没有得到我表格中的所有页面。看起来我只需要重新呈现一个可打印的页面。嘿,这很好用!2分钟内启动并运行