在Javaservlet中访问JavaScript表DOM

在Javaservlet中访问JavaScript表DOM,javascript,java,html,dom,html-table,Javascript,Java,Html,Dom,Html Table,我想编写可重用代码,从JSP中获取HTML表,并将其转换为Excel格式导出给用户。我想利用HTMLDOM表对象,而不是用Java解析HTML来提取相同的信息。这样做的最大好处是检查每个单元格是否有复选框、按钮等,以便在将单元格写入Excel之前删除它们。在我看来,设置应该是这样的: function processTable(tableId) { var jsonTable = []; var tableObj = document.getElementById(tableId

我想编写可重用代码,从JSP中获取HTML表,并将其转换为Excel格式导出给用户。我想利用HTMLDOM表对象,而不是用Java解析HTML来提取相同的信息。这样做的最大好处是检查每个单元格是否有复选框、按钮等,以便在将单元格写入Excel之前删除它们。在我看来,设置应该是这样的:

function processTable(tableId) {
    var jsonTable = [];
    var tableObj = document.getElementById(tableId);
    if (tableObj) {
        for (var x=0, y=tableObj.rows.length; x < y; x++) {
            var tableRow = tableObj.rows[x];
            var jsonRow = [];
            for (var i=0, j=tableRow.cells.length; i < j; i++) {
                var tableCell = tableRow.cells[i];
                // removes any line feeds or tabs
                jsonRow.push(tableCell.innerHTML.replace(/\t|\n/g, ""));
            }
            jsonTable.push(jsonRow)
        }
    }
    return JSON.stringify(jsonTable);
}
function processTable(tableId) {
    var jsonTable = [];
    var tableObj = document.getElementById(tableId);
    if (tableObj) {
        for (var a=0, b=tableObj.tBodies.length; a < b; a++) {
            var tBody = tableObj.tBodies[a];
            for (var x=0, y=tBody.rows.length; x < y; x++) {
                var tableRow = tableObj.rows[x];
                var jsonRow = [];
                for (var i=0, j=tableRow.cells.length; i < j; i++) {
                    var tableCell = tableRow.cells[i];
                    // removes any line feeds or tabs
                    jsonRow.push(tableCell.innerHTML.replace(/\t|\n/g, ""));
                }
                jsonTable.push(jsonRow)
            }
        }
    }
    return JSON.stringify(jsonTable);
}
HTML表格:

<a href="javascript: export();">Export to Excel</a>
<table id="exportTable">
  ...
</table>
JavaScript将以某种common.js的形式出现,这样这个概念就可以在站点任何页面的任何表上使用

**更新**


JSP将使用Java对象生成表,但表本身每次都会有所不同。我正在寻找一个通用的解决方案,通过该解决方案,我可以获得表的DOM结构,从而利用已经完成的Table.rows和Table.cells,检查每个单元格以删除Excel中不需要的标记(例如按钮、复选框等),并将其写入用户,并将响应类型设置为Excel。这更有意义吗?

将表发布到服务器。如果您想像在JavaScript中一样访问DOM,您需要。但我建议你还是坚持做一些比较容易的事情,比如说。然后将标题中修改为“application/ms excel”的内容类型回显到表中。

我将单元格中的数据序列化为一个简单的JSON对象,然后使用Java端的众多可用对象之一将其转换回可用对象

大概是这样的:

function processTable(tableId) {
    var jsonTable = [];
    var tableObj = document.getElementById(tableId);
    if (tableObj) {
        for (var x=0, y=tableObj.rows.length; x < y; x++) {
            var tableRow = tableObj.rows[x];
            var jsonRow = [];
            for (var i=0, j=tableRow.cells.length; i < j; i++) {
                var tableCell = tableRow.cells[i];
                // removes any line feeds or tabs
                jsonRow.push(tableCell.innerHTML.replace(/\t|\n/g, ""));
            }
            jsonTable.push(jsonRow)
        }
    }
    return JSON.stringify(jsonTable);
}
function processTable(tableId) {
    var jsonTable = [];
    var tableObj = document.getElementById(tableId);
    if (tableObj) {
        for (var a=0, b=tableObj.tBodies.length; a < b; a++) {
            var tBody = tableObj.tBodies[a];
            for (var x=0, y=tBody.rows.length; x < y; x++) {
                var tableRow = tableObj.rows[x];
                var jsonRow = [];
                for (var i=0, j=tableRow.cells.length; i < j; i++) {
                    var tableCell = tableRow.cells[i];
                    // removes any line feeds or tabs
                    jsonRow.push(tableCell.innerHTML.replace(/\t|\n/g, ""));
                }
                jsonTable.push(jsonRow)
            }
        }
    }
    return JSON.stringify(jsonTable);
}
函数处理表(tableId){
var jsonTable=[];
var tableObj=document.getElementById(tableId);
if(tableObj){
对于(var x=0,y=tableObj.rows.length;x
这使用公共域例程,可直接使用

现在,您可以获取该字符串,将其传递给服务器,并在JavaLand中重新水合该对象。您将得到一个直接对应于表内容的多维值数组

注意:这将检索整个表。如果您只想获取表体,则必须修改上述代码以迭代tBodies,如下所示:

function processTable(tableId) {
    var jsonTable = [];
    var tableObj = document.getElementById(tableId);
    if (tableObj) {
        for (var x=0, y=tableObj.rows.length; x < y; x++) {
            var tableRow = tableObj.rows[x];
            var jsonRow = [];
            for (var i=0, j=tableRow.cells.length; i < j; i++) {
                var tableCell = tableRow.cells[i];
                // removes any line feeds or tabs
                jsonRow.push(tableCell.innerHTML.replace(/\t|\n/g, ""));
            }
            jsonTable.push(jsonRow)
        }
    }
    return JSON.stringify(jsonTable);
}
function processTable(tableId) {
    var jsonTable = [];
    var tableObj = document.getElementById(tableId);
    if (tableObj) {
        for (var a=0, b=tableObj.tBodies.length; a < b; a++) {
            var tBody = tableObj.tBodies[a];
            for (var x=0, y=tBody.rows.length; x < y; x++) {
                var tableRow = tableObj.rows[x];
                var jsonRow = [];
                for (var i=0, j=tableRow.cells.length; i < j; i++) {
                    var tableCell = tableRow.cells[i];
                    // removes any line feeds or tabs
                    jsonRow.push(tableCell.innerHTML.replace(/\t|\n/g, ""));
                }
                jsonTable.push(jsonRow)
            }
        }
    }
    return JSON.stringify(jsonTable);
}
函数处理表(tableId){
var jsonTable=[];
var tableObj=document.getElementById(tableId);
if(tableObj){
for(var a=0,b=tableObj.tBodies.length;a
HTML表格可以通过Excel进行解释。也就是说,您所需要的只是标记和“application/msexcel”的内容类型,显然您是在JSP中生成表的,那么为什么不直接输出创建表的数据呢?对于实际的JavaScript实现,只需看看Ajax功能和jQuery()的Dom操作,我不明白,这里有问题吗?