替代标题可以是如何从 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 });
但我没有文件路径,我使用输入标签将文件作为用户的输入。
这是对我有用的东西。我正在使用反应。可以修改为
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);
});
}