3

我正在使用一个名为SheetJS的库,我想在不使用 nodejs 的情况下读取驻留在服务器上的 excel 表,而只使用纯 JavaScript。这可能吗?

文档中有一条消息说“readFile 仅在服务器环境中可用。浏览器没有用于读取给定路径的任意文件的 API,因此必须使用另一种策略”

对于上述消息,我假设作者指的是文件驻留在客户端的情况。

这是我到目前为止所做的

var wb = XLSX.readFile("myFile.xlsx"); //my file is in same directory on server

我收到错误“ xlsx.full.min.js:22 Uncaught TypeError: Cannot read property 'readFileSync' of undefined

4

2 回答 2

6

这对我有用

   /* set up async GET request */
    var req = new XMLHttpRequest();
    req.open("GET", url, true);
    req.responseType = "arraybuffer";

    req.onload = function(e) {
      var data = new Uint8Array(req.response);
      var workbook = XLSX.read(data, {type:"array"});

      /* DO SOMETHING WITH workbook HERE */
    }

    req.send();
于 2018-01-08T04:49:34.587 回答
1

我在读取服务器端文件时遇到了很多问题,其中有许多错误,包括类型错误、charCodeAt。因此,这提供了使用阅读器的客户端和服务器端解决方案。excel 文件来自文件上传按钮,并使用 node.js。 客户端

let excelInput = document.getElementById("fileToUpload");
let excelFile = excelInput.files[0];
let reader = new FileReader();

因此,您使用该元素中的 files[0] 获取文件并创建一个 fileReader。

你可以在 Github 上看到 Aymkdn 的解决方案。https://github.com/SheetJS/sheetjs/issues/532。它使用 Uint8Array 工作。

reader.readAsArrayBuffer(excelFile);
reader.onload = function() {
  excelArray = new Uint8Array(reader.result); //returns Uint8Array using the result of reader

  let binary = "";
  var length = excelArray.byteLength;
  for (var i = 0; i < length; i++) {
    binary += String.fromCharCode(excelArray[i]); 
    //uses a for loop to alter excelArray to binary
  }

  let formData = new FormData(); //create form data
  formData.append("excel", binary); //append binary to it

  fetch('/excel', {method: "POST", body: formData}) //post as normal
  .then((data) => {
    console.log('Success:', data);
  })
  .catch((error) => {
    console.error('Error:', error);
  });
}

服务器端

app.post('/excel', function(req, res) {
    let data = req.body;
    var workbook = sheetJS.read(data, {type: 'buffer'});
    console.log("workbook is", workbook);
    res.send();
}
于 2020-10-13T09:14:31.460 回答