|
@@ -15,12 +15,25 @@
|
|
|
<script lang="ts">
|
|
|
import { defineComponent, ref, unref } from 'vue';
|
|
|
import XLSX from 'xlsx';
|
|
|
+ import { dateUtil } from '/@/utils/dateUtil';
|
|
|
|
|
|
import type { ExcelData } from './typing';
|
|
|
export default defineComponent({
|
|
|
name: 'ImportExcel',
|
|
|
+ props: {
|
|
|
+ // 日期时间格式。如果不提供或者提供空值,将返回原始Date对象
|
|
|
+ dateFormat: {
|
|
|
+ type: String,
|
|
|
+ },
|
|
|
+ // 时区调整。实验性功能,仅为了解决读取日期时间值有偏差的问题。目前仅提供了+08:00时区的偏差修正值
|
|
|
+ // https://github.com/SheetJS/sheetjs/issues/1470#issuecomment-501108554
|
|
|
+ timeZone: {
|
|
|
+ type: Number,
|
|
|
+ default: 8,
|
|
|
+ },
|
|
|
+ },
|
|
|
emits: ['success', 'error'],
|
|
|
- setup(_, { emit }) {
|
|
|
+ setup(props, { emit }) {
|
|
|
const inputRef = ref<HTMLInputElement | null>(null);
|
|
|
const loadingRef = ref<Boolean>(false);
|
|
|
|
|
@@ -51,10 +64,28 @@
|
|
|
*/
|
|
|
function getExcelData(workbook: XLSX.WorkBook) {
|
|
|
const excelData: ExcelData[] = [];
|
|
|
+ const { dateFormat, timeZone } = props;
|
|
|
for (const sheetName of workbook.SheetNames) {
|
|
|
const worksheet = workbook.Sheets[sheetName];
|
|
|
const header: string[] = getHeaderRow(worksheet);
|
|
|
- const results = XLSX.utils.sheet_to_json(worksheet);
|
|
|
+ let results = XLSX.utils.sheet_to_json(worksheet, {
|
|
|
+ raw: true,
|
|
|
+ dateNF: dateFormat, //Not worked
|
|
|
+ }) as object[];
|
|
|
+ results = results.map((row: object) => {
|
|
|
+ for (let field in row) {
|
|
|
+ if (row[field] instanceof Date) {
|
|
|
+ if (timeZone === 8) {
|
|
|
+ row[field].setSeconds(row[field].getSeconds() + 43);
|
|
|
+ }
|
|
|
+ if (dateFormat) {
|
|
|
+ row[field] = dateUtil(row[field]).format(dateFormat);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return row;
|
|
|
+ });
|
|
|
+
|
|
|
excelData.push({
|
|
|
header,
|
|
|
results,
|
|
@@ -76,7 +107,7 @@
|
|
|
reader.onload = async (e) => {
|
|
|
try {
|
|
|
const data = e.target && e.target.result;
|
|
|
- const workbook = XLSX.read(data, { type: 'array' });
|
|
|
+ const workbook = XLSX.read(data, { type: 'array', cellDates: true });
|
|
|
// console.log(workbook);
|
|
|
/* DO SOMETHING WITH workbook HERE */
|
|
|
const excelData = getExcelData(workbook);
|