前提・実現したいこと
javaxcriptでexcelファイルを開いて、特定の行を削除したいのですが、やり方がわかりません。
(例えば、A列が"aaa"の箇所を探してその行を削除する。)
知見のある方いらっしゃいましたら、使用したフレームワークなど教えていただけないでしょうか。
調査中
SheetJs
demoのページを調査中。行の削除などはできない ?
Excel JavaScript API
excel用のadd on? javascript単体では操作できない?
調べているなら、ちゃんと調べて分からなかったことだけを質問しましょう。
調べている最中に聞いてるということは、あなたの作業を肩代わりしてやることにしかなりません。
https://www.npmtrends.com/xlsx-vs-exceljs-vs-sheetjs
一応上位3つのライブラリを出しました。
sheetjsとxlsxは同じなので、あなたが出している結果にexceljsを加えた形です。
グラフを見る限りxlsx(sheetjs)を使うのが良さげに思えます。
公開質問した以上、xlsxをしっかり調査して、可能ならexceljsを加え、出来ること出来ないこと、機能や速度や使い勝手、品質などを比較調査した結果、誰が見ても納得行く内容を自己回答としてまとめるのが本来の筋かと思います。
一応js-xlsx(sheetjsとかxlsxとか言われてるモノ)のサンプルコードを書いときます。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<script lang="javascript" src="https://unpkg.com/xlsx@0.16.6/dist/xlsx.full.min.js"></script>
<script>
window.addEventListener('DOMContentLoaded', (e) => {
document.querySelector('button#doit').addEventListener('click', (e) => {
const file = document.querySelector('input[name="file"]').files[0];
const reader = new FileReader();
reader.onload = function (e) {
const data = new Uint8Array(e.target.result);
const workbook = XLSX.read(data, { type: 'array' });
// aaaを含む行を探す
const sheet = workbook.Sheets[workbook.SheetNames[0]];
const range = XLSX.utils.decode_range(sheet['!ref']);
const targetRows = [];
for (let row = range.s.r; row <= range.e.r; ++row) {
for (let cell = range.s.c; cell <= range.e.c; ++cell) {
const cellObject = sheet[XLSX.utils.encode_cell({ c: cell, r: row })];
if (cellObject != null && cellObject.w === 'aaa') {
targetRows.push(row);
break;
}
}
}
// 抽出した行を削除(入力規則や関数など未考慮)
for (let offset = 0; offset < targetRows.length; ++offset) {
const maxRow = offset + 1 < targetRows.length ? targetRows[offset + 1] - (offset + 1) : range.e.r - (offset + 1);
for (let row = targetRows[offset] - offset; row < maxRow; ++row) {
for (let cell = range.s.c; cell <= range.e.c; ++cell) {
const to_cell_ref = XLSX.utils.encode_cell({ c: cell, r: row });
const from_cell_ref = XLSX.utils.encode_cell({ c: cell, r: row + (offset + 1) });
sheet[to_cell_ref] = sheet[from_cell_ref];
}
}
}
range.e.r -= targetRows.length;
sheet['!ref'] = XLSX.utils.encode_range(range.s, range.e);
// 保存
XLSX.writeFile(workbook, 'out.xlsx');
};
reader.readAsArrayBuffer(file);
}, false);
});
</script>
</head>
<body>
<input type="file" name="file">
<button id="doit">do it!</button>
</body>
</html>