Как эффективно читать и писать миллионы Excel?

Excel

Эффективное чтение одного миллиона данных

ловитьПредыдущийПосле введения эффективной записи файлов я недавно нашел время, чтобы изучить чтение файлов Excel. В общем, есть два способа чтения excel для пои:Пользовательский режим и режим события.

Тем не менее, чтение Excel во многих бизнес-сценариях по-прежнему использует пользовательский режим, но этот режим требует создания большого количества объектов, а поддержка больших файлов очень недружелюбна, и его очень легко OOM. Однако для режима событий вам часто нужно реализовать прослушиватель самостоятельно, и вам нужно анализировать различные события в соответствии с вашими потребностями, поэтому его сложнее использовать.

Исходя из этого, EasyExcel инкапсулирует синтаксический анализ событий часто используемых документов формата Excel и предоставляет интерфейс для брата-разработчика.Расширенная настройка, чтобы позволить вам анализировать Excel, не беспокоясь об этом.

Talk is cheap, show me the code.

использовать позу

pom

    <groupId>com.github.Dorae132</groupId>
<artifactId>easyutil.easyexcel</artifactId>
<version>1.1.0</version>

нормальная осанка

Взгляните на позу ниже, как вы думаете,Нужно только заботиться о бизнес-логике?

ExcelUtils.excelRead(ExcelProperties.produceReadProperties("C:\\Users\\Dorae\\Desktop\\ttt\\",
			"append_0745704108fa42ffb656aef983229955.xlsx"), new IRowConsumer<String>() {
				@Override
				public void consume(List<String> row) {
					System.out.println(row);
					count.incrementAndGet();
					try {
						TimeUnit.MICROSECONDS.sleep(100);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}, new IReadDoneCallBack<Void>() {
				@Override
				public Void call() {
					System.out.println(
							"end, count: " + count.get() + "\ntime: " + (System.currentTimeMillis() - start));
					return null;
				}
			}, 3, true);

пользовательская поза

Какой? думаешьНастроить контекст, добавить обработчикСм. ниже! Вам просто нужно реализовать обработчик записей Abstract 03 и зарегистрироваться в контексте (следуйте фабрике в ExcelVersionEnums).

public static void excelRead(IHandlerContext context, IRowConsumer rowConsumer, IReadDoneCallBack callBack,
		int threadCount, boolean syncCurrentThread) throws Exception {
	// synchronized main thread
	CyclicBarrier cyclicBarrier = null;
	threadCount = syncCurrentThread ? ++threadCount : threadCount;
	if (callBack != null) {
		cyclicBarrier = new CyclicBarrier(threadCount, () -> {
			callBack.call();
		});
	} else {
		cyclicBarrier = new CyclicBarrier(threadCount);
	}
	for (int i = 0; i < threadCount; i++) {
		THREADPOOL.execute(new ConsumeRowThread(context, rowConsumer, cyclicBarrier));
	}
	context.process();
	if (syncCurrentThread) {
		cyclicBarrier.await();
	}
}

Фреймворк

Как показано на рисунке, это структура всего EasyExcel, среди которых (если вы поняли шаблон проектирования или прочитали соответствующий исходный код, это должно быть легко понять):

  1. Зеленый — расширяемый интерфейс,
  2. Верхняя часть предназначена для записи файлов, а нижняя — для чтения файлов.

图 1-1

Суммировать

На этом базовые функции EasyExcel можно считать оконченными, и все великие боги могут прийти к Выпуску. 🍗