如何在JS中只读取XLSX文件的第一行

问题描述 投票:0回答:1

替代标题可以是如何从 xlsx 文件中提取列名称。因为那是我的目标。

我想从 xlsx 文件中提取列名,我已经为此编写了代码,但问题是对于具有 > 10k 记录的较大文件,这需要很长时间,甚至我的页面挂起并且没有响应。

extractColumnsXlsx(file: File): Promise<string[]> {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();

    reader.readAsArrayBuffer(file);

    reader.onload = (event) => {
      const arrayBuffer = event.target?.result;

      try {
        const workbook = XLSX.read(arrayBuffer, { type: 'array' });
        const firstSheetName = workbook.SheetNames[0];
        console.log("First Sheet Name:", firstSheetName);

        const worksheet = workbook.Sheets[firstSheetName];
        console.log("Worksheet:", worksheet);

        console.log("!ref Property ->", worksheet['!ref']);

        let columnNames: string[] = [];

        if (worksheet['!ref']) {
          const parts = worksheet['!ref'].split(':');
          console.log("First and Last Cells: ", parts);

          const refObj = XLSX.utils.decode_range(worksheet['!ref']);
          const firstColIndex = refObj.s.c;
          const lastColIndex = refObj.e.c;

          console.log("firstColIndex:", firstColIndex);
          console.log("lastColIndex:", lastColIndex);

          let firstRowData;
          try {
            firstRowData = XLSX.utils.sheet_to_json(worksheet, {
              header: 1,
              range: `${XLSX.utils.encode_cell({ c: firstColIndex, r: 0 })}:${XLSX.utils.encode_cell({ c: lastColIndex, r: 0 })}`,
            });
          } catch (error) {
            console.error('Error reading first row: ', error);
          }

          if (firstRowData && firstRowData.length) {
            columnNames = firstRowData[0]; // Assuming first row contains column names (index 0)
          } else {
            console.warn('Failed to read column names from first row.');
          }

          console.log('Column Names:', columnNames);
          resolve(columnNames);
        } else {
          console.error('Missing of invalid !ref property in worksheet!');
          reject(new Error('Missing !ref property in worksheet'));
        }
      } catch (error) {
        reject(error);
      }
    };

    reader.onerror = (error) => reject(error);
  });
}

我正在寻找某种方法来仅读取 xlsx 文件中的第一行,但找不到任何有用的东西。有人建议使用这样的东西

 const workbook = xlsx.readFile('path/to/your/file.xlsx', { sheetRows: 5 });

但我没有文件路径,我使用输入标签将文件作为用户的输入。

javascript xlsx sheetjs
1个回答
0
投票

这是对我有用的东西。我正在使用反应。可以修改为

vanilla Js

const [data,setData] = useState(null)
<input type="file" onChange={(e) => setData(e.target.files[0])}/>
// getting file from user input
<button onClick={()=>extractExcelHeaders(data)}>Extract Headers</button>
// File data from user input is saved in data
export function extractExcelHeaders(data) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.onload = function (e) {
      const fileContent = e.target.result;
      const workbook = XLSX.read(fileContent, { type: "array" });
      const sheetName = workbook.SheetNames[0]; // Assuming the first sheet, to get another sheet specify [1] or so on...
      const worksheet = workbook.Sheets[sheetName];
      const headers = XLSX.utils.sheet_to_json(worksheet, { header: 1 })[0];
      resolve(headers);
    };
    reader.readAsArrayBuffer(data);
  });
}
© www.soinside.com 2019 - 2024. All rights reserved.