【问题标题】:Read a csv or excel (xlsx) file with just javascript and html?仅使用 javascript 和 html 读取 csv 或 excel (xlsx) 文件?
【发布时间】:2022-04-11 11:33:59
【问题描述】:

是否可以仅使用 JavaScript 和 html 读取 excel xlsx 或 csv,最好是 xlsx。我发现的所有解决方案(sheetsJS、d3{d3 使用 Fetch API})都需要一个网络服务器。我知道我可以使用用于 chrome 或 python 或 node.js 的 Web 服务器获得一个简单的 Web 服务器。此外,我知道我可以使用某些标志运行 chrome,但出于安全考虑,我不想这样做。我正在为不精通网络并希望避免这样做的人构建一个演示。

我的文件结构很简单:

TestFolder
| index.html
| js/
    | test.js
| data/
    | test.xlsx
| css/
    | test.css

我只需要读取 xlsx,然后在 html 页面中显示该数据。

【问题讨论】:

  • 所以没有网络服务器意味着 - 你想在网络浏览器中打开 file://index.html?

标签: javascript html excel csv


【解决方案1】:

我添加了一个接受 Excel 或 CSV 文件的简单示例(当前示例接受单个文件),使用 SheetJS 库来解析 Excel 文件类型,将数据转换为 JSON 并将内容记录到控制台.

这应该足以完成您的演示。希望这会有所帮助!

var file = document.getElementById('docpicker')
var viewer = document.getElementById('dataviewer')
file.addEventListener('change', importFile);

function importFile(evt) {
  var f = evt.target.files[0];

  if (f) {
    var r = new FileReader();
    r.onload = e => {
      var contents = processExcel(e.target.result);
      console.log(contents)
    }
    r.readAsBinaryString(f);
  } else {
    console.log("Failed to load file");
  }
}

function processExcel(data) {
  var workbook = XLSX.read(data, {
    type: 'binary'
  });

  var firstSheet = workbook.SheetNames[0];
  var data = to_json(workbook);
  return data
};

function to_json(workbook) {
  var result = {};
  workbook.SheetNames.forEach(function(sheetName) {
    var roa = XLSX.utils.sheet_to_json(workbook.Sheets[sheetName], {
      header: 1
    });
    if (roa.length) result[sheetName] = roa;
  });
  return JSON.stringify(result, 2, 2);
};
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.14.3/xlsx.full.min.js"></script>
<label for="avatar">Choose an Excel or CSV file:</label>
<input type="file" id="docpicker" accept=".csv,application/vnd.ms-excel,.xlt,application/vnd.ms-excel,.xla,application/vnd.ms-excel,.xlsx,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,.xltx,application/vnd.openxmlformats-officedocument.spreadsheetml.template,.xlsm,application/vnd.ms-excel.sheet.macroEnabled.12,.xltm,application/vnd.ms-excel.template.macroEnabled.12,.xlam,application/vnd.ms-excel.addin.macroEnabled.12,.xlsb,application/vnd.ms-excel.sheet.binary.macroEnabled.12">

<div id="dataviewer">

【讨论】:

  • 所以用户不会在 csv 或 xlsx 文件中放置它,更像是我将使用 csv 或 xsls 来填充字段/做数学运算。我需要像 var file = 'data/text.xslx'; 这样读取文件然后使用该过程的excel功能。不确定我昨晚是否尝试过这样的事情并得到了 cors 错误
  • @manny 我不清楚你的评论是什么意思或在问我。
  • 如何将 JSON 内容保存到文件中?
  • 得到readAsBinaryString undefined :(
【解决方案2】:

您可以尝试使用Fetch API 下载文件并使用 JavaScript 处理它。

fetch('data/test.xlsx').then(function(resp) {
  // Process the data here...
  console.log('Data Response: ', resp);
});

如果您的数据文件是 JSON 格式,使用起来会容易得多,但这可能会满足您的需求。

更新 - 数据为 JSON 格式时的示例

fetch('data/test.xlsx').then(function(resp) {
  var records = resp.json(); // Assuming that we receive a JSON array.

  console.log('Records: ', records.length);

  records.forEach(function(record){
    console.log('Record Name: ', record.name); // Assuming each record has a name property
  });
});

【讨论】:

  • 很遗憾,Fetch Api 在这种情况下也不起作用。 d3 实际上使用了 fetch api
  • 是的,如果没有 Web 服务器,您没有太多选择(一开始没有注意到这个要求),特别是如果您不想破坏浏览器的安全设置。我会强烈考虑使用 node 之类的东西(它免费且简单)来提供您的文件。
  • 假设数据文件是一个 json 文件,那将如何工作?我确信我可以编写一些 python 脚本来将 csv 或 xlsx 转换为 json 文件。
  • 从您的服务器获取数据的工作方式相同。不同之处在于在 JavaScript 中处理 JSON 数据非常简单。您不必将数据解析为您可以使用的格式。
【解决方案3】:

这是我最终的做法:

我收到readAsBinaryString 的错误,所以我用下面的内容出去了。我注意到sheet_to_json 不能与csv 一起工作,所以我首先运行它并检查结果并解析sheet_to_csv 如果sheet_to_json === 0

HTML:

<!-- SheetsJS CSV & XLSX -->
<script src="xlsx/xlsx.full.min.js"></script>
<!-- SheetsJS CSV & XLSX -->
<!-- CSV/XLSX -->
<div class="ms-font-xl ms-settings__content__subtitle">CSV/XLSX Upload:</div>
<input type="file" id="csv-xlsx-file" accept=".csv,application/vnd.ms-excel,.xlt,application/vnd.ms-excel,.xla,application/vnd.ms-excel,.xlsx,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,.xltx,application/vnd.openxmlformats-officedocument.spreadsheetml.template,.xlsm,application/vnd.ms-excel.sheet.macroEnabled.12,.xltm,application/vnd.ms-excel.template.macroEnabled.12,.xlam,application/vnd.ms-excel.addin.macroEnabled.12,.xlsb,application/vnd.ms-excel.sheet.binary.macroEnabled.12">
<!-- CSV/XLSX -->

JS:

var csv_file_elm = document.getElementById("csv-xlsx-file")
csv_file_elm.addEventListener('change', CSV_XLSX_File_Selected_Event)

async function CSV_XLSX_File_Selected_Event() {
    var id = this.id
    var inputElement = document.getElementById(id)
    let ext = inputElement.value
    ext = ext.split(".")
    ext = ext[ext.length - 1]
    var files = inputElement.files || [];
    if (!files.length) return;
    var file = files[0];
    var reader = new FileReader();
    reader.onloadend = async function (event) {
        var arrayBuffer = reader.result;
        var options = { type: 'array' };
        var workbook = XLSX.read(arrayBuffer, options);
        //console.timeEnd();

        var sheetName = workbook.SheetNames
        var sheet = workbook.Sheets[sheetName]
        var sheet_to_html = XLSX.utils.sheet_to_html(sheet)
        var sheet_to_json = XLSX.utils.sheet_to_json(sheet)

        if (sheet_to_json.length === 0) {
            var sheet_to_csv = [XLSX.utils.sheet_to_csv(sheet)]
            var results = sheet_to_csv
        }

        if (sheet_to_json.length > 0) {
            var results = sheet_to_json
        }

        let Parsed_File_Obj = {
            "sheet_to_html": sheet_to_html,
            "results": results,
            "ext": ext,
        }

        console.log('Parsed_File_Obj')
        console.log(Parsed_File_Obj)
    };
    reader.readAsArrayBuffer(file);
}

【讨论】:

    猜你喜欢
    • 2018-05-28
    • 2011-11-11
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多