Javascript 使用 SheetJS 在服务器上读取 Excel 文件

Javascript Read Excel file on server with SheetJS

我正在使用一个名为 SheetJS 的库,我想读取驻留在服务器上的 excel sheet,而不使用 nodejs,仅使用纯 javascript。这可能吗?

文档中有一条消息说 "readFile is only available in server environments. Browsers have no API for reading arbitrary files given a path, so another strategy must be used"

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

这是我目前所做的

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

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

这对我有用

   /* 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();

我在读取文件 server-side 时遇到了很多问题,有很多错误,包括类型错误,charCodeAt。因此,这提供了一个客户端和 server-side 使用 reader 的解决方案。 excel 文件来自文件上传按钮,并使用 node.js。 Client-side:

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);
  });
}

Server-side:

app.post('/excel', function(req, res) {
    let data = req.body;
    var workbook = sheetJS.read(data, {type: 'buffer'});
    console.log("workbook is", workbook);
    res.send();
}