import { utils, writeFile } from "xlsx";
type HandleExportDataParams<TData> = {
dataSource: Array<TData> | undefined;
tableMapper?: (rowData: TData) => Record<string, any>;
filename?: string;
};
const handleExportData = async <TData extends object>({
dataSource,
tableMapper,
filename,
}: HandleExportDataParams) => {
const data = [...(dataSource ?? [])];
const mappedData = tableMapper ? data.map(tableMapper) : data;
const worksheet = utils.json_to_sheet(mappedData);
const workbook = utils.book_new();
utils.book_append_sheet(workbook, worksheet, "Export");
writeFile(
workbook,
ensureXlsxExtension(filename ?? "export.xlsx"),
{
compression: true,
}
);
};
function ensureXlsxExtension(input: string): string {
if (!input) return ".xlsx";
return input.endsWith(".xlsx")
? input
: input.replace(/\.[^/.]*$/, "") + ".xlsx";
}
References: