我正在尝试从动态生成的表创建一个CSV文件。我有一个生成合理CSV的代码。代码的输出是
, Emp I D, Emp Name, Emp Title,
, 111 , andro1 , developer ,
, 112 , andro2 , developer ,
, 113 , andro3 , developer ,
我想删除每行开头的逗号,以便csv格式正确。我也想整齐地格式化这个CSV,以便在excel中正确打开(标题为粗体,间隔良好的coulmns等)
我正在粘贴我使用的示例javascript
//Modify the value of these variable for your coach
var tableIdsToExport = "Table0";
// a comma delimited list of the ids of the tables that you want to include in the excel export
// if you include a tableId that does not exist in your coach, you will recieve a client side error message
//You do not need to modify the following part of the script
var form = document.createElement('div');
form.innerHTML = '<form name="exportData" method="post" target="_new" action="data-redirect.jsp"><input type="hidden" name="contentType" value="text/csv"><input type="hidden" name="data" value=""><input type="hidden" name="fileName" value="filename=reportData.csv"></form>';
//Work around a bug in IE: http://support.microsoft.com/default.aspx/kb/927917
document.getElementsByTagName("H1")[0].appendChild(form);
//document.body.appendChild(form);
function addExportData(csvTable) {
if (document.forms.exportData == null || document.forms.exportData.data == null) {
return;
}
document.forms.exportData.data.value = document.forms.exportData.data.value +
"\n\n" + csvTable;
}
function doSubmitExport() {
var tableArr = tableIdsToExport.split(",");
for (var i=0;i<tableArr.length;i++) {
addTableToCSV(tableArr[i]);
alert(addTableToCSV(tableArr[i]));
}
document.forms["exportData"].submit();
}
function addTableToCSV(tableId) {
var table;
try {
table = document.getElementById(tableId);
var a = table.innerHTML;
//replace existing commas with semi-colons. Poor mans way of handling embedded commas in a csv file
a = a.replace(/,/g, ";");
//get rid of javascript blocks
a = a.replace(/<script(.|\n)*?<\/script>/gi, "");
//insert commas at the end of a table cell
a = a.replace(/<\/td>/g, ",");
a = a.replace(/<\/TD>/g, ",");
a = a.replace(/<\/th>/g, ",");
a = a.replace(/<\/TH>/g, ",");
//insert a newline tag at the end of every row. Need to do this before removing all tags
a = a.replace(/<\/tr>/g, "---newline---");
a = a.replace(/<\/TR>/g, "---newline---");
//remove html tags
a = a.replace(/<\/?[^>]+(>|$)/g, "");
//remove whitespace (regexs found via google)
a = a.replace(/\r/g, " ");
a = a.replace(/[^ A-Za-z0-9`~!@#\$%\^&\*\(\)-_=\+\\\|\]\[\}\{'";:\?\/\.>,<]/g, "");
a = a.replace(/'/g, "");
a = a.replace(/ +/g, " ");
a = a.replace(/^\s/g, "");
a = a.replace(/\s$/g, "");
//put newlines in
a = a.replace(/---newline---/g, "\n");
//replace   which the coach designer inserts
a = a.replace(/\ /g, " ");
//a now holds a resonable csv that I can put in excel
//alert(a);
addExportData(a);
return true;
} catch (e) {
alert("Table Export Error: " + e);
}
return true;
}
</script>
还有一件事是,在表中有一列是空的。这就是脚本在开始时返回逗号的原因,我想删除它。 当我尝试在excel中打开csv时,内容从第三行而不是第一行开始。
这正在IBM BPM Lombardi应用程序中使用,我试图将动态生成的表导出为excel。
我还想知道如何通过jquery实现相同的结果 提前致谢
完成此操作后,我还计划导出为pdf选项。
以下表达了脚本中正在进行的操作
执行导出的关键组件是包含客户端JavaScript的自定义HTML代码块。 JavaScript包含以下组件:
1.A JavaScript变量tableIdsToExport。这是一个以逗号分隔的字符串,用于逐项列出要导出的表元素ID。您必须确保ID与Coach中的ID匹配。
2.一种JavaScript变量形式,它是动态生成的HTML表单元素(不可显示)。此表单的action属性的URI是将返回电子表格的Teamworks JSP。此表单还包含一个输入字段数据,其中包含要导出的表。
3.“导出到Excel”按钮。选择此按钮后,将执行doSubmitExport功能。
4.doSubmitExport函数。该函数的算法执行两个任务。首先,它遍历tableIdsToExport中的每个表并调用addTableToCSV函数。迭代完成后,函数提交表单变量中包含的表单元素(上图)。
5.addTableToCSV功能。为tableIdsToExport列表中的每个表调用此函数,并具有两个要执行的基本任务。首先,转换HTML表格,以便用逗号和换行符替换表格元素,从而有效地将表格转换为CSV格式。接下来,调用addTableToExport函数,并将转换后的表作为参数传递。
6.addTableToExport函数。此函数采用CSV参数并将其附加到隐藏表单的数据字段。 提交后,表单将发布到Teamworks data-redirect.jsp,后者将应用相应的内容类型并将数据发送回浏览器。
答案 0 :(得分:2)
我同意David Thomas的看法,他说你应该在CSV生成脚本中解决问题。
但是如果您无法控制该脚本,则可以在javascript regular expressions中使用replace()
将第一次出现的逗号替换为空字符串(将其删除):
", 111 , andro1 , developer ,".replace(/^,/, '');
返回:
" 111 , andro1 , developer ,"
<强>更新强>
Here你可以看到一个javacript演示,删除第一个逗号,并将所有列调整到预定义的最大宽度。
由于您没有jQuery标记,我假设您需要纯Javascript,但请记住,使用jQuery会更容易。
您可以从演示中看到的最终输出是
EmpID, EmpName, EmpTitle,
111, andro1, developer,
112, andro2, developer,
113, andro3, developer,
在这种情况下,我正确地将每列定义为10个字符。
关于粗体列标题,这是CSV格式无法实现的,因为CSV是纯文本格式。您可以考虑这个xlwt。
同样,我同意您应该从生成脚本中解决此格式问题,但如果您只是这些文件的使用者并希望在javascript中修复它们,那么此解决方案应该适合您。
更新2 你需要清理那个javascript。请阅读我上面包含的正则表达式链接。
你可以替换它:
a = a.replace(/<\/td>/g, ",");
a = a.replace(/<\/TD>/g, ",");
a = a.replace(/<\/th>/g, ",");
a = a.replace(/<\/TH>/g, ",");
只是这个:
a = a.replace(/<\/t(d|h)>/gi, '');
为什么要用</tr>
替换</TR>
和--newline--
,然后又用--newline--
替换\n
?您只需一次通话即可完成此操作:
a = a.replace(/<\/tr>/gi, '\\n');
所以,我认为你最终得到一个包含所有csv内容的字符串,其中每一行用\n
分隔。
Here是处理此用例的更新脚本。我只更改了var
声明,核心保持不变。
答案 1 :(得分:0)
对于格式化表达式,正则表达式不会帮助您解决问题。必须在CSV生成脚本中完成格式化。