Вопрос или проблема
У меня есть объекты JSON, содержащие динамические свойства, и я хочу экспортировать их в Excel так, чтобы Excel распознавал строку даты (2020-03-13) как объект даты (я не знаю тип никакого ключа JSON, поэтому не могу использовать тип или формат, строка даты также может включать временную метку). Когда я использую xlsx для загрузки Excel, сгенерированный Excel не распознает строку даты как тип даты Excel. Как я могу это решить с использованием библиотеки xlsx или без нее.
Я пытался использовать xlsx, но это не сработало. Также я пытался сначала создать строку tsv, а затем экспортировать ее как .xlsx, используя blob с типом mimetype файлов xlsx (но Excel не может его открыть).
Демо-код для JSON tsv в Excel
// Пример данных JSON
const jsonData = [
{ "name": "John Doe", "age": 28, "date": "2023-10-08" },
{ "name": "Jane Smith", "age": 32, "date": "2024-03-15" },
{ "name": "Alice Johnson", "age": 45, "date": "2024-01-20" }
];
// Преобразование JSON в TSV
function jsonToTsv(jsonData) {
const headers = Object.keys(jsonData[0]).join("\t"); // Получить заголовки из ключей JSON
const rows = jsonData.map(row =>
Object.values(row).join("\t") // Объединить значения с помощью табуляции
).join("\n"); // Объединить строки с помощью новой строки
return `${headers}\n${rows}`;
}
// Загрузка TSV как файла Excel
function downloadAsExcel(tsvData, fileName) {
// Создание Blob для данных TSV и указание MIME типа как Excel
const blob = new Blob([tsvData], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
// Создание URL для Blob
const url = URL.createObjectURL(blob);
// Создание элемента ссылки
const link = document.createElement('a');
link.href = url;
link.download = fileName; // Имя файла для загрузки
// Добавление ссылки в документ и вызов клика
document.body.appendChild(link);
link.click();
// Удаление элемента ссылки и отзыв объекта URL
document.body.removeChild(link);
URL.revokeObjectURL(url);
}
// Событие клика по кнопке для загрузки JSON как Excel
document.getElementById('download-btn').addEventListener('click', function () {
// Преобразование JSON в формат TSV
const tsvData = jsonToTsv(jsonData);
// Преобразование TSV в формат Excel и вызов загрузки
downloadAsExcel(tsvData, "data.xlsx");
});
Демо-код с использованием xlsx
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Загрузка Excel из JSON</title>
<!-- Добавить скрипт xlsx из CDN -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.18.5/xlsx.full.min.js"></script>
</head>
<body>
<button onclick="downloadExcel()">Загрузить Excel</button>
<script>
// Пример данных JSON
const jsonData = [
{ "name": "John Doe", "age": "28", "birthdate": "2023-10-08" },
{ "name": "Jane Smith", "age": "32", "birthdate": "2024-03-15" }
];
// Функция для преобразования данных JSON в Excel и вызова загрузки
function downloadExcel() {
// Создание новой книги и листа
const wb = XLSX.utils.book_new(); // Создание новой книги
const ws = XLSX.utils.json_to_sheet(jsonData); // Преобразование JSON в лист
// Добавление листа в книгу
XLSX.utils.book_append_sheet(wb, ws, 'Sheet1');
// Вызов загрузки файла Excel
XLSX.writeFile(wb, 'data.xlsx');
}
</body>
</html>
“хочу экспортировать его в Excel так, чтобы Excel распознавал строку даты (2020-03-13) как объект даты” – вы имеете в виду, что хотите импортировать файл JSON в Excel?
Вы можете использовать встроенную опцию для импорта файла JSON в Power Query.
[
{ "name": "John Doe", "age": 28, "date": "2023-10-08" },
{ "name": "Jane Smith", "age": 32, "date": "2024-03-15" },
{ "name": "Alice Johnson", "age": 45, "date": "2024-01-20" }
]
Перейдите в раздел Данные, Получить данные, Из файла, Из Json, найдите файл и откройте его. Файл откроется в Power Query:
Преобразуйте его в таблицу, разверните столбцы и отформатируйте необходимый столбец как даты:
let
Source = Json.Document(File.Contents("C:\Users\Michal\OneDrive\Documents\test.json")),
#"Converted to Table" = Table.FromList(Source, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
#"Expanded Column1" = Table.ExpandRecordColumn(#"Converted to Table", "Column1", {"name", "age", "date"}, {"Column1.name", "Column1.age", "Column1.date"}),
#"Changed Type" = Table.TransformColumnTypes(#"Expanded Column1",{{"Column1.date", type date}})
in
#"Changed Type"
Ответ или решение
Чтобы экспортировать JSON-данные в Excel так, чтобы Excel распознавал строку с датой (например, "2020-03-13") как объект даты, вам понадобится использовать библиотеку xlsx
и несколько дополнительных шагов для обеспечения правильного форматирования. Я объясню, как это можно сделать, чтобы обеспечить правильное поведение при открытии файла в Excel, а также предложу альтернативный способ.
Использование библиотеки xlsx
-
Создание новой книги и листа:
Вам нужно создать новую книгу и переводить JSON-данные в лист. Однако важно учесть, что по умолчаниюxlsx
может не распознать строки как даты. Вам необходимо вручную преобразовать строковые значения в формат, который Excel сможет интерпретировать как даты. -
Преобразование строк даты в формат даты:
Предположим, у нас есть JSON-данные, как в вашем примере:const jsonData = [ { "name": "John Doe", "age": 28, "date": "2023-10-08" }, { "name": "Jane Smith", "age": 32, "date": "2024-03-15" }, { "name": "Alice Johnson", "age": 45, "date": "2024-01-20" } ];
Необходимо преобразовать поле даты в объект даты, когда вы создаете лист:
const jsonDataToExcel = jsonData.map(item => ({ ...item, date: new Date(item.date) // Преобразуем строку даты в объект даты }));
-
Создание и скачивание файла Excel:
Теперь вы можете создать книгу и лист, а затем скачать их:function downloadExcel() { const wb = XLSX.utils.book_new(); // Создайте новую книгу const ws = XLSX.utils.json_to_sheet(jsonDataToExcel); // Преобразуйте JSON в лист // Установите нужный формат для колонки с датами const dateCell = ws['C']; // Допустим, даты находятся в колонке C for (let cell of dateCell) { if (cell) { cell.z = XLSX.SSF.get_table()['14']; // Устанавливаем формат даты } } XLSX.utils.book_append_sheet(wb, ws, 'Sheet1'); // Добавьте лист в книгу XLSX.writeFile(wb, 'data.xlsx'); // Запишите и скачайте файл }
Альтернативный способ без использования xlsx
Если по каким-то причинам библиотека xlsx
не подходит, вы можете воспользоваться Power Query в Excel:
-
Импорт JSON файла:
В Excel вы можете импортировать JSON-файл через Power Query. Просто зайдите в раздел "Данные" и выберите "Получить данные" → "Из файла" → "Из JSON". Это позволит вам выбрать ваш JSON файл для загрузки. -
Преобразование данных:
После того, как данные загружены, вы сможете конвертировать их в таблицу, развернуть столбцы и задать нужные типы данных, включая форматирование колонки с датами.
Эти два подхода позволяют вам решить задачу корректного экспорта JSON с датами в Excel с различными уровнями сложности и гибкости. Выбор метода зависит от ваших специфических требований и предпочтений в использовании библиотек.