我想编写可重用的代码,该代码从JSP获取HTML表并将其转换为Excel格式以导出到用户。我想利用HTML DOM表对象,而不是用Java解析HTML来提取相同的信息。这样做的最大好处是检查每个单元格的复选框,按钮等,以便在将单元格写入Excel之前将其删除。在我看来,设置将是这样的:
HTML表:
<a href="javascript: export();">Export to Excel</a>
<table id="exportTable">
...
</table>
JavaScript的:
function export() {
var table = document.getElementById("exportTable");
// Send table object to Servlet somehow
}
JavaScript将使用某种common.js,以便可以在网站的任何页面中的任何表格上使用该概念。
**更新**
JSP将使用Java对象生成表,但每次表本身都会不同。我正在寻找一个通用的解决方案,我可以获得Table的DOM结构,从而利用已经完成的table.rows和table.cells,检查每个单元格以删除我不想在Excel中使用的标签(例如按钮) ,复选框等),并将响应类型设置为excel的用户写出来。那更有意义吗?
答案 0 :(得分:1)
我将数据从单元格序列化为一个简单的JSON对象,然后使用Java端可用的许多JSON libraries之一将其转换回可用对象。
这样的事情:
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);
}
这使用公共域JSON.stringify()例程,可直接使用here。
现在可以使用此字符串,将其传递给服务器,并在Java-land中重新保存对象。您将获得一个直接对应于表内容的多维数组值。
注意:这将检索整个表。如果你只想获得表格的主体,你将不得不修改上面的代码来迭代tBodies,如下所示:
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);
}
答案 1 :(得分:0)