ly-utils-lib 1.0.11 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +889 -686
- package/dist/array.cjs +237 -0
- package/dist/array.cjs.map +1 -0
- package/dist/array.d.cts +2 -0
- package/dist/array.d.ts +2 -0
- package/dist/array.js +150 -0
- package/dist/array.js.map +1 -0
- package/dist/crypto.cjs +193 -0
- package/dist/crypto.cjs.map +1 -0
- package/dist/crypto.d.cts +3 -0
- package/dist/crypto.d.ts +3 -0
- package/dist/crypto.js +144 -0
- package/dist/crypto.js.map +1 -0
- package/dist/date.cjs +563 -0
- package/dist/date.cjs.map +1 -0
- package/dist/date.d.cts +2 -0
- package/dist/date.d.ts +2 -0
- package/dist/date.js +451 -0
- package/dist/date.js.map +1 -0
- package/dist/excel.cjs +227 -0
- package/dist/excel.cjs.map +1 -0
- package/dist/excel.d.cts +2 -0
- package/dist/excel.d.ts +2 -0
- package/dist/excel.js +196 -0
- package/dist/excel.js.map +1 -0
- package/dist/index-B80SEVzM.d.cts +382 -0
- package/dist/index-B80SEVzM.d.ts +382 -0
- package/dist/index-Ba1rjTzj.d.cts +299 -0
- package/dist/index-Ba1rjTzj.d.ts +299 -0
- package/dist/index-Bg1ise7y.d.cts +253 -0
- package/dist/index-Bg1ise7y.d.ts +253 -0
- package/dist/index-BoqNpwNa.d.cts +203 -0
- package/dist/index-BoqNpwNa.d.ts +203 -0
- package/dist/index-C0qUnb9Y.d.cts +533 -0
- package/dist/index-C0qUnb9Y.d.ts +533 -0
- package/dist/index-Cy-mb5v_.d.cts +262 -0
- package/dist/index-Cy-mb5v_.d.ts +262 -0
- package/dist/index-D1f9Sym2.d.cts +148 -0
- package/dist/index-D1f9Sym2.d.ts +148 -0
- package/dist/index-Dan5oF-5.d.cts +213 -0
- package/dist/index-Dan5oF-5.d.ts +213 -0
- package/dist/index-XABfrs7z.d.cts +596 -0
- package/dist/index-XABfrs7z.d.ts +596 -0
- package/dist/index-YXWfKCK7.d.cts +109 -0
- package/dist/index-YXWfKCK7.d.ts +109 -0
- package/dist/index.cjs +3355 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +21 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.js +3294 -0
- package/dist/index.js.map +1 -0
- package/dist/map.cjs +839 -0
- package/dist/map.cjs.map +1 -0
- package/dist/map.d.cts +6 -0
- package/dist/map.d.ts +6 -0
- package/dist/map.js +811 -0
- package/dist/map.js.map +1 -0
- package/dist/object.cjs +316 -0
- package/dist/object.cjs.map +1 -0
- package/dist/object.d.cts +2 -0
- package/dist/object.d.ts +2 -0
- package/dist/object.js +247 -0
- package/dist/object.js.map +1 -0
- package/dist/pdf.cjs +197 -0
- package/dist/pdf.cjs.map +1 -0
- package/dist/pdf.d.cts +3 -0
- package/dist/pdf.d.ts +3 -0
- package/dist/pdf.js +173 -0
- package/dist/pdf.js.map +1 -0
- package/dist/storage.cjs +255 -0
- package/dist/storage.cjs.map +1 -0
- package/dist/storage.d.cts +1 -0
- package/dist/storage.d.ts +1 -0
- package/dist/storage.js +226 -0
- package/dist/storage.js.map +1 -0
- package/dist/string.cjs +232 -0
- package/dist/string.cjs.map +1 -0
- package/dist/string.d.cts +2 -0
- package/dist/string.d.ts +2 -0
- package/dist/string.js +170 -0
- package/dist/string.js.map +1 -0
- package/dist/utils.cjs +429 -0
- package/dist/utils.cjs.map +1 -0
- package/dist/utils.d.cts +2 -0
- package/dist/utils.d.ts +2 -0
- package/dist/utils.js +371 -0
- package/dist/utils.js.map +1 -0
- package/package.json +159 -33
- package/dist/ly-utils-lib.cjs.js +0 -52929
- package/dist/ly-utils-lib.cjs.js.map +0 -1
- package/dist/ly-utils-lib.es.js +0 -69623
- package/dist/ly-utils-lib.es.js.map +0 -1
- package/dist/ly-utils-lib.umd.js +0 -53314
- package/dist/ly-utils-lib.umd.js.map +0 -1
- package/dist/types/index.d.ts +0 -15
- package/dist/types/utils/esToolkit.d.ts +0 -12
- package/dist/types/utils/ol.d.ts +0 -181
- package/dist/types/utils/router.d.ts +0 -15
- package/dist/types/utils/storage.d.ts +0 -42
- package/dist/types/utils/time.d.ts +0 -76
- package/dist/types/utils/tool.d.ts +0 -86
- package/dist/vite.svg +0 -1
package/dist/date.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/modules/date/index.ts"],"names":["startDate","endDate","format","diffDays","diff","timezone"],"mappings":"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","file":"date.js","sourcesContent":["/**\n * 日期时间工具模块\n * 基于 dayjs 封装,提供常用的日期处理功能\n */\n\nimport dayjs, { type Dayjs } from 'dayjs'\nimport durationPlugin from 'dayjs/plugin/duration'\nimport isBetweenPlugin from 'dayjs/plugin/isBetween'\nimport isSameOrAfterPlugin from 'dayjs/plugin/isSameOrAfter'\nimport isSameOrBeforePlugin from 'dayjs/plugin/isSameOrBefore'\nimport quarterOfYear from 'dayjs/plugin/quarterOfYear'\nimport relativeTime from 'dayjs/plugin/relativeTime'\nimport timezone from 'dayjs/plugin/timezone'\nimport utc from 'dayjs/plugin/utc'\nimport weekOfYear from 'dayjs/plugin/weekOfYear'\nimport weekYear from 'dayjs/plugin/weekYear'\nimport isLeapYearPlugin from 'dayjs/plugin/isLeapYear'\nimport dayOfYear from 'dayjs/plugin/dayOfYear'\nimport minMax from 'dayjs/plugin/minMax'\nimport weekday from 'dayjs/plugin/weekday'\nimport 'dayjs/locale/zh-cn'\n\n// 扩展 dayjs 插件\ndayjs.extend(relativeTime)\ndayjs.extend(utc)\ndayjs.extend(timezone)\ndayjs.extend(durationPlugin)\ndayjs.extend(isBetweenPlugin)\ndayjs.extend(isSameOrBeforePlugin)\ndayjs.extend(isSameOrAfterPlugin)\ndayjs.extend(weekOfYear)\ndayjs.extend(weekYear)\ndayjs.extend(quarterOfYear)\ndayjs.extend(isLeapYearPlugin)\ndayjs.extend(dayOfYear)\ndayjs.extend(minMax)\ndayjs.extend(weekday)\n\n// 设置默认语言\ndayjs.locale('zh-cn')\n\nexport type { Dayjs }\n\n/**\n * 时间单位类型\n */\nexport type TimeUnit = 'year' | 'month' | 'day' | 'hour' | 'minute' | 'second' | 'millisecond'\n\n/**\n * 日期格式类型\n */\nexport type DateFormat =\n | 'YYYY-MM-DD'\n | 'YYYY-MM-DD HH:mm:ss'\n | 'YYYY-MM-DD HH:mm'\n | 'YYYY/MM/DD'\n | 'YYYY/MM/DD HH:mm:ss'\n | 'MM/DD/YYYY'\n | 'DD/MM/YYYY'\n | 'HH:mm:ss'\n | 'HH:mm'\n | 'YYYY-MM-DDTHH:mm:ss'\n | 'YYYY年MM月DD日'\n | 'YYYY年MM月DD日 HH:mm:ss'\n\n/**\n * 获取当前时间\n */\nexport const now = (): Dayjs => dayjs()\n\n/**\n * 格式化日期\n * @param date 日期\n * @param format 格式\n */\nexport const format = (\n date: string | number | Date | Dayjs,\n formatStr = 'YYYY-MM-DD HH:mm:ss'\n): string => {\n return dayjs(date).format(formatStr)\n}\n\n/**\n * 获取日期的年月日\n * @param date 日期\n */\nexport const getDate = (date: string | number | Date | Dayjs = new Date()): string => {\n return dayjs(date).format('YYYY-MM-DD')\n}\n\n/**\n * 获取时间\n * @param date 日期\n */\nexport const getTime = (date: string | number | Date | Dayjs = new Date()): string => {\n return dayjs(date).format('HH:mm:ss')\n}\n\n/**\n * 获取时间戳\n * @param date 日期\n */\nexport const getTimestamp = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).valueOf()\n}\n\n/**\n * 日期加减\n * @param date 日期\n * @param amount 数量\n * @param unit 单位\n */\nexport const add = (\n date: string | number | Date | Dayjs,\n amount: number,\n unit: 'year' | 'month' | 'day' | 'hour' | 'minute' | 'second' = 'day'\n): Dayjs => {\n return dayjs(date).add(amount, unit)\n}\n\n/**\n * 日期减法\n * @param date 日期\n * @param amount 数量\n * @param unit 单位\n */\nexport const subtract = (\n date: string | number | Date | Dayjs,\n amount: number,\n unit: 'year' | 'month' | 'day' | 'hour' | 'minute' | 'second' = 'day'\n): Dayjs => {\n return dayjs(date).subtract(amount, unit)\n}\n\n/**\n * 获取日期的开始时间(当天的 00:00:00)\n * @param date 日期\n */\nexport const startOf = (\n date: string | number | Date | Dayjs,\n unit: 'day' | 'month' | 'year' = 'day'\n): Dayjs => {\n return dayjs(date).startOf(unit)\n}\n\n/**\n * 获取日期的结束时间(当天的 23:59:59)\n * @param date 日期\n */\nexport const endOf = (\n date: string | number | Date | Dayjs,\n unit: 'day' | 'month' | 'year' = 'day'\n): Dayjs => {\n return dayjs(date).endOf(unit)\n}\n\n/**\n * 计算两个日期之间的天数差\n * @param date1 日期1\n * @param date2 日期2\n */\nexport const diffDays = (\n date1: string | number | Date | Dayjs,\n date2: string | number | Date | Dayjs\n): number => {\n return dayjs(date1).diff(dayjs(date2), 'day')\n}\n\n/**\n * 计算两个日期之间的小时差\n * @param date1 日期1\n * @param date2 日期2\n */\nexport const diffHours = (\n date1: string | number | Date | Dayjs,\n date2: string | number | Date | Dayjs\n): number => {\n return dayjs(date1).diff(dayjs(date2), 'hour')\n}\n\n/**\n * 判断是否是今天\n * @param date 日期\n */\nexport const isToday = (date: string | number | Date | Dayjs): boolean => {\n return dayjs(date).isSame(dayjs(), 'day')\n}\n\n/**\n * 判断是否是昨天\n * @param date 日期\n */\nexport const isYesterday = (date: string | number | Date | Dayjs): boolean => {\n return dayjs(date).isSame(dayjs().subtract(1, 'day'), 'day')\n}\n\n/**\n * 判断是否是明天\n * @param date 日期\n */\nexport const isTomorrow = (date: string | number | Date | Dayjs): boolean => {\n return dayjs(date).isSame(dayjs().add(1, 'day'), 'day')\n}\n\n/**\n * 判断是否在两个日期之间\n * @param date 日期\n * @param startDate 开始日期\n * @param endDate 结束日期\n */\nexport const isBetween = (\n date: string | number | Date | Dayjs,\n startDate: string | number | Date | Dayjs,\n endDate: string | number | Date | Dayjs\n): boolean => {\n return dayjs(date).isBetween(startDate, endDate, null, '[]')\n}\n\n/**\n * 获取相对时间\n * @param date 日期\n */\nexport const fromNow = (date: string | number | Date | Dayjs): string => {\n return dayjs(date).fromNow()\n}\n\n/**\n * 获取周数\n * @param date 日期\n */\nexport const getWeek = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).week()\n}\n\n/**\n * 计算日期(前移或后移)\n * @param compute 计算方式 'after' | 'before'\n * @param date 日期\n * @param type 计算类型 'day' | 'week' | 'month' | 'quarter' | 'year' | 'hour' | 'minute' | 'second' | 'millisecond'\n * @param num 计算数量\n * @param format 格式模板\n * @returns 格式化后的日期字符串\n */\nexport const computeDate = (\n compute: 'after' | 'before',\n date: string | number | Date | Dayjs = new Date(),\n type: 'day' | 'week' | 'month' | 'quarter' | 'year' | 'hour' | 'minute' | 'second' | 'millisecond' = 'day',\n num: number = 1,\n format: string = 'YYYY-MM-DD'\n): string => {\n const d = dayjs(date)\n if (compute === 'after') {\n return d.add(num, type as any).format(format)\n }\n if (compute === 'before') {\n return d.subtract(num, type as any).format(format)\n }\n return d.format(format)\n}\n\n/**\n * 获取当前时间单位的开始时间\n * @param type 类型 'date' | 'day' | 'month' | 'quarter' | 'year' | 'week' | 'isoWeek' | 'hour' | 'minute' | 'second' | 'millisecond'\n * @param format 格式模板\n * @returns 格式化后的日期字符串\n */\nexport const startDate = (\n type: 'date' | 'day' | 'month' | 'quarter' | 'year' | 'week' | 'isoWeek' | 'hour' | 'minute' | 'second' | 'millisecond' = 'month',\n format: string = 'YYYY-MM-DD'\n): string => {\n return dayjs().startOf(type as any).format(format)\n}\n\n/**\n * 获取当前时间单位的结束时间\n * @param type 类型 'date' | 'day' | 'month' | 'quarter' | 'year' | 'week' | 'isoWeek' | 'hour' | 'minute' | 'second' | 'millisecond'\n * @param format 格式模板\n * @returns 格式化后的日期字符串\n */\nexport const endDate = (\n type: 'date' | 'day' | 'month' | 'quarter' | 'year' | 'week' | 'isoWeek' | 'hour' | 'minute' | 'second' | 'millisecond' = 'month',\n format: string = 'YYYY-MM-DD'\n): string => {\n return dayjs().endOf(type as any).format(format)\n}\n\n/**\n * 时间戳格式化\n * @param timestamp 时间戳(秒级)\n * @param format 格式模板\n * @returns 格式化后的日期字符串\n */\nexport const formatTimestamp = (\n timestamp: number = 0,\n format: string = 'YYYY-MM-DD HH:mm:ss'\n): string => {\n const ts = timestamp === 0 ? getTimestamp() / 1000 : timestamp\n return dayjs.unix(ts).format(format)\n}\n\n/**\n * 获取两个日期之间的差异(通用版本)\n * @param type 类型 'week' | 'day' | 'month' | 'quarter' | 'year' | 'hour' | 'minute' | 'second' | 'millisecond'\n * @param startDate 起始时间\n * @param endDate 结束时间\n * @returns 差异值\n */\nexport const diff = (\n type: 'week' | 'day' | 'month' | 'quarter' | 'year' | 'hour' | 'minute' | 'second' | 'millisecond',\n startDate: string | number | Date | Dayjs,\n endDate: string | number | Date | Dayjs = new Date()\n): number => {\n return dayjs(endDate).diff(dayjs(startDate), type)\n}\n\n/**\n * 获取日期范围内的所有日期\n * @param startDate 起始时间\n * @param endDate 结束时间\n * @param format 格式模板\n * @returns 日期集合(包含日期和时间戳)\n */\nexport const getRangeDate = (\n startDate: string | number | Date | Dayjs,\n endDate: string | number | Date | Dayjs,\n format: string = 'YYYY-MM-DD'\n): Array<{ day: string; timestamp: number }> => {\n const diffDays = diff('day', startDate, endDate)\n const range: Array<{ day: string; timestamp: number }> = []\n\n for (let i = 0; i <= diffDays; i++) {\n const day = computeDate('after', startDate, 'day', i, format)\n range.push({\n day,\n timestamp: getTimestamp(day) / 1000\n })\n }\n\n return range\n}\n\n/**\n * 获取相对时间(中文描述)\n * @param date 日期\n * @returns 相对时间描述\n */\nexport const getRelativeTime = (date: string | number | Date | Dayjs): string => {\n const diffMinutes = diff('minute', date)\n\n if (diffMinutes < 1) {\n return '刚刚'\n }\n if (diffMinutes < 60) {\n return `${diffMinutes}分钟前`\n }\n if (diffMinutes < 1440) {\n return `${Math.floor(diffMinutes / 60)}小时前`\n }\n if (diffMinutes < 43200) {\n return `${Math.floor(diffMinutes / 1440)}天前`\n }\n\n return format(date, 'YYYY-MM-DD')\n}\n\n/**\n * 判断日期是否有效\n * @param date 日期\n * @returns 是否有效\n */\nexport const isValid = (date: string | number | Date | Dayjs): boolean => {\n return dayjs(date).isValid()\n}\n\n/**\n * 获取月份的第一天\n * @param date 日期\n * @returns 日期\n */\nexport const getFirstDayOfMonth = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).date() - dayjs(date).startOf('month').date() + 1\n}\n\n/**\n * 获取月份的最后一天\n * @param date 日期\n * @returns 日期\n */\nexport const getLastDayOfMonth = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).endOf('month').date()\n}\n\n/**\n * 获取季度\n * @param date 日期\n */\nexport const getQuarter = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).quarter()\n}\n\n/**\n * 获取某月有多少天\n * @param date 日期\n */\nexport const getDaysInMonth = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).daysInMonth()\n}\n\n/**\n * 获取当前月份的开始日期和结束日期\n * @param date 日期\n */\nexport const getMonthRange = (\n date: string | number | Date | Dayjs = new Date()\n): [string, string] => {\n const d = dayjs(date)\n return [d.startOf('month').format('YYYY-MM-DD'), d.endOf('month').format('YYYY-MM-DD')]\n}\n\n/**\n * 获取当前季度的开始日期和结束日期\n * @param date 日期\n */\nexport const getQuarterRange = (\n date: string | number | Date | Dayjs = new Date()\n): [string, string] => {\n const d = dayjs(date)\n const quarter = d.quarter()\n const start = d\n .month((quarter - 1) * 3)\n .startOf('month')\n .format('YYYY-MM-DD')\n const end = d\n .month(quarter * 3 - 1)\n .endOf('month')\n .format('YYYY-MM-DD')\n return [start, end]\n}\n\n/**\n * 获取当前年份的开始日期和结束日期\n * @param date 日期\n */\nexport const getYearRange = (\n date: string | number | Date | Dayjs = new Date()\n): [string, string] => {\n const d = dayjs(date)\n return [d.startOf('year').format('YYYY-MM-DD'), d.endOf('year').format('YYYY-MM-DD')]\n}\n\n/**\n * 获取本周的开始日期和结束日期\n * @param date 日期\n * @param startDay 一周的开始日,默认为周日(0)\n */\nexport const getWeekRange = (\n date: string | number | Date | Dayjs = new Date(),\n startDay = 0\n): [string, string] => {\n const d = dayjs(date)\n const day = d.day()\n const diff = day < startDay ? 7 - startDay + day : day - startDay\n const start = d.subtract(diff, 'day').format('YYYY-MM-DD')\n const end = d.subtract(diff, 'day').add(6, 'day').format('YYYY-MM-DD')\n return [start, end]\n}\n\n/**\n * 判断是否是闰年\n * @param year 年份\n */\nexport const isLeapYear = (year: number): boolean => {\n return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0\n}\n\n/**\n * 导出 dayjs 原始方法,方便高级用法\n */\nexport { dayjs }\n\n\n/**\n * 获取年份\n * @param date 日期\n */\nexport const getYear = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).year()\n}\n\n/**\n * 获取月份(1-12)\n * @param date 日期\n */\nexport const getMonth = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).month() + 1\n}\n\n/**\n * 获取日期(1-31)\n * @param date 日期\n */\nexport const getDay = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).date()\n}\n\n/**\n * 获取小时(0-23)\n * @param date 日期\n */\nexport const getHour = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).hour()\n}\n\n/**\n * 获取分钟(0-59)\n * @param date 日期\n */\nexport const getMinute = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).minute()\n}\n\n/**\n * 获取秒数(0-59)\n * @param date 日期\n */\nexport const getSecond = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).second()\n}\n\n/**\n * 获取星期几(0-6,0为周日)\n * @param date 日期\n */\nexport const getWeekday = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).day()\n}\n\n/**\n * 获取星期几的中文名称\n * @param date 日期\n */\nexport const getWeekdayName = (date: string | number | Date | Dayjs = new Date()): string => {\n const weekdays = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']\n return weekdays[dayjs(date).day()]\n}\n\n/**\n * 获取一年中的第几天\n * @param date 日期\n */\nexport const getDayOfYear = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).dayOfYear()\n}\n\n/**\n * 获取本周第一天(周一)\n * @param date 日期\n */\nexport const getFirstDayOfWeek = (date: string | number | Date | Dayjs = new Date()): Dayjs => {\n return dayjs(date).weekday(0)\n}\n\n/**\n * 获取本周最后一天(周日)\n * @param date 日期\n */\nexport const getLastDayOfWeek = (date: string | number | Date | Dayjs = new Date()): Dayjs => {\n return dayjs(date).weekday(6)\n}\n\n/**\n * 获取本月第一天(Dayjs 对象)\n * @param date 日期\n */\nexport const getFirstDayOfMonthDate = (date: string | number | Date | Dayjs = new Date()): Dayjs => {\n return dayjs(date).startOf('month')\n}\n\n/**\n * 获取本月最后一天(Dayjs 对象)\n * @param date 日期\n */\nexport const getLastDayOfMonthDate = (date: string | number | Date | Dayjs = new Date()): Dayjs => {\n return dayjs(date).endOf('month')\n}\n\n/**\n * 获取本年第一天\n * @param date 日期\n */\nexport const getFirstDayOfYear = (date: string | number | Date | Dayjs = new Date()): Dayjs => {\n return dayjs(date).startOf('year')\n}\n\n/**\n * 获取本年最后一天\n * @param date 日期\n */\nexport const getLastDayOfYear = (date: string | number | Date | Dayjs = new Date()): Dayjs => {\n return dayjs(date).endOf('year')\n}\n\n/**\n * 判断日期是否相同\n * @param date1 日期1\n * @param date2 日期2\n * @param unit 单位\n */\nexport const isSame = (\n date1: string | number | Date | Dayjs,\n date2: string | number | Date | Dayjs,\n unit: 'year' | 'month' | 'day' | 'hour' | 'minute' | 'second' = 'day'\n): boolean => {\n return dayjs(date1).isSame(date2, unit)\n}\n\n/**\n * 比较两个日期\n * @param date1 日期1\n * @param date2 日期2\n * @returns 1(date1 > date2)、-1(date1 < date2)、0(date1 = date2)\n */\nexport const compare = (\n date1: string | number | Date | Dayjs,\n date2: string | number | Date | Dayjs\n): number => {\n const d1 = dayjs(date1).valueOf()\n const d2 = dayjs(date2).valueOf()\n if (d1 > d2) return 1\n if (d1 < d2) return -1\n return 0\n}\n\n/**\n * 判断日期是否相同或在之前\n * @param date1 日期1\n * @param date2 日期2\n */\nexport const isSameOrBefore = (\n date1: string | number | Date | Dayjs,\n date2: string | number | Date | Dayjs\n): boolean => {\n return dayjs(date1).isSameOrBefore(date2)\n}\n\n/**\n * 判断日期是否相同或在之后\n * @param date1 日期1\n * @param date2 日期2\n */\nexport const isSameOrAfter = (\n date1: string | number | Date | Dayjs,\n date2: string | number | Date | Dayjs\n): boolean => {\n return dayjs(date1).isSameOrAfter(date2)\n}\n\n/**\n * 判断日期1是否在日期2之前\n * @param date1 日期1\n * @param date2 日期2\n */\nexport const isBefore = (\n date1: string | number | Date | Dayjs,\n date2: string | number | Date | Dayjs\n): boolean => {\n return dayjs(date1).isBefore(date2)\n}\n\n/**\n * 判断日期1是否在日期2之后\n * @param date1 日期1\n * @param date2 日期2\n */\nexport const isAfter = (\n date1: string | number | Date | Dayjs,\n date2: string | number | Date | Dayjs\n): boolean => {\n return dayjs(date1).isAfter(date2)\n}\n\n/**\n * 计算年龄\n * @param birthday 生日\n */\nexport const getAge = (birthday: string | number | Date | Dayjs): number => {\n return dayjs().diff(birthday, 'year')\n}\n\n/**\n * 判断是否是工作日(周一到周五)\n * @param date 日期\n */\nexport const isWorkday = (date: string | number | Date | Dayjs = new Date()): boolean => {\n const day = dayjs(date).day()\n return day !== 0 && day !== 6 // 0 是周日,6 是周六\n}\n\n/**\n * 判断是否是周末(周六或周日)\n * @param date 日期\n */\nexport const isWeekend = (date: string | number | Date | Dayjs = new Date()): boolean => {\n const day = dayjs(date).day()\n return day === 0 || day === 6\n}\n\n/**\n * 判断时间段(上午/下午/晚上/深夜)\n * @param date 日期\n */\nexport const getTimeOfDay = (\n date: string | number | Date | Dayjs = new Date()\n): 'morning' | 'noon' | 'afternoon' | 'evening' | 'night' => {\n const hour = dayjs(date).hour()\n if (hour >= 5 && hour < 9) return 'morning'\n if (hour >= 9 && hour < 12) return 'noon'\n if (hour >= 12 && hour < 18) return 'afternoon'\n if (hour >= 18 && hour < 22) return 'evening'\n return 'night'\n}\n\n/**\n * 获取时间段的中文名称\n * @param date 日期\n */\nexport const getTimeOfDayName = (\n date: string | number | Date | Dayjs = new Date()\n): string => {\n const timeOfDay = getTimeOfDay(date)\n const names = {\n morning: '清晨',\n noon: '上午',\n afternoon: '下午',\n evening: '晚上',\n night: '深夜'\n }\n return names[timeOfDay]\n}\n\n/**\n * 计算两个日期之间的工作日天数\n * @param startDate 开始日期\n * @param endDate 结束日期\n */\nexport const getWorkdaysBetween = (\n startDate: string | number | Date | Dayjs,\n endDate: string | number | Date | Dayjs\n): number => {\n let count = 0\n const start = dayjs(startDate)\n const end = dayjs(endDate)\n const days = Math.abs(start.diff(end, 'day'))\n\n for (let i = 0; i <= days; i++) {\n const current = start.add(i, 'day')\n if (isWorkday(current)) {\n count++\n }\n }\n\n return count\n}\n\n/**\n * 生成日期范围数组\n * @param startDate 开始日期\n * @param endDate 结束日期\n * @param unit 单位(默认为天)\n */\nexport const getDateRange = (\n startDate: string | number | Date | Dayjs,\n endDate: string | number | Date | Dayjs,\n unit: TimeUnit = 'day'\n): Dayjs[] => {\n const start = dayjs(startDate)\n const end = dayjs(endDate)\n const dates: Dayjs[] = []\n const diff = end.diff(start, unit)\n\n for (let i = 0; i <= diff; i++) {\n dates.push(start.add(i, unit))\n }\n\n return dates\n}\n\n/**\n * 获取最近N天的日期数组\n * @param days 天数\n */\nexport const getRecentDays = (days: number): Dayjs[] => {\n const dates: Dayjs[] = []\n for (let i = 0; i < days; i++) {\n dates.push(dayjs().subtract(i, 'day'))\n }\n return dates.reverse()\n}\n\n/**\n * 获取最近N个月的日期数组\n * @param months 月数\n */\nexport const getRecentMonths = (months: number): Dayjs[] => {\n const dates: Dayjs[] = []\n for (let i = 0; i < months; i++) {\n dates.push(dayjs().subtract(i, 'month'))\n }\n return dates.reverse()\n}\n\n/**\n * 获取最近N周的日期数组\n * @param weeks 周数\n */\nexport const getRecentWeeks = (weeks: number): Dayjs[] => {\n const dates: Dayjs[] = []\n for (let i = 0; i < weeks; i++) {\n dates.push(dayjs().subtract(i, 'week'))\n }\n return dates.reverse()\n}\n\n/**\n * 转换为 UTC 时间\n * @param date 日期\n */\nexport const toUTC = (date: string | number | Date | Dayjs): Dayjs => {\n return dayjs(date).utc()\n}\n\n/**\n * 从 UTC 转换为本地时间\n * @param date 日期\n */\nexport const fromUTC = (date: string | number | Date | Dayjs): Dayjs => {\n return dayjs.utc(date).local()\n}\n\n/**\n * 转换为指定时区的时间\n * @param date 日期\n * @param timezone 时区(如 'Asia/Shanghai')\n */\nexport const toTimezone = (\n date: string | number | Date | Dayjs,\n timezone: string\n): Dayjs => {\n return dayjs(date).tz(timezone)\n}\n\n/**\n * 获取时区偏移量(分钟)\n * @param date 日期\n */\nexport const getTimezoneOffset = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).utcOffset()\n}\n\n/**\n * 格式化持续时间\n * @param milliseconds 毫秒数\n */\nexport const formatDuration = (milliseconds: number): string => {\n const d = dayjs.duration(milliseconds)\n const hours = Math.floor(d.asHours())\n const minutes = d.minutes()\n const seconds = d.seconds()\n\n if (hours > 0) {\n return `${hours}小时${minutes}分${seconds}秒`\n }\n if (minutes > 0) {\n return `${minutes}分${seconds}秒`\n }\n return `${seconds}秒`\n}\n\n/**\n * 获取最小日期\n * @param dates 日期数组\n */\nexport const minDate = (dates: Array<string | number | Date | Dayjs>): Dayjs => {\n return dayjs.min(dates.map((d) => dayjs(d)))!\n}\n\n/**\n * 获取最大日期\n * @param dates 日期数组\n */\nexport const maxDate = (dates: Array<string | number | Date | Dayjs>): Dayjs => {\n return dayjs.max(dates.map((d) => dayjs(d)))!\n}\n\n/**\n * 判断是否是本月\n * @param date 日期\n */\nexport const isThisMonth = (date: string | number | Date | Dayjs): boolean => {\n return dayjs(date).isSame(dayjs(), 'month')\n}\n\n/**\n * 判断是否是本年\n * @param date 日期\n */\nexport const isThisYear = (date: string | number | Date | Dayjs): boolean => {\n return dayjs(date).isSame(dayjs(), 'year')\n}\n\n/**\n * 判断是否是本周\n * @param date 日期\n */\nexport const isThisWeek = (date: string | number | Date | Dayjs): boolean => {\n return dayjs(date).isSame(dayjs(), 'week')\n}\n\n/**\n * 判断是否是同月\n * @param date1 日期1\n * @param date2 日期2\n */\nexport const isSameMonth = (\n date1: string | number | Date | Dayjs,\n date2: string | number | Date | Dayjs\n): boolean => {\n return dayjs(date1).isSame(date2, 'month')\n}\n\n/**\n * 判断是否是同一年\n * @param date1 日期1\n * @param date2 日期2\n */\nexport const isSameYear = (\n date1: string | number | Date | Dayjs,\n date2: string | number | Date | Dayjs\n): boolean => {\n return dayjs(date1).isSame(date2, 'year')\n}\n\n/**\n * 获取农历年份(简化版,仅供参考)\n * @param date 日期\n */\nexport const getChineseYear = (date: string | number | Date | Dayjs = new Date()): string => {\n const animals = ['鼠', '牛', '虎', '兔', '龙', '蛇', '马', '羊', '猴', '鸡', '狗', '猪']\n const baseYear = 1900\n const year = dayjs(date).year()\n const index = (year - baseYear) % 12\n return animals[index >= 0 ? index : index + 12] + '年'\n}\n\n/**\n * 获取星座\n * @param date 日期\n */\nexport const getZodiacSign = (date: string | number | Date | Dayjs = new Date()): string => {\n const month = dayjs(date).month() + 1\n const day = dayjs(date).date()\n\n if ((month === 3 && day >= 21) || (month === 4 && day <= 19)) return '白羊座'\n if ((month === 4 && day >= 20) || (month === 5 && day <= 20)) return '金牛座'\n if ((month === 5 && day >= 21) || (month === 6 && day <= 20)) return '双子座'\n if ((month === 6 && day >= 21) || (month === 7 && day <= 22)) return '巨蟹座'\n if ((month === 7 && day >= 23) || (month === 8 && day <= 22)) return '狮子座'\n if ((month === 8 && day >= 23) || (month === 9 && day <= 22)) return '处女座'\n if ((month === 9 && day >= 23) || (month === 10 && day <= 22)) return '天秤座'\n if ((month === 10 && day >= 23) || (month === 11 && day <= 21)) return '天蝎座'\n if ((month === 11 && day >= 22) || (month === 12 && day <= 21)) return '射手座'\n if ((month === 12 && day >= 22) || (month === 1 && day <= 19)) return '摩羯座'\n if ((month === 1 && day >= 20) || (month === 2 && day <= 18)) return '水瓶座'\n return '双鱼座'\n}\n\n/**\n * 判断是否是节日(简化版,仅支持主要节日)\n * @param date 日期\n */\nexport const isHoliday = (date: string | number | Date | Dayjs = new Date()): boolean => {\n const holidays: { [key: string]: string } = {\n '0101': '元旦',\n '0214': '情人节',\n '0308': '妇女节',\n '0401': '愚人节',\n '0501': '劳动节',\n '0504': '青年节',\n '0601': '儿童节',\n '0701': '建党节',\n '0801': '建军节',\n '0910': '教师节',\n '1001': '国庆节',\n '1224': '平安夜',\n '1225': '圣诞节'\n }\n\n const month = dayjs(date).format('MM')\n const day = dayjs(date).format('DD')\n const key = `${month}${day}`\n\n return holidays[key] !== undefined\n}\n\n/**\n * 获取节日名称(简化版)\n * @param date 日期\n */\nexport const getHolidayName = (date: string | number | Date | Dayjs = new Date()): string | null => {\n const holidays: { [key: string]: string } = {\n '0101': '元旦',\n '0214': '情人节',\n '0308': '妇女节',\n '0401': '愚人节',\n '0501': '劳动节',\n '0504': '青年节',\n '0601': '儿童节',\n '0701': '建党节',\n '0801': '建军节',\n '0910': '教师节',\n '1001': '国庆节',\n '1224': '平安夜',\n '1225': '圣诞节'\n }\n\n const month = dayjs(date).format('MM')\n const day = dayjs(date).format('DD')\n const key = `${month}${day}`\n\n return holidays[key] || null\n}\n\n/**\n * 解析字符串为日期\n * @param dateString 日期字符串\n * @param formatStr 格式\n */\nexport const parse = (dateString: string, formatStr?: string): Dayjs => {\n return formatStr ? dayjs(dateString, formatStr) : dayjs(dateString)\n}\n\n/**\n * 格式化为相对时间(未来)\n * @param date 日期\n */\nexport const toNow = (date: string | number | Date | Dayjs): string => {\n return dayjs(date).toNow()\n}\n\n/**\n * 克隆日期\n * @param date 日期\n */\nexport const clone = (date: string | number | Date | Dayjs): Dayjs => {\n return dayjs(date).clone()\n}\n\n/**\n * 获取 Unix 时间戳(秒)\n * @param date 日期\n */\nexport const unix = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).unix()\n}\n\n/**\n * 从 Unix 时间戳创建日期\n * @param timestamp Unix 时间戳(秒)\n */\nexport const fromUnix = (timestamp: number): Dayjs => {\n return dayjs.unix(timestamp)\n}\n\n/**\n * 获取毫秒时间戳\n * @param date 日期\n */\nexport const valueOf = (date: string | number | Date | Dayjs = new Date()): number => {\n return dayjs(date).valueOf()\n}\n\n// 默认导出\nexport default dayjs\n"]}
|
package/dist/excel.cjs
ADDED
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var XLSX = require('xlsx');
|
|
4
|
+
|
|
5
|
+
function _interopNamespace(e) {
|
|
6
|
+
if (e && e.__esModule) return e;
|
|
7
|
+
var n = Object.create(null);
|
|
8
|
+
if (e) {
|
|
9
|
+
Object.keys(e).forEach(function (k) {
|
|
10
|
+
if (k !== 'default') {
|
|
11
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
12
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: function () { return e[k]; }
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
n.default = e;
|
|
20
|
+
return Object.freeze(n);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
var XLSX__namespace = /*#__PURE__*/_interopNamespace(XLSX);
|
|
24
|
+
|
|
25
|
+
// src/modules/excel/index.ts
|
|
26
|
+
var exportExcel = (data, options = {}) => {
|
|
27
|
+
const { filename = "export.xlsx", sheetName = "Sheet1", header } = options;
|
|
28
|
+
const processedData = header ? data.map((item) => {
|
|
29
|
+
const row = {};
|
|
30
|
+
for (const key in header) {
|
|
31
|
+
row[header[key]] = item[key];
|
|
32
|
+
}
|
|
33
|
+
return row;
|
|
34
|
+
}) : data;
|
|
35
|
+
const worksheet = XLSX__namespace.utils.json_to_sheet(processedData);
|
|
36
|
+
const workbook = XLSX__namespace.utils.book_new();
|
|
37
|
+
XLSX__namespace.utils.book_append_sheet(workbook, worksheet, sheetName);
|
|
38
|
+
XLSX__namespace.writeFile(workbook, filename);
|
|
39
|
+
};
|
|
40
|
+
var exportMultiSheetExcel = (sheetsData, filename = "export.xlsx") => {
|
|
41
|
+
const workbook = XLSX__namespace.utils.book_new();
|
|
42
|
+
sheetsData.forEach(({ name, data, header }) => {
|
|
43
|
+
const processedData = header ? data.map((item) => {
|
|
44
|
+
const row = {};
|
|
45
|
+
for (const key in header) {
|
|
46
|
+
row[header[key]] = item[key];
|
|
47
|
+
}
|
|
48
|
+
return row;
|
|
49
|
+
}) : data;
|
|
50
|
+
const worksheet = XLSX__namespace.utils.json_to_sheet(processedData);
|
|
51
|
+
XLSX__namespace.utils.book_append_sheet(workbook, worksheet, name);
|
|
52
|
+
});
|
|
53
|
+
XLSX__namespace.writeFile(workbook, filename);
|
|
54
|
+
};
|
|
55
|
+
var importExcel = (file, options = {}) => {
|
|
56
|
+
return new Promise((resolve, reject) => {
|
|
57
|
+
const { header = 0, raw = false, defval = "" } = options;
|
|
58
|
+
const reader = new FileReader();
|
|
59
|
+
reader.onload = (e) => {
|
|
60
|
+
try {
|
|
61
|
+
const data = e.target?.result;
|
|
62
|
+
if (!data) {
|
|
63
|
+
throw new Error("Failed to read file");
|
|
64
|
+
}
|
|
65
|
+
const workbook = XLSX__namespace.read(data, { type: "binary" });
|
|
66
|
+
const sheetName = workbook.SheetNames[0];
|
|
67
|
+
const worksheet = workbook.Sheets[sheetName];
|
|
68
|
+
const jsonData = XLSX__namespace.utils.sheet_to_json(worksheet, {
|
|
69
|
+
header,
|
|
70
|
+
raw,
|
|
71
|
+
defval
|
|
72
|
+
});
|
|
73
|
+
resolve(jsonData);
|
|
74
|
+
} catch (error) {
|
|
75
|
+
reject(new Error(String(error)));
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
reader.onerror = (error) => {
|
|
79
|
+
reject(new Error(String(error)));
|
|
80
|
+
};
|
|
81
|
+
if (file instanceof File) {
|
|
82
|
+
reader.readAsBinaryString(file);
|
|
83
|
+
} else {
|
|
84
|
+
reader.readAsBinaryString(new Blob([file]));
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
};
|
|
88
|
+
var importAllSheetsExcel = (file, options = {}) => {
|
|
89
|
+
return new Promise((resolve, reject) => {
|
|
90
|
+
const { header = 0, raw = false, defval = "" } = options;
|
|
91
|
+
const reader = new FileReader();
|
|
92
|
+
reader.onload = (e) => {
|
|
93
|
+
try {
|
|
94
|
+
const data = e.target?.result;
|
|
95
|
+
if (!data) {
|
|
96
|
+
throw new Error("Failed to read file");
|
|
97
|
+
}
|
|
98
|
+
const workbook = XLSX__namespace.read(data, { type: "binary" });
|
|
99
|
+
const result = {};
|
|
100
|
+
workbook.SheetNames.forEach((sheetName) => {
|
|
101
|
+
const worksheet = workbook.Sheets[sheetName];
|
|
102
|
+
result[sheetName] = XLSX__namespace.utils.sheet_to_json(worksheet, {
|
|
103
|
+
header,
|
|
104
|
+
raw,
|
|
105
|
+
defval
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
resolve(result);
|
|
109
|
+
} catch (error) {
|
|
110
|
+
reject(new Error(String(error)));
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
reader.onerror = (error) => {
|
|
114
|
+
reject(new Error(String(error)));
|
|
115
|
+
};
|
|
116
|
+
if (file instanceof File) {
|
|
117
|
+
reader.readAsBinaryString(file);
|
|
118
|
+
} else {
|
|
119
|
+
reader.readAsBinaryString(new Blob([file]));
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
};
|
|
123
|
+
var exportExcelWithHeaders = (data, headers, filename = "export.xlsx", sheetName = "Sheet1") => {
|
|
124
|
+
const worksheet = XLSX__namespace.utils.json_to_sheet([]);
|
|
125
|
+
XLSX__namespace.utils.sheet_add_aoa(worksheet, [headers.map((h) => h.label)], { origin: "A1" });
|
|
126
|
+
const rows = data.map((item) => headers.map((h) => item[h.key]));
|
|
127
|
+
XLSX__namespace.utils.sheet_add_aoa(worksheet, rows, { origin: "A2" });
|
|
128
|
+
const workbook = XLSX__namespace.utils.book_new();
|
|
129
|
+
XLSX__namespace.utils.book_append_sheet(workbook, worksheet, sheetName);
|
|
130
|
+
XLSX__namespace.writeFile(workbook, filename);
|
|
131
|
+
};
|
|
132
|
+
var exportExcelWithColumnWidths = (data, columnWidths, options = {}) => {
|
|
133
|
+
const { filename = "export.xlsx", sheetName = "Sheet1", header } = options;
|
|
134
|
+
const processedData = header ? data.map((item) => {
|
|
135
|
+
const row = {};
|
|
136
|
+
for (const key in header) {
|
|
137
|
+
row[header[key]] = item[key];
|
|
138
|
+
}
|
|
139
|
+
return row;
|
|
140
|
+
}) : data;
|
|
141
|
+
const worksheet = XLSX__namespace.utils.json_to_sheet(processedData);
|
|
142
|
+
worksheet["!cols"] = columnWidths;
|
|
143
|
+
const workbook = XLSX__namespace.utils.book_new();
|
|
144
|
+
XLSX__namespace.utils.book_append_sheet(workbook, worksheet, sheetName);
|
|
145
|
+
XLSX__namespace.writeFile(workbook, filename);
|
|
146
|
+
};
|
|
147
|
+
var exportExcelWithMerges = (data, merges, options = {}) => {
|
|
148
|
+
const { filename = "export.xlsx", sheetName = "Sheet1", header } = options;
|
|
149
|
+
const processedData = header ? data.map((item) => {
|
|
150
|
+
const row = {};
|
|
151
|
+
for (const key in header) {
|
|
152
|
+
row[header[key]] = item[key];
|
|
153
|
+
}
|
|
154
|
+
return row;
|
|
155
|
+
}) : data;
|
|
156
|
+
const worksheet = XLSX__namespace.utils.json_to_sheet(processedData);
|
|
157
|
+
worksheet["!merges"] = merges;
|
|
158
|
+
const workbook = XLSX__namespace.utils.book_new();
|
|
159
|
+
XLSX__namespace.utils.book_append_sheet(workbook, worksheet, sheetName);
|
|
160
|
+
XLSX__namespace.writeFile(workbook, filename);
|
|
161
|
+
};
|
|
162
|
+
var getSheetNames = (file) => {
|
|
163
|
+
return new Promise((resolve, reject) => {
|
|
164
|
+
const reader = new FileReader();
|
|
165
|
+
reader.onload = (e) => {
|
|
166
|
+
try {
|
|
167
|
+
const data = e.target?.result;
|
|
168
|
+
if (!data) {
|
|
169
|
+
throw new Error("Failed to read file");
|
|
170
|
+
}
|
|
171
|
+
const workbook = XLSX__namespace.read(data, { type: "binary" });
|
|
172
|
+
resolve(workbook.SheetNames);
|
|
173
|
+
} catch (error) {
|
|
174
|
+
reject(new Error(String(error)));
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
reader.onerror = (error) => {
|
|
178
|
+
reject(new Error(String(error)));
|
|
179
|
+
};
|
|
180
|
+
if (file instanceof File) {
|
|
181
|
+
reader.readAsBinaryString(file);
|
|
182
|
+
} else {
|
|
183
|
+
reader.readAsBinaryString(new Blob([file]));
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
};
|
|
187
|
+
var exportTableToExcel = (tableElement, filename = "export.xlsx") => {
|
|
188
|
+
const workbook = XLSX__namespace.utils.table_to_book(tableElement);
|
|
189
|
+
XLSX__namespace.writeFile(workbook, filename);
|
|
190
|
+
};
|
|
191
|
+
var excelToTable = (file, sheetIndex = 0) => {
|
|
192
|
+
return new Promise((resolve, reject) => {
|
|
193
|
+
const reader = new FileReader();
|
|
194
|
+
reader.onload = (e) => {
|
|
195
|
+
try {
|
|
196
|
+
const data = e.target?.result;
|
|
197
|
+
if (!data) {
|
|
198
|
+
throw new Error("Failed to read file");
|
|
199
|
+
}
|
|
200
|
+
const workbook = XLSX__namespace.read(data, { type: "binary" });
|
|
201
|
+
const sheetName = workbook.SheetNames[sheetIndex];
|
|
202
|
+
const worksheet = workbook.Sheets[sheetName];
|
|
203
|
+
const html = XLSX__namespace.utils.sheet_to_html(worksheet);
|
|
204
|
+
resolve(html);
|
|
205
|
+
} catch (error) {
|
|
206
|
+
reject(new Error(String(error)));
|
|
207
|
+
}
|
|
208
|
+
};
|
|
209
|
+
reader.onerror = (error) => {
|
|
210
|
+
reject(new Error(String(error)));
|
|
211
|
+
};
|
|
212
|
+
reader.readAsBinaryString(file);
|
|
213
|
+
});
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
exports.excelToTable = excelToTable;
|
|
217
|
+
exports.exportExcel = exportExcel;
|
|
218
|
+
exports.exportExcelWithColumnWidths = exportExcelWithColumnWidths;
|
|
219
|
+
exports.exportExcelWithHeaders = exportExcelWithHeaders;
|
|
220
|
+
exports.exportExcelWithMerges = exportExcelWithMerges;
|
|
221
|
+
exports.exportMultiSheetExcel = exportMultiSheetExcel;
|
|
222
|
+
exports.exportTableToExcel = exportTableToExcel;
|
|
223
|
+
exports.getSheetNames = getSheetNames;
|
|
224
|
+
exports.importAllSheetsExcel = importAllSheetsExcel;
|
|
225
|
+
exports.importExcel = importExcel;
|
|
226
|
+
//# sourceMappingURL=excel.cjs.map
|
|
227
|
+
//# sourceMappingURL=excel.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/modules/excel/index.ts"],"names":["XLSX"],"mappings":"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","file":"excel.cjs","sourcesContent":["/**\n * Excel 工具模块\n * 基于 xlsx 封装,提供常用的 Excel 处理功能\n */\n\nimport * as XLSX from 'xlsx'\n\nexport interface ExcelExportOptions {\n filename?: string\n sheetName?: string\n header?: Record<string, string>\n}\n\nexport interface ExcelImportOptions {\n header?: number\n raw?: boolean\n defval?: any\n}\n\n/**\n * 导出 Excel\n * @param data 数据\n * @param options 选项\n */\nexport const exportExcel = <T extends Record<string, any>>(\n data: T[],\n options: ExcelExportOptions = {}\n): void => {\n const { filename = 'export.xlsx', sheetName = 'Sheet1', header } = options\n\n // 处理表头映射\n const processedData = header\n ? data.map(item => {\n const row: Record<string, any> = {}\n for (const key in header) {\n row[header[key]] = item[key]\n }\n return row\n })\n : data\n\n // 创建工作簿\n const worksheet = XLSX.utils.json_to_sheet(processedData)\n const workbook = XLSX.utils.book_new()\n XLSX.utils.book_append_sheet(workbook, worksheet, sheetName)\n\n // 下载文件\n XLSX.writeFile(workbook, filename)\n}\n\n/**\n * 导出 Excel(多 Sheet)\n * @param sheetsData Sheet 数据\n * @param filename 文件名\n */\nexport const exportMultiSheetExcel = (\n sheetsData: Array<{ name: string; data: Record<string, any>[]; header?: Record<string, string> }>,\n filename = 'export.xlsx'\n): void => {\n const workbook = XLSX.utils.book_new()\n\n sheetsData.forEach(({ name, data, header }) => {\n const processedData = header\n ? data.map(item => {\n const row: Record<string, any> = {}\n for (const key in header) {\n row[header[key]] = item[key]\n }\n return row\n })\n : data\n\n const worksheet = XLSX.utils.json_to_sheet(processedData)\n XLSX.utils.book_append_sheet(workbook, worksheet, name)\n })\n\n XLSX.writeFile(workbook, filename)\n}\n\n/**\n * 导入 Excel\n * @param file 文件\n * @param options 选项\n */\nexport const importExcel = <T = Record<string, any>>(\n file: File | ArrayBuffer,\n options: ExcelImportOptions = {}\n): Promise<T[]> => {\n return new Promise((resolve, reject) => {\n const { header = 0, raw = false, defval = '' } = options\n\n const reader = new FileReader()\n\n reader.onload = e => {\n try {\n const data = e.target?.result\n if (!data) {\n throw new Error('Failed to read file')\n }\n\n const workbook = XLSX.read(data, { type: 'binary' })\n const sheetName = workbook.SheetNames[0]\n const worksheet = workbook.Sheets[sheetName]\n\n const jsonData = XLSX.utils.sheet_to_json<T>(worksheet, {\n header,\n raw,\n defval,\n })\n\n resolve(jsonData)\n } catch (error) {\n reject(new Error(String(error)))\n }\n }\n\n reader.onerror = error => {\n reject(new Error(String(error)))\n }\n\n if (file instanceof File) {\n reader.readAsBinaryString(file)\n } else {\n reader.readAsBinaryString(new Blob([file]))\n }\n })\n}\n\n/**\n * 导入 Excel(所有 Sheet)\n * @param file 文件\n * @param options 选项\n */\nexport const importAllSheetsExcel = <T = Record<string, any>>(\n file: File | ArrayBuffer,\n options: ExcelImportOptions = {}\n): Promise<Record<string, T[]>> => {\n return new Promise((resolve, reject) => {\n const { header = 0, raw = false, defval = '' } = options\n\n const reader = new FileReader()\n\n reader.onload = e => {\n try {\n const data = e.target?.result\n if (!data) {\n throw new Error('Failed to read file')\n }\n\n const workbook = XLSX.read(data, { type: 'binary' })\n const result: Record<string, T[]> = {}\n\n workbook.SheetNames.forEach(sheetName => {\n const worksheet = workbook.Sheets[sheetName]\n result[sheetName] = XLSX.utils.sheet_to_json<T>(worksheet, {\n header,\n raw,\n defval,\n })\n })\n\n resolve(result)\n } catch (error) {\n reject(new Error(String(error)))\n }\n }\n\n reader.onerror = error => {\n reject(new Error(String(error)))\n }\n\n if (file instanceof File) {\n reader.readAsBinaryString(file)\n } else {\n reader.readAsBinaryString(new Blob([file]))\n }\n })\n}\n\n/**\n * 导出 Excel(使用自定义表头)\n * @param data 数据\n * @param headers 表头\n * @param filename 文件名\n * @param sheetName Sheet 名称\n */\nexport const exportExcelWithHeaders = (\n data: Record<string, any>[],\n headers: { key: string; label: string }[],\n filename = 'export.xlsx',\n sheetName = 'Sheet1'\n): void => {\n const worksheet = XLSX.utils.json_to_sheet([])\n\n // 添加表头\n XLSX.utils.sheet_add_aoa(worksheet, [headers.map(h => h.label)], { origin: 'A1' })\n\n // 添加数据\n const rows = data.map(item => headers.map(h => item[h.key]))\n XLSX.utils.sheet_add_aoa(worksheet, rows, { origin: 'A2' })\n\n const workbook = XLSX.utils.book_new()\n XLSX.utils.book_append_sheet(workbook, worksheet, sheetName)\n XLSX.writeFile(workbook, filename)\n}\n\n/**\n * 导出 Excel(设置列宽)\n * @param data 数据\n * @param columnWidths 列宽\n * @param options 其他选项\n */\nexport const exportExcelWithColumnWidths = (\n data: Record<string, any>[],\n columnWidths: { wch?: number; wpx?: number; width?: number }[],\n options: ExcelExportOptions = {}\n): void => {\n const { filename = 'export.xlsx', sheetName = 'Sheet1', header } = options\n\n const processedData = header\n ? data.map(item => {\n const row: Record<string, any> = {}\n for (const key in header) {\n row[header[key]] = item[key]\n }\n return row\n })\n : data\n\n const worksheet = XLSX.utils.json_to_sheet(processedData)\n\n // 设置列宽\n worksheet['!cols'] = columnWidths\n\n const workbook = XLSX.utils.book_new()\n XLSX.utils.book_append_sheet(workbook, worksheet, sheetName)\n XLSX.writeFile(workbook, filename)\n}\n\n/**\n * 导出 Excel(合并单元格)\n * @param data 数据\n * @param merges 合并区域\n * @param options 其他选项\n */\nexport const exportExcelWithMerges = (\n data: Record<string, any>[],\n merges: XLSX.Range[],\n options: ExcelExportOptions = {}\n): void => {\n const { filename = 'export.xlsx', sheetName = 'Sheet1', header } = options\n\n const processedData = header\n ? data.map(item => {\n const row: Record<string, any> = {}\n for (const key in header) {\n row[header[key]] = item[key]\n }\n return row\n })\n : data\n\n const worksheet = XLSX.utils.json_to_sheet(processedData)\n\n // 合并单元格\n worksheet['!merges'] = merges\n\n const workbook = XLSX.utils.book_new()\n XLSX.utils.book_append_sheet(workbook, worksheet, sheetName)\n XLSX.writeFile(workbook, filename)\n}\n\n/**\n * 获取 Excel 的 Sheet 列表\n * @param file 文件\n */\nexport const getSheetNames = (file: File | ArrayBuffer): Promise<string[]> => {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n\n reader.onload = e => {\n try {\n const data = e.target?.result\n if (!data) {\n throw new Error('Failed to read file')\n }\n\n const workbook = XLSX.read(data, { type: 'binary' })\n resolve(workbook.SheetNames)\n } catch (error) {\n reject(new Error(String(error)))\n }\n }\n\n reader.onerror = error => {\n reject(new Error(String(error)))\n }\n\n if (file instanceof File) {\n reader.readAsBinaryString(file)\n } else {\n reader.readAsBinaryString(new Blob([file]))\n }\n })\n}\n\n/**\n * 将 HTML 表格导出为 Excel\n * @param tableElement 表格元素\n * @param filename 文件名\n */\nexport const exportTableToExcel = (\n tableElement: HTMLTableElement,\n filename = 'export.xlsx'\n): void => {\n const workbook = XLSX.utils.table_to_book(tableElement)\n XLSX.writeFile(workbook, filename)\n}\n\n/**\n * 将 Excel 转换为 HTML 表格\n * @param file 文件\n * @param sheetIndex Sheet 索引\n */\nexport const excelToTable = (file: File, sheetIndex = 0): Promise<string> => {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n\n reader.onload = e => {\n try {\n const data = e.target?.result\n if (!data) {\n throw new Error('Failed to read file')\n }\n\n const workbook = XLSX.read(data, { type: 'binary' })\n const sheetName = workbook.SheetNames[sheetIndex]\n const worksheet = workbook.Sheets[sheetName]\n\n const html = XLSX.utils.sheet_to_html(worksheet)\n resolve(html)\n } catch (error) {\n reject(new Error(String(error)))\n }\n }\n\n reader.onerror = error => {\n reject(new Error(String(error)))\n }\n\n reader.readAsBinaryString(file)\n })\n}\n"]}
|
package/dist/excel.d.cts
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import 'xlsx';
|
|
2
|
+
export { E as ExcelExportOptions, a as ExcelImportOptions, e as excelToTable, b as exportExcel, c as exportExcelWithColumnWidths, d as exportExcelWithHeaders, f as exportExcelWithMerges, g as exportMultiSheetExcel, h as exportTableToExcel, j as getSheetNames, k as importAllSheetsExcel, l as importExcel } from './index-YXWfKCK7.cjs';
|
package/dist/excel.d.ts
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import 'xlsx';
|
|
2
|
+
export { E as ExcelExportOptions, a as ExcelImportOptions, e as excelToTable, b as exportExcel, c as exportExcelWithColumnWidths, d as exportExcelWithHeaders, f as exportExcelWithMerges, g as exportMultiSheetExcel, h as exportTableToExcel, j as getSheetNames, k as importAllSheetsExcel, l as importExcel } from './index-YXWfKCK7.js';
|
package/dist/excel.js
ADDED
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import * as XLSX from 'xlsx';
|
|
2
|
+
|
|
3
|
+
// src/modules/excel/index.ts
|
|
4
|
+
var exportExcel = (data, options = {}) => {
|
|
5
|
+
const { filename = "export.xlsx", sheetName = "Sheet1", header } = options;
|
|
6
|
+
const processedData = header ? data.map((item) => {
|
|
7
|
+
const row = {};
|
|
8
|
+
for (const key in header) {
|
|
9
|
+
row[header[key]] = item[key];
|
|
10
|
+
}
|
|
11
|
+
return row;
|
|
12
|
+
}) : data;
|
|
13
|
+
const worksheet = XLSX.utils.json_to_sheet(processedData);
|
|
14
|
+
const workbook = XLSX.utils.book_new();
|
|
15
|
+
XLSX.utils.book_append_sheet(workbook, worksheet, sheetName);
|
|
16
|
+
XLSX.writeFile(workbook, filename);
|
|
17
|
+
};
|
|
18
|
+
var exportMultiSheetExcel = (sheetsData, filename = "export.xlsx") => {
|
|
19
|
+
const workbook = XLSX.utils.book_new();
|
|
20
|
+
sheetsData.forEach(({ name, data, header }) => {
|
|
21
|
+
const processedData = header ? data.map((item) => {
|
|
22
|
+
const row = {};
|
|
23
|
+
for (const key in header) {
|
|
24
|
+
row[header[key]] = item[key];
|
|
25
|
+
}
|
|
26
|
+
return row;
|
|
27
|
+
}) : data;
|
|
28
|
+
const worksheet = XLSX.utils.json_to_sheet(processedData);
|
|
29
|
+
XLSX.utils.book_append_sheet(workbook, worksheet, name);
|
|
30
|
+
});
|
|
31
|
+
XLSX.writeFile(workbook, filename);
|
|
32
|
+
};
|
|
33
|
+
var importExcel = (file, options = {}) => {
|
|
34
|
+
return new Promise((resolve, reject) => {
|
|
35
|
+
const { header = 0, raw = false, defval = "" } = options;
|
|
36
|
+
const reader = new FileReader();
|
|
37
|
+
reader.onload = (e) => {
|
|
38
|
+
try {
|
|
39
|
+
const data = e.target?.result;
|
|
40
|
+
if (!data) {
|
|
41
|
+
throw new Error("Failed to read file");
|
|
42
|
+
}
|
|
43
|
+
const workbook = XLSX.read(data, { type: "binary" });
|
|
44
|
+
const sheetName = workbook.SheetNames[0];
|
|
45
|
+
const worksheet = workbook.Sheets[sheetName];
|
|
46
|
+
const jsonData = XLSX.utils.sheet_to_json(worksheet, {
|
|
47
|
+
header,
|
|
48
|
+
raw,
|
|
49
|
+
defval
|
|
50
|
+
});
|
|
51
|
+
resolve(jsonData);
|
|
52
|
+
} catch (error) {
|
|
53
|
+
reject(new Error(String(error)));
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
reader.onerror = (error) => {
|
|
57
|
+
reject(new Error(String(error)));
|
|
58
|
+
};
|
|
59
|
+
if (file instanceof File) {
|
|
60
|
+
reader.readAsBinaryString(file);
|
|
61
|
+
} else {
|
|
62
|
+
reader.readAsBinaryString(new Blob([file]));
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
};
|
|
66
|
+
var importAllSheetsExcel = (file, options = {}) => {
|
|
67
|
+
return new Promise((resolve, reject) => {
|
|
68
|
+
const { header = 0, raw = false, defval = "" } = options;
|
|
69
|
+
const reader = new FileReader();
|
|
70
|
+
reader.onload = (e) => {
|
|
71
|
+
try {
|
|
72
|
+
const data = e.target?.result;
|
|
73
|
+
if (!data) {
|
|
74
|
+
throw new Error("Failed to read file");
|
|
75
|
+
}
|
|
76
|
+
const workbook = XLSX.read(data, { type: "binary" });
|
|
77
|
+
const result = {};
|
|
78
|
+
workbook.SheetNames.forEach((sheetName) => {
|
|
79
|
+
const worksheet = workbook.Sheets[sheetName];
|
|
80
|
+
result[sheetName] = XLSX.utils.sheet_to_json(worksheet, {
|
|
81
|
+
header,
|
|
82
|
+
raw,
|
|
83
|
+
defval
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
resolve(result);
|
|
87
|
+
} catch (error) {
|
|
88
|
+
reject(new Error(String(error)));
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
reader.onerror = (error) => {
|
|
92
|
+
reject(new Error(String(error)));
|
|
93
|
+
};
|
|
94
|
+
if (file instanceof File) {
|
|
95
|
+
reader.readAsBinaryString(file);
|
|
96
|
+
} else {
|
|
97
|
+
reader.readAsBinaryString(new Blob([file]));
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
};
|
|
101
|
+
var exportExcelWithHeaders = (data, headers, filename = "export.xlsx", sheetName = "Sheet1") => {
|
|
102
|
+
const worksheet = XLSX.utils.json_to_sheet([]);
|
|
103
|
+
XLSX.utils.sheet_add_aoa(worksheet, [headers.map((h) => h.label)], { origin: "A1" });
|
|
104
|
+
const rows = data.map((item) => headers.map((h) => item[h.key]));
|
|
105
|
+
XLSX.utils.sheet_add_aoa(worksheet, rows, { origin: "A2" });
|
|
106
|
+
const workbook = XLSX.utils.book_new();
|
|
107
|
+
XLSX.utils.book_append_sheet(workbook, worksheet, sheetName);
|
|
108
|
+
XLSX.writeFile(workbook, filename);
|
|
109
|
+
};
|
|
110
|
+
var exportExcelWithColumnWidths = (data, columnWidths, options = {}) => {
|
|
111
|
+
const { filename = "export.xlsx", sheetName = "Sheet1", header } = options;
|
|
112
|
+
const processedData = header ? data.map((item) => {
|
|
113
|
+
const row = {};
|
|
114
|
+
for (const key in header) {
|
|
115
|
+
row[header[key]] = item[key];
|
|
116
|
+
}
|
|
117
|
+
return row;
|
|
118
|
+
}) : data;
|
|
119
|
+
const worksheet = XLSX.utils.json_to_sheet(processedData);
|
|
120
|
+
worksheet["!cols"] = columnWidths;
|
|
121
|
+
const workbook = XLSX.utils.book_new();
|
|
122
|
+
XLSX.utils.book_append_sheet(workbook, worksheet, sheetName);
|
|
123
|
+
XLSX.writeFile(workbook, filename);
|
|
124
|
+
};
|
|
125
|
+
var exportExcelWithMerges = (data, merges, options = {}) => {
|
|
126
|
+
const { filename = "export.xlsx", sheetName = "Sheet1", header } = options;
|
|
127
|
+
const processedData = header ? data.map((item) => {
|
|
128
|
+
const row = {};
|
|
129
|
+
for (const key in header) {
|
|
130
|
+
row[header[key]] = item[key];
|
|
131
|
+
}
|
|
132
|
+
return row;
|
|
133
|
+
}) : data;
|
|
134
|
+
const worksheet = XLSX.utils.json_to_sheet(processedData);
|
|
135
|
+
worksheet["!merges"] = merges;
|
|
136
|
+
const workbook = XLSX.utils.book_new();
|
|
137
|
+
XLSX.utils.book_append_sheet(workbook, worksheet, sheetName);
|
|
138
|
+
XLSX.writeFile(workbook, filename);
|
|
139
|
+
};
|
|
140
|
+
var getSheetNames = (file) => {
|
|
141
|
+
return new Promise((resolve, reject) => {
|
|
142
|
+
const reader = new FileReader();
|
|
143
|
+
reader.onload = (e) => {
|
|
144
|
+
try {
|
|
145
|
+
const data = e.target?.result;
|
|
146
|
+
if (!data) {
|
|
147
|
+
throw new Error("Failed to read file");
|
|
148
|
+
}
|
|
149
|
+
const workbook = XLSX.read(data, { type: "binary" });
|
|
150
|
+
resolve(workbook.SheetNames);
|
|
151
|
+
} catch (error) {
|
|
152
|
+
reject(new Error(String(error)));
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
reader.onerror = (error) => {
|
|
156
|
+
reject(new Error(String(error)));
|
|
157
|
+
};
|
|
158
|
+
if (file instanceof File) {
|
|
159
|
+
reader.readAsBinaryString(file);
|
|
160
|
+
} else {
|
|
161
|
+
reader.readAsBinaryString(new Blob([file]));
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
};
|
|
165
|
+
var exportTableToExcel = (tableElement, filename = "export.xlsx") => {
|
|
166
|
+
const workbook = XLSX.utils.table_to_book(tableElement);
|
|
167
|
+
XLSX.writeFile(workbook, filename);
|
|
168
|
+
};
|
|
169
|
+
var excelToTable = (file, sheetIndex = 0) => {
|
|
170
|
+
return new Promise((resolve, reject) => {
|
|
171
|
+
const reader = new FileReader();
|
|
172
|
+
reader.onload = (e) => {
|
|
173
|
+
try {
|
|
174
|
+
const data = e.target?.result;
|
|
175
|
+
if (!data) {
|
|
176
|
+
throw new Error("Failed to read file");
|
|
177
|
+
}
|
|
178
|
+
const workbook = XLSX.read(data, { type: "binary" });
|
|
179
|
+
const sheetName = workbook.SheetNames[sheetIndex];
|
|
180
|
+
const worksheet = workbook.Sheets[sheetName];
|
|
181
|
+
const html = XLSX.utils.sheet_to_html(worksheet);
|
|
182
|
+
resolve(html);
|
|
183
|
+
} catch (error) {
|
|
184
|
+
reject(new Error(String(error)));
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
reader.onerror = (error) => {
|
|
188
|
+
reject(new Error(String(error)));
|
|
189
|
+
};
|
|
190
|
+
reader.readAsBinaryString(file);
|
|
191
|
+
});
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
export { excelToTable, exportExcel, exportExcelWithColumnWidths, exportExcelWithHeaders, exportExcelWithMerges, exportMultiSheetExcel, exportTableToExcel, getSheetNames, importAllSheetsExcel, importExcel };
|
|
195
|
+
//# sourceMappingURL=excel.js.map
|
|
196
|
+
//# sourceMappingURL=excel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/modules/excel/index.ts"],"names":[],"mappings":"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","file":"excel.js","sourcesContent":["/**\n * Excel 工具模块\n * 基于 xlsx 封装,提供常用的 Excel 处理功能\n */\n\nimport * as XLSX from 'xlsx'\n\nexport interface ExcelExportOptions {\n filename?: string\n sheetName?: string\n header?: Record<string, string>\n}\n\nexport interface ExcelImportOptions {\n header?: number\n raw?: boolean\n defval?: any\n}\n\n/**\n * 导出 Excel\n * @param data 数据\n * @param options 选项\n */\nexport const exportExcel = <T extends Record<string, any>>(\n data: T[],\n options: ExcelExportOptions = {}\n): void => {\n const { filename = 'export.xlsx', sheetName = 'Sheet1', header } = options\n\n // 处理表头映射\n const processedData = header\n ? data.map(item => {\n const row: Record<string, any> = {}\n for (const key in header) {\n row[header[key]] = item[key]\n }\n return row\n })\n : data\n\n // 创建工作簿\n const worksheet = XLSX.utils.json_to_sheet(processedData)\n const workbook = XLSX.utils.book_new()\n XLSX.utils.book_append_sheet(workbook, worksheet, sheetName)\n\n // 下载文件\n XLSX.writeFile(workbook, filename)\n}\n\n/**\n * 导出 Excel(多 Sheet)\n * @param sheetsData Sheet 数据\n * @param filename 文件名\n */\nexport const exportMultiSheetExcel = (\n sheetsData: Array<{ name: string; data: Record<string, any>[]; header?: Record<string, string> }>,\n filename = 'export.xlsx'\n): void => {\n const workbook = XLSX.utils.book_new()\n\n sheetsData.forEach(({ name, data, header }) => {\n const processedData = header\n ? data.map(item => {\n const row: Record<string, any> = {}\n for (const key in header) {\n row[header[key]] = item[key]\n }\n return row\n })\n : data\n\n const worksheet = XLSX.utils.json_to_sheet(processedData)\n XLSX.utils.book_append_sheet(workbook, worksheet, name)\n })\n\n XLSX.writeFile(workbook, filename)\n}\n\n/**\n * 导入 Excel\n * @param file 文件\n * @param options 选项\n */\nexport const importExcel = <T = Record<string, any>>(\n file: File | ArrayBuffer,\n options: ExcelImportOptions = {}\n): Promise<T[]> => {\n return new Promise((resolve, reject) => {\n const { header = 0, raw = false, defval = '' } = options\n\n const reader = new FileReader()\n\n reader.onload = e => {\n try {\n const data = e.target?.result\n if (!data) {\n throw new Error('Failed to read file')\n }\n\n const workbook = XLSX.read(data, { type: 'binary' })\n const sheetName = workbook.SheetNames[0]\n const worksheet = workbook.Sheets[sheetName]\n\n const jsonData = XLSX.utils.sheet_to_json<T>(worksheet, {\n header,\n raw,\n defval,\n })\n\n resolve(jsonData)\n } catch (error) {\n reject(new Error(String(error)))\n }\n }\n\n reader.onerror = error => {\n reject(new Error(String(error)))\n }\n\n if (file instanceof File) {\n reader.readAsBinaryString(file)\n } else {\n reader.readAsBinaryString(new Blob([file]))\n }\n })\n}\n\n/**\n * 导入 Excel(所有 Sheet)\n * @param file 文件\n * @param options 选项\n */\nexport const importAllSheetsExcel = <T = Record<string, any>>(\n file: File | ArrayBuffer,\n options: ExcelImportOptions = {}\n): Promise<Record<string, T[]>> => {\n return new Promise((resolve, reject) => {\n const { header = 0, raw = false, defval = '' } = options\n\n const reader = new FileReader()\n\n reader.onload = e => {\n try {\n const data = e.target?.result\n if (!data) {\n throw new Error('Failed to read file')\n }\n\n const workbook = XLSX.read(data, { type: 'binary' })\n const result: Record<string, T[]> = {}\n\n workbook.SheetNames.forEach(sheetName => {\n const worksheet = workbook.Sheets[sheetName]\n result[sheetName] = XLSX.utils.sheet_to_json<T>(worksheet, {\n header,\n raw,\n defval,\n })\n })\n\n resolve(result)\n } catch (error) {\n reject(new Error(String(error)))\n }\n }\n\n reader.onerror = error => {\n reject(new Error(String(error)))\n }\n\n if (file instanceof File) {\n reader.readAsBinaryString(file)\n } else {\n reader.readAsBinaryString(new Blob([file]))\n }\n })\n}\n\n/**\n * 导出 Excel(使用自定义表头)\n * @param data 数据\n * @param headers 表头\n * @param filename 文件名\n * @param sheetName Sheet 名称\n */\nexport const exportExcelWithHeaders = (\n data: Record<string, any>[],\n headers: { key: string; label: string }[],\n filename = 'export.xlsx',\n sheetName = 'Sheet1'\n): void => {\n const worksheet = XLSX.utils.json_to_sheet([])\n\n // 添加表头\n XLSX.utils.sheet_add_aoa(worksheet, [headers.map(h => h.label)], { origin: 'A1' })\n\n // 添加数据\n const rows = data.map(item => headers.map(h => item[h.key]))\n XLSX.utils.sheet_add_aoa(worksheet, rows, { origin: 'A2' })\n\n const workbook = XLSX.utils.book_new()\n XLSX.utils.book_append_sheet(workbook, worksheet, sheetName)\n XLSX.writeFile(workbook, filename)\n}\n\n/**\n * 导出 Excel(设置列宽)\n * @param data 数据\n * @param columnWidths 列宽\n * @param options 其他选项\n */\nexport const exportExcelWithColumnWidths = (\n data: Record<string, any>[],\n columnWidths: { wch?: number; wpx?: number; width?: number }[],\n options: ExcelExportOptions = {}\n): void => {\n const { filename = 'export.xlsx', sheetName = 'Sheet1', header } = options\n\n const processedData = header\n ? data.map(item => {\n const row: Record<string, any> = {}\n for (const key in header) {\n row[header[key]] = item[key]\n }\n return row\n })\n : data\n\n const worksheet = XLSX.utils.json_to_sheet(processedData)\n\n // 设置列宽\n worksheet['!cols'] = columnWidths\n\n const workbook = XLSX.utils.book_new()\n XLSX.utils.book_append_sheet(workbook, worksheet, sheetName)\n XLSX.writeFile(workbook, filename)\n}\n\n/**\n * 导出 Excel(合并单元格)\n * @param data 数据\n * @param merges 合并区域\n * @param options 其他选项\n */\nexport const exportExcelWithMerges = (\n data: Record<string, any>[],\n merges: XLSX.Range[],\n options: ExcelExportOptions = {}\n): void => {\n const { filename = 'export.xlsx', sheetName = 'Sheet1', header } = options\n\n const processedData = header\n ? data.map(item => {\n const row: Record<string, any> = {}\n for (const key in header) {\n row[header[key]] = item[key]\n }\n return row\n })\n : data\n\n const worksheet = XLSX.utils.json_to_sheet(processedData)\n\n // 合并单元格\n worksheet['!merges'] = merges\n\n const workbook = XLSX.utils.book_new()\n XLSX.utils.book_append_sheet(workbook, worksheet, sheetName)\n XLSX.writeFile(workbook, filename)\n}\n\n/**\n * 获取 Excel 的 Sheet 列表\n * @param file 文件\n */\nexport const getSheetNames = (file: File | ArrayBuffer): Promise<string[]> => {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n\n reader.onload = e => {\n try {\n const data = e.target?.result\n if (!data) {\n throw new Error('Failed to read file')\n }\n\n const workbook = XLSX.read(data, { type: 'binary' })\n resolve(workbook.SheetNames)\n } catch (error) {\n reject(new Error(String(error)))\n }\n }\n\n reader.onerror = error => {\n reject(new Error(String(error)))\n }\n\n if (file instanceof File) {\n reader.readAsBinaryString(file)\n } else {\n reader.readAsBinaryString(new Blob([file]))\n }\n })\n}\n\n/**\n * 将 HTML 表格导出为 Excel\n * @param tableElement 表格元素\n * @param filename 文件名\n */\nexport const exportTableToExcel = (\n tableElement: HTMLTableElement,\n filename = 'export.xlsx'\n): void => {\n const workbook = XLSX.utils.table_to_book(tableElement)\n XLSX.writeFile(workbook, filename)\n}\n\n/**\n * 将 Excel 转换为 HTML 表格\n * @param file 文件\n * @param sheetIndex Sheet 索引\n */\nexport const excelToTable = (file: File, sheetIndex = 0): Promise<string> => {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n\n reader.onload = e => {\n try {\n const data = e.target?.result\n if (!data) {\n throw new Error('Failed to read file')\n }\n\n const workbook = XLSX.read(data, { type: 'binary' })\n const sheetName = workbook.SheetNames[sheetIndex]\n const worksheet = workbook.Sheets[sheetName]\n\n const html = XLSX.utils.sheet_to_html(worksheet)\n resolve(html)\n } catch (error) {\n reject(new Error(String(error)))\n }\n }\n\n reader.onerror = error => {\n reject(new Error(String(error)))\n }\n\n reader.readAsBinaryString(file)\n })\n}\n"]}
|