0
0

More than 3 years have passed since last update.

ブラウザ上でcsvやxlsx等のシートを読み込む

Last updated at Posted at 2021-09-13

csvデータをアップロードするための入力方法を色々まとめてみる。

csvファイル

const chardet = require("chardet")
const iconv = require("iconv-lite")

var csvReader = new FileReader();
csvReader.onload = (e) => {
  let data = new Uint8Array(e.target.result);
  let encoding = chardet.detect(data);
  let csv = iconv.decode(data, encoding);
  document.getElementById("<text field>").value = csv;
};

document.getElementById("<file filed>").addEventListener("change", (e) => {
  let sheetFile = e.target.files[0];
  csvReader.readAsArrayBuffer(sheetFile);
});

chardeticonv-liteを使うことで文字コードによらずに読み込めるようにしている。
ファイルが読み込まれたらFileReaderでバッファーとして読み込んで、それをcsvにしてテキストフィールドに入力する。

xlsxファイル

import XLSX from "xlsx"

var xlsxReader = new FileReader();
xlsxReader.onload = (e) => {
  let data = new Uint8Array(e.target.result);
  let workbook = XLSX.read(data, {type: "array"});
  let sheetName = document.getElementById("<text filed to input a sheet name>").value;
  let csv = XLSX.utils.sheet_to_csv(workbook.Sheets[sheetName]);
  document.getElementById("<text field>").value = csv;
};

document.getElementById("<file filed>").addEventListener("change", (e) => {
  let sheetFile = e.target.files[0];
  xlsxReader.readAsArrayBuffer(sheetFile);
});
document.getElementById("<text filed to input a sheet name>").addEventListener("change", (e) => {
  let sheetFile = document.getElementById("<file filed>").files[0];
  xlsxReader.readAsArrayBuffer(sheetFile);
});

xlsxで読み込みと変換を行っている。上のcsvReaderと使い分けるならファイルのmimeタイプで分岐させる。xlsx, xlsm(マクロ入)はそれぞれ以下。

  • application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
  • application/vnd.ms-excel.sheet.macroEnabled.12

ただしエクセルをインストールしているとcsvのmimeタイプがapplication/vnd.ms-excelという2003年以前のエクセル(.xls)のものに変わってしまうので.xlsを入力する場合は注意。

Google スプレッドシート

import Axios from "axios"

document.getElementById("<text filed to input a sheet url>").addEventListener("change", (e) => {
  let spreadsheetId = /(?<=\/spreadsheets\/d\/).*?(?=\/)/.exec(e.target.value)[0]
  let sheetUrl = "https://docs.google.com/spreadsheets/d/" + spreadsheetId + "/export"

  Axios.get(sheetUrl, {params: {format: "csv"}}).then((res) => {
    document.getElementById("<text field>").value = res.data;
  }).catch((err) => {
    outputErrors(err);
  });
});

Googleスプレッドシートは
https://docs.google.com/spreadsheets/d/{spreadsheetId}/export?format={format}
でファイルをダウンロードできる。テキストフィールドには共有リンクを渡す。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0