jtcsv 2.2.7 → 3.0.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/README.md +31 -1
- package/bin/jtcsv.js +891 -821
- package/bin/jtcsv.ts +2534 -0
- package/csv-to-json.js +168 -145
- package/dist/jtcsv-core.cjs.js +1407 -0
- package/dist/jtcsv-core.cjs.js.map +1 -0
- package/dist/jtcsv-core.esm.js +1379 -0
- package/dist/jtcsv-core.esm.js.map +1 -0
- package/dist/jtcsv-core.umd.js +1413 -0
- package/dist/jtcsv-core.umd.js.map +1 -0
- package/dist/jtcsv-full.cjs.js +1912 -0
- package/dist/jtcsv-full.cjs.js.map +1 -0
- package/dist/jtcsv-full.esm.js +1880 -0
- package/dist/jtcsv-full.esm.js.map +1 -0
- package/dist/jtcsv-full.umd.js +1918 -0
- package/dist/jtcsv-full.umd.js.map +1 -0
- package/dist/jtcsv-workers.esm.js +759 -0
- package/dist/jtcsv-workers.esm.js.map +1 -0
- package/dist/jtcsv-workers.umd.js +773 -0
- package/dist/jtcsv-workers.umd.js.map +1 -0
- package/dist/jtcsv.cjs.js +61 -19
- package/dist/jtcsv.cjs.js.map +1 -1
- package/dist/jtcsv.esm.js +61 -19
- package/dist/jtcsv.esm.js.map +1 -1
- package/dist/jtcsv.umd.js +61 -19
- package/dist/jtcsv.umd.js.map +1 -1
- package/errors.js +188 -2
- package/examples/advanced/conditional-transformations.js +446 -0
- package/examples/advanced/conditional-transformations.ts +446 -0
- package/examples/advanced/csv-parser.worker.js +89 -0
- package/examples/advanced/csv-parser.worker.ts +89 -0
- package/examples/advanced/nested-objects-example.js +306 -0
- package/examples/advanced/nested-objects-example.ts +306 -0
- package/examples/advanced/performance-optimization.js +504 -0
- package/examples/advanced/performance-optimization.ts +504 -0
- package/examples/advanced/run-demo-server.js +116 -0
- package/examples/advanced/run-demo-server.ts +116 -0
- package/examples/advanced/web-worker-usage.html +874 -0
- package/examples/async-multithreaded-example.ts +335 -0
- package/examples/cli-advanced-usage.md +288 -0
- package/examples/cli-batch-processing.ts +38 -0
- package/examples/cli-tool.js +0 -3
- package/examples/cli-tool.ts +183 -0
- package/examples/error-handling.js +21 -7
- package/examples/error-handling.ts +356 -0
- package/examples/express-api.js +0 -3
- package/examples/express-api.ts +164 -0
- package/examples/large-dataset-example.js +0 -3
- package/examples/large-dataset-example.ts +204 -0
- package/examples/ndjson-processing.js +1 -1
- package/examples/ndjson-processing.ts +456 -0
- package/examples/plugin-excel-exporter.js +3 -4
- package/examples/plugin-excel-exporter.ts +406 -0
- package/examples/react-integration.tsx +637 -0
- package/examples/schema-validation.ts +640 -0
- package/examples/simple-usage.js +254 -254
- package/examples/simple-usage.ts +194 -0
- package/examples/streaming-example.js +4 -5
- package/examples/streaming-example.ts +419 -0
- package/examples/web-workers-advanced.ts +28 -0
- package/index.d.ts +1 -3
- package/index.js +15 -1
- package/json-save.js +9 -3
- package/json-to-csv.js +168 -21
- package/package.json +69 -10
- package/plugins/express-middleware/README.md +21 -2
- package/plugins/express-middleware/example.js +3 -4
- package/plugins/express-middleware/example.ts +135 -0
- package/plugins/express-middleware/index.d.ts +1 -1
- package/plugins/express-middleware/index.js +270 -118
- package/plugins/express-middleware/index.ts +557 -0
- package/plugins/fastify-plugin/index.js +2 -4
- package/plugins/fastify-plugin/index.ts +443 -0
- package/plugins/hono/index.ts +226 -0
- package/plugins/nestjs/index.ts +201 -0
- package/plugins/nextjs-api/examples/ConverterComponent.tsx +386 -0
- package/plugins/nextjs-api/examples/api-convert.js +0 -2
- package/plugins/nextjs-api/examples/api-convert.ts +67 -0
- package/plugins/nextjs-api/index.tsx +339 -0
- package/plugins/nextjs-api/route.js +2 -3
- package/plugins/nextjs-api/route.ts +370 -0
- package/plugins/nuxt/index.ts +94 -0
- package/plugins/nuxt/runtime/composables/useJtcsv.ts +100 -0
- package/plugins/nuxt/runtime/plugin.ts +71 -0
- package/plugins/remix/index.js +1 -1
- package/plugins/remix/index.ts +260 -0
- package/plugins/sveltekit/index.js +1 -1
- package/plugins/sveltekit/index.ts +301 -0
- package/plugins/trpc/index.ts +267 -0
- package/src/browser/browser-functions.ts +402 -0
- package/src/browser/core.js +92 -0
- package/src/browser/core.ts +152 -0
- package/src/browser/csv-to-json-browser.d.ts +3 -0
- package/src/browser/csv-to-json-browser.js +36 -14
- package/src/browser/csv-to-json-browser.ts +264 -0
- package/src/browser/errors-browser.ts +303 -0
- package/src/browser/extensions/plugins.js +92 -0
- package/src/browser/extensions/plugins.ts +93 -0
- package/src/browser/extensions/workers.js +39 -0
- package/src/browser/extensions/workers.ts +39 -0
- package/src/browser/globals.d.ts +5 -0
- package/src/browser/index.ts +192 -0
- package/src/browser/json-to-csv-browser.d.ts +3 -0
- package/src/browser/json-to-csv-browser.js +13 -3
- package/src/browser/json-to-csv-browser.ts +262 -0
- package/src/browser/streams.js +12 -2
- package/src/browser/streams.ts +336 -0
- package/src/browser/workers/csv-parser.worker.ts +377 -0
- package/src/browser/workers/worker-pool.ts +548 -0
- package/src/core/delimiter-cache.js +22 -8
- package/src/core/delimiter-cache.ts +310 -0
- package/src/core/node-optimizations.ts +449 -0
- package/src/core/plugin-system.js +29 -11
- package/src/core/plugin-system.ts +400 -0
- package/src/core/transform-hooks.ts +558 -0
- package/src/engines/fast-path-engine-new.ts +347 -0
- package/src/engines/fast-path-engine.ts +854 -0
- package/src/errors.ts +72 -0
- package/src/formats/ndjson-parser.ts +469 -0
- package/src/formats/tsv-parser.ts +334 -0
- package/src/index-with-plugins.js +16 -9
- package/src/index-with-plugins.ts +395 -0
- package/src/types/index.ts +255 -0
- package/src/utils/bom-utils.js +259 -0
- package/src/utils/bom-utils.ts +373 -0
- package/src/utils/encoding-support.js +124 -0
- package/src/utils/encoding-support.ts +155 -0
- package/src/utils/schema-validator.js +19 -19
- package/src/utils/schema-validator.ts +819 -0
- package/src/utils/transform-loader.js +1 -1
- package/src/utils/transform-loader.ts +389 -0
- package/src/utils/zod-adapter.js +170 -0
- package/src/utils/zod-adapter.ts +280 -0
- package/src/web-server/index.js +10 -10
- package/src/web-server/index.ts +683 -0
- package/src/workers/csv-multithreaded.ts +310 -0
- package/src/workers/csv-parser.worker.ts +227 -0
- package/src/workers/worker-pool.ts +409 -0
- package/stream-csv-to-json.js +26 -8
- package/stream-json-to-csv.js +1 -0
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Пример плагина: Excel Exporter для JTCSV
|
|
3
|
+
* Демонстрирует возможности плагинной системы
|
|
4
|
+
*
|
|
5
|
+
* @version 1.0.0
|
|
6
|
+
* @date 2026-01-22
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import ExcelJS from "exceljs";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Плагин для экспорта в Excel формат
|
|
13
|
+
*/
|
|
14
|
+
const excelExporterPlugin = {
|
|
15
|
+
name: 'Excel Exporter',
|
|
16
|
+
version: '1.0.0',
|
|
17
|
+
description: 'Экспорт данных в Excel формат с форматированием',
|
|
18
|
+
|
|
19
|
+
hooks: {
|
|
20
|
+
/**
|
|
21
|
+
* После конвертации JSON в CSV, предлагаем экспорт в Excel
|
|
22
|
+
*/
|
|
23
|
+
'after:jsonToCsv': async (csv, context) => {
|
|
24
|
+
if (context.options?.exportToExcel) {
|
|
25
|
+
console.log('📊 Экспорт в Excel...');
|
|
26
|
+
|
|
27
|
+
// Парсим CSV обратно в JSON для Excel
|
|
28
|
+
const json = await context.instance.csvToJson(csv, {
|
|
29
|
+
...context.options,
|
|
30
|
+
useFastPath: false
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
// Экспортируем в Excel
|
|
34
|
+
const excelPath = await exportToExcel(json, context.options);
|
|
35
|
+
|
|
36
|
+
console.log(`✅ Excel файл создан: ${excelPath}`);
|
|
37
|
+
|
|
38
|
+
// Возвращаем путь к Excel файлу вместо CSV
|
|
39
|
+
return {
|
|
40
|
+
csv,
|
|
41
|
+
excel: excelPath,
|
|
42
|
+
format: 'excel'
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return csv;
|
|
47
|
+
},
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* После чтения CSV файла, предлагаем конвертацию в Excel
|
|
51
|
+
*/
|
|
52
|
+
'after:readCsvAsJson': async (json, context) => {
|
|
53
|
+
if (context.options?.convertToExcel) {
|
|
54
|
+
const excelPath = await exportToExcel(json, context.options);
|
|
55
|
+
console.log(`✅ CSV конвертирован в Excel: ${excelPath}`);
|
|
56
|
+
|
|
57
|
+
return {
|
|
58
|
+
json,
|
|
59
|
+
excel: excelPath
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return json;
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
|
|
67
|
+
middlewares: [
|
|
68
|
+
/**
|
|
69
|
+
* Middleware для добавления информации о Excel экспорте
|
|
70
|
+
*/
|
|
71
|
+
async (ctx, next) => {
|
|
72
|
+
if (ctx.operation === 'jsonToCsv' && ctx.options?.exportToExcel) {
|
|
73
|
+
console.log('🔄 Excel экспорт активирован');
|
|
74
|
+
ctx.metadata.excelExport = {
|
|
75
|
+
requested: true,
|
|
76
|
+
timestamp: new Date().toISOString()
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
await next();
|
|
81
|
+
|
|
82
|
+
if (ctx.metadata?.excelExport) {
|
|
83
|
+
ctx.metadata.excelExport.completed = true;
|
|
84
|
+
ctx.metadata.excelExport.duration = Date.now() - ctx.startTime;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
]
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Экспортирует данные в Excel файл
|
|
92
|
+
*/
|
|
93
|
+
async function exportToExcel(data, options = {}) {
|
|
94
|
+
const {
|
|
95
|
+
outputPath = `export-${Date.now()}.xlsx`,
|
|
96
|
+
sheetName = 'Data',
|
|
97
|
+
includeHeaders = true,
|
|
98
|
+
autoWidth = true,
|
|
99
|
+
styling = true
|
|
100
|
+
} = options;
|
|
101
|
+
|
|
102
|
+
const workbook = new ExcelJS.Workbook();
|
|
103
|
+
const worksheet = workbook.addWorksheet(sheetName);
|
|
104
|
+
|
|
105
|
+
if (!Array.isArray(data) || data.length === 0) {
|
|
106
|
+
throw new Error('Данные должны быть непустым массивом');
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Получаем заголовки
|
|
110
|
+
const headers = Object.keys(data[0]);
|
|
111
|
+
|
|
112
|
+
// Добавляем заголовки
|
|
113
|
+
if (includeHeaders) {
|
|
114
|
+
const headerRow = worksheet.addRow(headers);
|
|
115
|
+
|
|
116
|
+
// Форматирование заголовков
|
|
117
|
+
if (styling) {
|
|
118
|
+
headerRow.font = {
|
|
119
|
+
bold: true,
|
|
120
|
+
color: { argb: 'FFFFFFFF' },
|
|
121
|
+
size: 12
|
|
122
|
+
};
|
|
123
|
+
headerRow.fill = {
|
|
124
|
+
type: 'pattern',
|
|
125
|
+
pattern: 'solid',
|
|
126
|
+
fgColor: { argb: 'FF4472C4' } // Синий
|
|
127
|
+
};
|
|
128
|
+
headerRow.alignment = {
|
|
129
|
+
horizontal: 'center',
|
|
130
|
+
vertical: 'middle'
|
|
131
|
+
};
|
|
132
|
+
headerRow.border = {
|
|
133
|
+
top: { style: 'thin' },
|
|
134
|
+
left: { style: 'thin' },
|
|
135
|
+
bottom: { style: 'thin' },
|
|
136
|
+
right: { style: 'thin' }
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Добавляем данные
|
|
142
|
+
data.forEach((item, rowIndex) => {
|
|
143
|
+
const values = headers.map(header => item[header]);
|
|
144
|
+
const row = worksheet.addRow(values);
|
|
145
|
+
|
|
146
|
+
// Чередующаяся раскраска строк
|
|
147
|
+
if (styling && rowIndex % 2 === 0) {
|
|
148
|
+
row.fill = {
|
|
149
|
+
type: 'pattern',
|
|
150
|
+
pattern: 'solid',
|
|
151
|
+
fgColor: { argb: 'FFF2F2F2' } // Светло-серый
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Форматирование числовых значений
|
|
156
|
+
headers.forEach((header, colIndex) => {
|
|
157
|
+
const value = item[header];
|
|
158
|
+
const cell = row.getCell(colIndex + 1);
|
|
159
|
+
|
|
160
|
+
if (typeof value === 'number') {
|
|
161
|
+
cell.numFmt = '#,##0.00';
|
|
162
|
+
cell.alignment = { horizontal: 'right' };
|
|
163
|
+
} else if (value instanceof Date) {
|
|
164
|
+
cell.numFmt = 'dd.mm.yyyy';
|
|
165
|
+
cell.alignment = { horizontal: 'center' };
|
|
166
|
+
} else if (typeof value === 'boolean') {
|
|
167
|
+
cell.value = value ? 'Да' : 'Нет';
|
|
168
|
+
cell.alignment = { horizontal: 'center' };
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
// Автоматическая ширина колонок
|
|
174
|
+
if (autoWidth) {
|
|
175
|
+
headers.forEach((_, index) => {
|
|
176
|
+
const column = worksheet.getColumn(index + 1);
|
|
177
|
+
column.width = Math.max(
|
|
178
|
+
15, // Минимальная ширина
|
|
179
|
+
Math.min(
|
|
180
|
+
50, // Максимальная ширина
|
|
181
|
+
headers[index]?.length || 10
|
|
182
|
+
)
|
|
183
|
+
);
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Добавляем фильтры
|
|
188
|
+
if (includeHeaders) {
|
|
189
|
+
worksheet.autoFilter = {
|
|
190
|
+
from: 'A1',
|
|
191
|
+
to: `${String.fromCharCode(65 + headers.length - 1)}1`
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// Сохраняем файл
|
|
196
|
+
await workbook.xlsx.writeFile(outputPath);
|
|
197
|
+
return outputPath;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Плагин для импорта из Excel
|
|
202
|
+
*/
|
|
203
|
+
const excelImporterPlugin = {
|
|
204
|
+
name: 'Excel Importer',
|
|
205
|
+
version: '1.0.0',
|
|
206
|
+
description: 'Импорт данных из Excel файлов',
|
|
207
|
+
|
|
208
|
+
hooks: {
|
|
209
|
+
/**
|
|
210
|
+
* Перехватывает чтение CSV файлов и поддерживает Excel
|
|
211
|
+
*/
|
|
212
|
+
'before:readCsvAsJson': async (filePath, context) => {
|
|
213
|
+
if (filePath.endsWith('.xlsx') || filePath.endsWith('.xls')) {
|
|
214
|
+
console.log(`📥 Обнаружен Excel файл: ${filePath}`);
|
|
215
|
+
|
|
216
|
+
const data = await importFromExcel(filePath, context.options);
|
|
217
|
+
|
|
218
|
+
// Пропускаем стандартную обработку CSV
|
|
219
|
+
context.skipStandardProcessing = true;
|
|
220
|
+
|
|
221
|
+
return data;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
return filePath;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Импортирует данные из Excel файла
|
|
231
|
+
*/
|
|
232
|
+
async function importFromExcel(filePath, options = {}) {
|
|
233
|
+
const {
|
|
234
|
+
sheetIndex = 1,
|
|
235
|
+
hasHeaders = true,
|
|
236
|
+
skipRows = 0
|
|
237
|
+
} = options;
|
|
238
|
+
|
|
239
|
+
const workbook = new ExcelJS.Workbook();
|
|
240
|
+
await workbook.xlsx.readFile(filePath);
|
|
241
|
+
|
|
242
|
+
const worksheet = workbook.worksheets[sheetIndex - 1] || workbook.getWorksheet(1);
|
|
243
|
+
|
|
244
|
+
if (!worksheet) {
|
|
245
|
+
throw new Error('Лист не найден в Excel файле');
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
const data = [];
|
|
249
|
+
let headers = [];
|
|
250
|
+
|
|
251
|
+
worksheet.eachRow((row, rowNumber) => {
|
|
252
|
+
if (rowNumber <= skipRows) {
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
if (hasHeaders && rowNumber === skipRows + 1) {
|
|
257
|
+
// Первая строка - заголовки
|
|
258
|
+
headers = row.values.slice(1); // Пропускаем первый пустой элемент
|
|
259
|
+
} else {
|
|
260
|
+
const rowData = {};
|
|
261
|
+
const values = row.values.slice(1); // Пропускаем первый пустой элемент
|
|
262
|
+
|
|
263
|
+
values.forEach((value, index) => {
|
|
264
|
+
const header = headers[index] || `column_${index + 1}`;
|
|
265
|
+
|
|
266
|
+
// Конвертируем Excel типы в JavaScript типы
|
|
267
|
+
if (value instanceof Date) {
|
|
268
|
+
rowData[header] = value.toISOString();
|
|
269
|
+
} else if (value && typeof value === 'object' && value.formula) {
|
|
270
|
+
// Формулы - сохраняем как строку
|
|
271
|
+
rowData[header] = value.formula;
|
|
272
|
+
} else if (value === null || value === undefined) {
|
|
273
|
+
rowData[header] = '';
|
|
274
|
+
} else {
|
|
275
|
+
rowData[header] = value;
|
|
276
|
+
}
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
data.push(rowData);
|
|
280
|
+
}
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
console.log(`✅ Импортировано ${data.length} строк из Excel`);
|
|
284
|
+
return data;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* Пример использования плагинов
|
|
289
|
+
*/
|
|
290
|
+
async function exampleUsage() {
|
|
291
|
+
console.log('🚀 Пример использования плагинов JTCSV\n');
|
|
292
|
+
|
|
293
|
+
// Создаем экземпляр JTCSV с плагинами
|
|
294
|
+
import JtcsvWithPlugins from "../src/index-with-plugins";
|
|
295
|
+
const jtcsv = JtcsvWithPlugins.create({
|
|
296
|
+
enablePlugins: true,
|
|
297
|
+
enableFastPath: true
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
// Регистрируем плагины
|
|
301
|
+
jtcsv.use('excel-exporter', excelExporterPlugin);
|
|
302
|
+
jtcsv.use('excel-importer', excelImporterPlugin);
|
|
303
|
+
|
|
304
|
+
console.log('📋 Зарегистрированные плагины:');
|
|
305
|
+
jtcsv.listPlugins().forEach(plugin => {
|
|
306
|
+
console.log(` • ${plugin.name} v${plugin.version} - ${plugin.description}`);
|
|
307
|
+
});
|
|
308
|
+
|
|
309
|
+
console.log('\n📊 Пример 1: Конвертация JSON в CSV с экспортом в Excel');
|
|
310
|
+
|
|
311
|
+
const sampleData = [
|
|
312
|
+
{ id: 1, name: 'John Doe', age: 30, salary: 50000, hired: new Date('2023-01-15') },
|
|
313
|
+
{ id: 2, name: 'Jane Smith', age: 25, salary: 45000, hired: new Date('2023-03-20') },
|
|
314
|
+
{ id: 3, name: 'Bob Johnson', age: 35, salary: 60000, hired: new Date('2022-11-10') }
|
|
315
|
+
];
|
|
316
|
+
|
|
317
|
+
try {
|
|
318
|
+
// Конвертируем в CSV с опцией экспорта в Excel
|
|
319
|
+
const result = await jtcsv.jsonToCsv(sampleData, {
|
|
320
|
+
delimiter: ',',
|
|
321
|
+
exportToExcel: true,
|
|
322
|
+
outputPath: 'example-export.xlsx',
|
|
323
|
+
styling: true
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
console.log('✅ Результат:', result);
|
|
327
|
+
|
|
328
|
+
// Показываем статистику
|
|
329
|
+
const stats = jtcsv.getStats();
|
|
330
|
+
console.log('\n📈 Статистика:');
|
|
331
|
+
console.log(' Плагины:', stats.plugins.plugins);
|
|
332
|
+
console.log(' Hooks выполнено:', stats.plugins.hookExecutions);
|
|
333
|
+
console.log(' Middleware выполнено:', stats.plugins.middlewareExecutions);
|
|
334
|
+
console.log(' Fast Path парсеры:', stats.fastPath.simpleParserCount);
|
|
335
|
+
|
|
336
|
+
} catch (error) {
|
|
337
|
+
console.error('❌ Ошибка:', error.message);
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
console.log('\n📥 Пример 2: Импорт из Excel файла');
|
|
341
|
+
|
|
342
|
+
try {
|
|
343
|
+
// Создаем тестовый Excel файл
|
|
344
|
+
const testWorkbook = new ExcelJS.Workbook();
|
|
345
|
+
const testSheet = testWorkbook.addWorksheet('Test Data');
|
|
346
|
+
|
|
347
|
+
testSheet.addRow(['ID', 'Name', 'Department', 'Score']);
|
|
348
|
+
testSheet.addRow([1, 'Alice', 'Engineering', 95]);
|
|
349
|
+
testSheet.addRow([2, 'Bob', 'Marketing', 88]);
|
|
350
|
+
testSheet.addRow([3, 'Charlie', 'Sales', 92]);
|
|
351
|
+
|
|
352
|
+
await testWorkbook.xlsx.writeFile('test-import.xlsx');
|
|
353
|
+
|
|
354
|
+
// Импортируем из Excel
|
|
355
|
+
const importedData = await jtcsv.readCsvAsJson('test-import.xlsx', {
|
|
356
|
+
convertToExcel: false // Просто импортируем
|
|
357
|
+
});
|
|
358
|
+
|
|
359
|
+
console.log('✅ Импортированные данные:');
|
|
360
|
+
console.log(JSON.stringify(importedData, null, 2));
|
|
361
|
+
|
|
362
|
+
// Конвертируем импортированные данные в CSV
|
|
363
|
+
const csvFromExcel = await jtcsv.jsonToCsv(importedData, {
|
|
364
|
+
delimiter: ';'
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
console.log('\n📄 CSV из импортированных данных:');
|
|
368
|
+
console.log(csvFromExcel);
|
|
369
|
+
|
|
370
|
+
} catch (error) {
|
|
371
|
+
console.error('❌ Ошибка импорта:', error.message);
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
console.log('\n🎯 Пример 3: Использование NDJSON');
|
|
375
|
+
|
|
376
|
+
try {
|
|
377
|
+
// Конвертируем в NDJSON
|
|
378
|
+
const ndjson = jtcsv.toNdjson(sampleData, { space: 2 });
|
|
379
|
+
console.log('📝 NDJSON:');
|
|
380
|
+
console.log(ndjson);
|
|
381
|
+
|
|
382
|
+
// Парсим NDJSON обратно
|
|
383
|
+
const parsed = await jtcsv.parseNdjson(ndjson);
|
|
384
|
+
console.log('\n🔁 Парсированный NDJSON:');
|
|
385
|
+
console.log(JSON.stringify(parsed, null, 2));
|
|
386
|
+
|
|
387
|
+
} catch (error) {
|
|
388
|
+
console.error('❌ Ошибка NDJSON:', error.message);
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
console.log('\n🏁 Пример завершен!');
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
// Экспортируем плагины и функции
|
|
395
|
+
export default {
|
|
396
|
+
excelExporterPlugin,
|
|
397
|
+
excelImporterPlugin,
|
|
398
|
+
exportToExcel,
|
|
399
|
+
importFromExcel,
|
|
400
|
+
exampleUsage
|
|
401
|
+
};
|
|
402
|
+
|
|
403
|
+
// Если файл запущен напрямую
|
|
404
|
+
if (require.main === module) {
|
|
405
|
+
exampleUsage().catch(console.error);
|
|
406
|
+
}
|