Как разобрать вас, дата Excel

Node.js ThinkJS
Как разобрать вас, дата Excel

Простое вводное введение

Не так давно мы сами взялись за разработку front-end и back-end продуктов, и с тех пор живем жалкой жизнью, печатая код и радостно получая знания.

Это был ничем не примечательный понедельник, полдень

Сестра пользователя сказала в группе, что период действия рабочей карты не так просто проверить системой. (Система: Нет-нет, это не мой горшок.

Я просмотрел базу данных и обнаружил, что наш исходный формат даты истечения срока действия выглядит следующим образом.

аккуратно и аккуратно.

Данные в базе на тот момент такие

даже так

Глядя на эту ситуацию, я думаю, должно быть, вход неправильный (молодой...

Поэтому я решил начать с Excel

Процесс работы дам и сестер заключается в том, чтобы использовать нашу систему для экспорта копии Excel сначала, а затем импортировать ее в систему после редактирования.Пока я ограничиваю формат одного столбца этой рабочей карты на сегодняшний день, он будет обязательно в едином формате, гм.

Наш проект использует js-xlsx для обработки импорта и экспорта таблиц Ниже приведен псевдокод для экспорта Excel:

import * as XLSX from 'xlsx';

const xlsxMineType = 'application/vnd.openxmlformats-
officedocument.spreadsheetml.sheet'
const data = 数据.map((s: any) => ({
ID: s.id,
工卡有效期: s.card_expired,
……
}));

const sheet = XLSX.utils.json_to_sheet(data);
const wb = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(wb, sheet, '员工信息表');
const wbbuf = XLSX.write(wb, {
  type: 'base64'
});

this.success({ name: "员工信息表.xlsx", data: wbbuf, type:xlsxMineType });

Вы можете получить объект, содержащий информацию о ячейке, через json_to_sheet

{ 
 A2: { t: 'n', v: 3776 },
 B2: { t: 's', v: '2019-04-01' },
 A3: { t: 'n', v: 3831 },
 B3: { t: 's', v: '2019-04-01' },
 A1: { t: 's', v: 'ID' },
 B1: { t: 's', v: '工卡有效期' },
 '!ref': 'A1:B3' 
}

В объекте в качестве ключа используется позиция ячейки, а в качестве значения — значение (v), тип (t) и другие атрибуты каждой ячейки. Тип ячейки поддерживает:

b Boolean, n Number, e error, s String, d Date

Кажется, что тип Date очень хорошо соответствует вышеуказанным требованиям, поэтому я попробовал:

const sheet = XLSX.utils.json_to_sheet(data);
// 筛选出除表头的工卡列
Object.keys(sheet).filter(item => /^B/.test(item) && item !== "B1").forEach(key => {
   sheet[key].t = "d";
})

Однако, если срок действия рабочей карточки уже пуст, то экспорт и открытие Excel сообщит об ошибке, а пустая позиция станет NaN

Прочитав различные китайские и английские документы, проблемы и экспортировав более 100 информационных листов сотрудников, я обнаружил, что Excel действительно великолепен.Возможно, импортированные данные должны быть отформатированы в js, а не ограничивать тип ячеек.

Если вы не управляете типом ячейки, то когда администратор вводит дату, ячейка может быть: текстовой, обычной, даты, пользовательского типа, поэтому просто убедитесь, что независимо от формата ячейки программа может получить правильный Данные в порядке.

Когда тип ячейки срока действия рабочей карты, сделанный администратором, текстовый или обычный, это относительно просто.Программа может разобрать соответствующую строку, как и ожидалось, и использовать момент для ее разбора, а затем данные в нужном формат можно получить.

Затем, когда тип ячейки даты истечения срока действия является датой и пользовательским, данные, которые мы получаем, похожи на следующий рисунок.

Это происхождение странного числа в предыдущей базе данных Значение этого числа на самом деле является количеством дней от текущей даты до 0 января 1900 года. Также обратите внимание, что в Excel есть ошибка:

Он считает, что 1900 год високосный, поэтому мы получаем дополнительный день, потому что нам нужно вычесть один перед преобразованием...

item.工卡有效期 = new Date(1900, 0, expried - 1)

Тогда вы можете получить правильную дату. Бульк.