import { Disposable, ICellData, ICommandService, IUniverInstanceService, UniverInstanceType, Workbook } from '@univerjs/core';
|
import { SetRangeValuesCommand } from '@univerjs/sheets';
|
|
export class JnpfSheetsExcelFileService extends Disposable {
|
constructor(
|
@IUniverInstanceService private readonly _univerInstanceService: IUniverInstanceService,
|
@ICommandService private readonly _commandService: ICommandService,
|
) {
|
super();
|
}
|
|
public handleImportCsv() {
|
// 获取当前工作表
|
const sheet = this._univerInstanceService.getCurrentUnitForType<Workbook>(UniverInstanceType.UNIVER_SHEET)!.getActiveSheet();
|
|
// 等待用户选择 CSV 文件
|
this._waitUserSelectCSVFile(({ colsCount, data, rowsCount }) => {
|
// 设置工作表大小
|
sheet.setColumnCount(colsCount);
|
sheet.setRowCount(rowsCount);
|
|
// 设置工作表数据
|
this._commandService
|
.executeCommand(SetRangeValuesCommand.id, {
|
range: {
|
endColumn: colsCount - 1, // 结束列索引
|
endRow: rowsCount - 1, // 结束行索引
|
startColumn: 0, // 起始列索引
|
startRow: 0, // 起始行索引
|
},
|
value: this._parseCSV2UniverData(data),
|
})
|
.then();
|
});
|
}
|
|
/**
|
* 将 CSV 解析为 Univer 数据
|
* @param csv CSV 数据
|
* @returns { v: string }[][] 返回解析后的数据
|
*/
|
private _parseCSV2UniverData(csv: string[][]): ICellData[][] {
|
return csv.map(row => {
|
return row.map(cell => {
|
return {
|
v: cell || '',
|
};
|
});
|
});
|
}
|
|
/**
|
* 等待用户选择 CSV 文件
|
*/
|
private _waitUserSelectCSVFile(onSelect: (data: { colsCount: number; data: string[][]; rowsCount: number }) => void) {
|
const input = document.createElement('input');
|
input.type = 'file';
|
input.accept = '.csv';
|
input.click();
|
|
input.addEventListener('change', () => {
|
const file = input.files?.[0];
|
if (!file) return;
|
const reader = new FileReader();
|
reader.addEventListener('load', () => {
|
const text = reader.result;
|
if (typeof text !== 'string') return;
|
|
// 提示:使用 npm 包来解析 CSV
|
const rows = text.split(/\r\n|\n/);
|
const data = rows.map(line => line.split(','));
|
|
const colsCount = data.reduce((max, row) => Math.max(max, row.length), 0);
|
|
onSelect({
|
colsCount,
|
data,
|
rowsCount: data.length,
|
});
|
});
|
reader.readAsText(file);
|
});
|
}
|
}
|