当您从Excel复制列并粘贴到textarea
元素中时,您会得到制表符分隔的字符串.并且同一行的单元格的值现在用制表符分隔.
我需要在JavaScript中获取所有单元格的值.理论上的方法很简单:
-
Split将字符串转换为行数组,指定
\n
作为分隔符. - 通过指定
\t
作为分隔符,将每行拆分为列array.
但在实践中,这有一定的困难,因为一个单元格也可以包含一个或多个选项卡.因此,在步骤2中直接指定\t
作为分隔符可能会产生错误的结果.
我提出的一个解决方案是,首先用自定义字符串(如__TAB__
)替换单元格中的每个制表符;然后安全地执行第一步和第二步;最后将所有__TAB__
替换回制表符.
由于包含制表符或多行的单元格值在粘贴到textarea
元素中时会自动包含在两个双引号("
)中,因此需要使用正则表达式来查找这些字符串.
我找到的一个正则表达式是this one.但是,它不能处理包含制表符的单元格值.我try 通过如下方式修改它来修复它:
var rows = pastedText.replace(/(^|\t)"((?:(?:""|[^"])*(?:\r\n|\n\r|\n|\r|\t))+(?:""|[^"])*)"(\t|$)/mg, function (match, p1, p2, p3) {
// This function runs for each cell with multi lined text.
return p1 + p2
// Replace any double double-quotes with a single
// double-quote
.replace(/""/g, '"')
// Replacing any tab with a custom string
.replace(/\t/g, '__TAB__') + p3;
})
// Split each line into rows
.split(/\r\n|\n\r|\n|\r/g);
它运行得很好,直到遇到such pasted text个.粘贴的文本表示一个20行、3列的数据,其中某些行为空.
浏览器在处理这类粘贴的文本时会无限期地无响应(在最新的Firefox 120.0.1和Chrome 120.0.6099.71中进行了测试).主要原因是第6行和第2列的单元格的开头包含一个"
.
我们的目标是获得每个单元的价值,如果有更好的解决方案,我真的不需要坚持一种类型的解决方案.如有任何建议,我们不胜感激.每个单元格可以包含一行或多行、一个或多个制表符、甚至一个或多个直双引号.