javascript - 从excel复制粘贴,单元格换行符和行分隔符之间的区别

标签 javascript excel csv

我们需要为客户提供一种将 Excel 复制粘贴到 Web 应用程序中的表格的方法。 我们用换行符拆分行,用制表符拆分列。

问题是在单个单元格中你可以有换行符,所以 split(\n) 将简单地理解有一个新行。

    const rows = event.target.value.split('\n');
    for (let row of rows) {
      const values = row.split('\t');
    }

使用上面的代码,当单元格中没有换行符时,我们可以获得一个很好的复制粘贴表格,但是一旦单元格中有换行符,所有内容都会移动到一行并破坏所有内容。

如何区分用于分隔行的换行符和单元格中的换行符?

最佳答案

考虑我将 Excel 数据复制粘贴到 Notepad++ 中的小示例,我们可以看到引用了 cat\nfish:

enter image description here

因此,您可以将粘贴到 Web 应用程序的内容视为制表符分隔值 (tsv),并照此解析它们。

在下面的代码片段中,tsvStringToArray 改编自 here (也请参阅 here)。请注意,由于 dog 之后的最终 CR LF,将返回一个额外的行。在现实生活中,您可能应该找一个图书馆来为您做这件事。您可能会将 D3 视为可以在浏览器中运行的东西。

对于arrToTable,我假设你一定有更好的arrToTable。但是,您应该考虑是否需要在 HTML 中重新创建换行符。

const target = document.getElementById("input");
const output = document.getElementById("output");

const tsvStringToArray = (data) => {
  const re = /(\t|\r?\n|\r|^)(?:"([^"]*(?:""[^"]*)*)"|([^\t\r\n]*))/gi
  const result = [[]]
  let matches
  while ((matches = re.exec(data))) {
    if (matches[1].length && matches[1] !== "\t") result.push([])
    result[result.length - 1].push(
      matches[2] !== undefined ? matches[2].replace(/""/g, '"') : matches[3]
    )
  }
  //console.log(result);
  return result
}

const arrToTable = arr => {
  let tbl = document.createElement("table");
  for (row of arr) {
    let tr = document.createElement("tr");
    for (cell of row) {
      let td = document.createElement("td");
      let test = /\n/.test(cell);
      if (test) {
        let items = cell.split(/\n/);
        for ([idx, item] of items.entries()) {
          td.appendChild(document.createTextNode(item));
          if (idx < items.length) {
            td.appendChild(document.createElement("br"));
          }
        }
      } else {
        td.appendChild(document.createTextNode(cell));    
      }
      tr.appendChild(td);
    }
    tbl.appendChild(tr);
  }
  return tbl;
}

target.addEventListener("paste", e => {
  const text = event.clipboardData.getData("text");
  const arr = tsvStringToArray(text).slice(0, -1);
  const el = arrToTable(arr);
  output.appendChild(el);
});
div#input {
  height: 90px;
  width: 320px;
  background-color: powderblue;
}

table, tr, td {
  border: 1px solid black;
}
Paste in blue box:
<div id="input" contenteditable="true"></div>
<p>
<div id="output"></div>

关于javascript - 从excel复制粘贴,单元格换行符和行分隔符之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67773475/

相关文章:

javascript - 短信链接不适用于 Android 上的环聊

python - 添加到 pandas 数据框的列在例如时不会粘住。写入 csv

javascript - 复杂的 CSV 到数组

javascript - 有没有办法从 Highcharts 传入可变元素 ID 以启动模式窗口?

javascript - 触发 Javascript 表单字段验证和格式化的事件是什么?

javascript - 没有固定背景的视差滚动

vba - 有没有比 target.value = me.textbox.value 更快的替代方案?

excel - 如果 "0"则将该单元格留空

excel - 如何在电子邮件中找到国家/地区缩写

python - 使用 python 将新行添加到 csv 文件