Hướng dẫn exceljs get multiple cells - exceljs lấy nhiều ô

Tôi có một mẫu Excel như thế này:

Hướng dẫn exceljs get multiple cells - exceljs lấy nhiều ô

Dữ liệu tôi nhận được thật đáng buồn chỉ là một mảng 1D như:

data = [a-b, 24, c-d, 25, g-h, 26, e-f, 27, a-c, 24, b-d, 25, e-g, 26, f-h, 27, a-e, 24, e-g, 25, b-f, 26, d-h, 27];

Tôi đang sử dụng gói nodejs và exceljs npm.

Vì vậy, tôi cần phải điền bằng cách nào đó các ô C95: C98, F95: F98, I95: I98 .. Tương tự (nhưng không giống nhau) sẽ áp dụng cho một vài bảng khác trong cùng một bảng tính, vì vậy tôi cần phải làm điều này với vòng lặp.

Tôi gặp rắc rối với việc lấp đầy nhiều dòng và cũng để lấp đầy giá trị khác từ mảng của tôi, bởi vì tôi đã có A-B, C-D, G-H, ... được chèn vào Excel (tôi có thể ghi đè, đó không phải là vấn đề).

Mã cho bây giờ là:

 for (let i = 1; i < 9; i++) {
  console.log(dimensionalCheck[i]);

  let rowNum = 95;
  rowNum++;
  let row = worksheet.getRow(rowNum);
  row.getCell(3).value = dimensionalCheck[i + 1];
  row.commit();
}

Nhưng những gì tôi nhận được khi trở lại chỉ là thế này:

Hướng dẫn exceljs get multiple cells - exceljs lấy nhiều ô

Tôi khá ngạc nhiên khi đây không phải là một tính năng được yêu cầu phổ biến hơn;Đó có phải là thứ mà chúng ta có thể thấy hỗ trợ trong tương lai gần?

Đây là những gì tôi đã nghĩ ra trong thời gian trung bình, không hoàn toàn chống lỗi (thiếu một vài séc) nhưng đủ gần:

/**
 * Select a range of cells
 * @param  {string}   startCell - Range start cell (top-left)
 * @param  {string}   endCell   - Range end cell (bottom-right)
 * @return {Object[]}           - Selected cells
 */
const selectRange = (sheet, startCell, endCell) => {
  const [endCellColumn, endRow] = endCell.split(":", 2);
  const [startCellColumn, startRow] = startCell.split(":", 2);

  let endColumn = sheet.getColumn(endCellColumn);
  let startColumn = sheet.getColumn(startCellColumn);

  if (!endColumn) throw new Error("End column not found");
  if (!startColumn) throw new Error("Start column not found");

  endColumn = endColumn._number;
  startColumn = startColumn._number;

  const cells = [];
  for (let y = startRow; y <= endRow; y++) {
    const row = sheet.getRow(y);

    for (let x = startColumn; x <= endColumn; x++) {
      cells.push(row.getCell(x));
    }
  }

  return cells;
};

Sử dụng mẫu

const lastRow = worksheet.lastRow._number;
const row = selectRange(worksheet, `startColumnKey:${lastRow}`,  `endColumnKey:${lastRow + 4}`);

row.forEach(cell => {
  // TODO: Do something with each cell
});

Cảm ơn bạn vì mã, chúng tôi vừa thực hiện một số thay đổi bằng cách sử dụng thông số như "A1: C4" thay vì làm việc với hai thông số

import ExcelJS from "exceljs"

export const selectRange = (sheet: ExcelJS.Worksheet, rangeCell: string) => {
  const [startCell, endCell] = rangeCell.split(":")

  const [endCellColumn, endRow] = endCell.match(/[a-z]+|[^a-z]+/gi) as string[]
  const [startCellColumn, startRow] = startCell.match(
    /[a-z]+|[^a-z]+/gi
  ) as string[]

  let endColumn = sheet.getColumn(endCellColumn)
  let startColumn = sheet.getColumn(startCellColumn)

  if (!endColumn) throw new Error("End column not found")
  if (!startColumn) throw new Error("Start column not found")

  const endColumnNumber = endColumn.number
  const startColumnNumber = startColumn.number

  const cells = []
  for (let y = parseInt(startRow); y <= parseInt(endRow); y++) {
    const row = sheet.getRow(y)

    for (let x = startColumnNumber; x <= endColumnNumber; x++) {
      cells.push(row.getCell(x))
    }
  }

  return cells
}

const lastRow = worksheet.lastRow._number;
const row = selectRange(worksheet, `A${lastRow}:C${lastRow + 4}`);
 
row.forEach(cell => {
   // TODO: Do something with each cell
});