Как элегантно генерировать эти причудливые и сложные файлы Excel с помощью Freemark?

Java
Как элегантно генерировать эти причудливые и сложные файлы Excel с помощью Freemark?

Приглашаем обратить внимание на личный публичный аккаунт WeChat:Сяоха изучает Java, Высококачественные статьи будут опубликованы как можно скорее, обратите внимание на приложенные огромные обучающие ресурсы! !

Персональный сайт:woohoo.exception.site/essay/how-he…

1. Предпосылки

Сяо Ха недавно руководил новым продуктом: Download Center. Что за чертовщина?

На самом деле цель продукта состоит в том, чтобы управлять и контролировать функцию загрузки файлов каждой бизнес-группы унифицированным способом (включая экспорт некоторых массивных данных, объединение и загрузку файлов и т. д.), и команде проекта не нужно реализовывать генерацию различных файлов (PDF, Word, Excel), унифицированный Подключитесь к центру загрузки, и центр загрузки единообразно завершит процессы создания, объединения, загрузки и скачивания файлов.

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

复杂Excel
Сложный Эксель

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

Но с точки зрения центра загрузки, поскольку каждый бизнес-центр должен быть подключен, стили, генерируемые каждым бизнес-центром, разные, и каждая бизнес-группа не может войти, поэтому я должен написать индивидуальный набор сгенерированных код! Это явно не имеет смысла!

Итак, есть ли способ для одного в течение длительного времени? Ответ - да!

Во-вторых, реализация идеи

Говоря о методе реализации, вы можете сначала подумать о традиционных Apache poi, jxl или EasyExcel, производимых Ali и так далее.

PS: Про EasyExcel от Али Сяоха уже поделилась. Для тех, кто не видел, можете прочитать "7 строк кода для элегантной реализации функции создания и загрузки файлов Excel".

Для такого сложного стиля, если для его реализации используются Apache poi, jxl, Ali EasyExcel, код неизбежно будет очень громоздким.

Есть ли элегантный (ленивый) способ сделать это?

Фактически, мы можем использовать движки просмотра Freemark и Velocity, чтобы помочь нам создавать файлы Excel со сложными стилями.Нам не нужно заботиться о сложных стилях, а только сосредоточиться на заполнении данных. Далее мы используем Freemark в качестве примера, чтобы объяснить, как создать этот файл Excel сложного стиля.

Дальнейшее чтение:Что такое Фримарк?

FreeMarker — это механизм шаблонов: универсальный инструмент для создания выходного текста (веб-страницы HTML, электронные письма, файлы конфигурации, исходный код и т. д.) на основе шаблонов и данных, которые необходимо изменить. Он не предназначен для конечных пользователей, а является библиотекой классов Java, компонентом, который программисты могут встраивать в разрабатываемые ими продукты.

На самом деле для бэкенда Java чаще используется динамический рендеринг html-страниц на стороне сервера и возврат их в браузер. В последние несколько лет было относительно жарко, в последние годы, из-за горячего разделения передней и задней частей, он постепенно исчезал из поля зрения.

3. Начните быстро

3.1 Добавить зависимости

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>

Примечание. Патрисия здесь, на Spring Boot, напишите тестовый код, номер версии может не указывать, в противном случае вам нужно указать номер версии вручную.

3.2 Экспорт файла шаблона xml

Сначала сохраните файл Excel сложного стиля как.xmlПросмотрите шаблон, как показано на следующем рисунке:

Откройте файл шаблона xml, вы можете ясно видеть, что в нем определены различные узлы, и узлы описывают структуру стилей всего Excel, как показано на следующем рисунке:

3.3 Заполнение заполнителей

Давайте вернемся и посмотрим на сложный файл Excel, который был раньше, и посмотрим, какие значения ячеек необходимо установить динамически:

Рисунок специально выделен красным.

Заполните выражение freemark в файле шаблона xml, который вы только что сохранили.Учитывая, что это всего лишь демонстрационный пример, просто выберите несколько ячеек для примера, чтобы заполнить заполнители, как показано ниже:

Название заказа:

Другие ячейки, которые необходимо заполнить динамически:

PS: в xml-файле<Row>Узел представляет строку,<Cell>представляет клетку.

Добавьте соответствующие выражения freemark, где данные должны заполняться динамически, например${commodity.name!},Следующим образом:

<Row ss:AutoFitHeight="0" ss:Height="54">
    <Cell ss:StyleID="s18"><Data ss:Type="String">1</Data></Cell>
    <Cell ss:StyleID="s18"><Data ss:Type="String">${commodity.name!}</Data></Cell>
    <Cell ss:StyleID="s18"/>
    <Cell ss:StyleID="s18"><Data ss:Type="String">${commodity.num!}</Data></Cell>
    <Cell ss:StyleID="s18"><Data ss:Type="String">${commodity.num1!}</Data></Cell>
    <Cell ss:StyleID="s18"><Data ss:Type="String">22</Data></Cell>
    <Cell ss:StyleID="s18"><Data ss:Type="String">44</Data></Cell>
    <Cell ss:StyleID="s18"><Data ss:Type="String">55</Data></Cell>
    <Cell ss:StyleID="s18"><Data ss:Type="String">盒</Data></Cell>
    <Cell ss:StyleID="s18"><Data ss:Type="String">${commodity.price!}</Data></Cell>
    <Cell ss:StyleID="s18"><Data ss:Type="String">${commodity.price2!}</Data></Cell>
    <Cell ss:StyleID="s18"><Data ss:Type="String">${commodity.price3!}</Data></Cell>
    <Cell ss:StyleID="s18"><Data ss:Type="String">${commodity.timestamp}</Data></Cell>
    <Cell ss:StyleID="s18"><Data ss:Type="String">${commodity.createTime?string('yyyy-MM-dd HH:mm:ss')}</Data></Cell>
    <Cell ss:StyleID="s18"/>
</Row>

В соответствии с определением модели данных сервера заполните соответствующее имя поля, а затем сравните определение класса товаров Commodity в фоновом режиме:

В этом товарном классе мы определяем различные типы полей, такие какString、int、Integer、Double、Float、Тип суммыBigDecimal, тип датыDateд., чтобы проверить совместимость с разными типами данных.

Убедившись, что соответствующие имена полей атрибутов верны, давайте взглянем на основной код freemark для создания Excel:

package site.exception.springbootfreemarkexcel;

import freemarker.template.Configuration;
import freemarker.template.Template;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import site.exception.springbootfreemarkexcel.entity.Commodity;

import java.io.File;
import java.io.FileWriter;
import java.math.BigDecimal;
import java.util.*;
/**
 * @author 犬小哈 (微信公众号: 小哈学Java)
 * @site www.exception.site
 * @date 2019/5/21
 * @time 上午10:57
 * @discription
 **/
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootFreemarkExcelApplicationTests {

	@Test
	public void createExcelByFreemark() throws Exception {

		Configuration configuration = new Configuration(Configuration.VERSION_2_3_28);

		// 设置模板文件的父目录
		configuration.setDirectoryForTemplateLoading(new File("/Users/a123123/Work/tmp_files"));

		// 加载模板文件
		Template template = configuration.getTemplate("/excel_template.xml", "UTF-8");

		// 数据准备,可以是从数据库中查询,这里为了方便演示,手动 new 了
		Map<String, Object> data = new HashMap<>();
		data.put("title", "测试标题1");

		List<Commodity> commodities = new ArrayList<>();
		Commodity commodity = Commodity.builder()
				.name("name1").num(11).num1(111)
				.price(new BigDecimal(11.1)).price2(new Double(11.11))
				.price3(new Float(11.1111))
				.createTime(new Date())
				.timestamp(System.currentTimeMillis())
				.build();

		commodities.add(commodity);

		// 生成 excel 文件
		template.process(data, new FileWriter("/Users/a123123/Work/tmp_files/excelByFreemark.xls"));
	}
}

Вы можете видеть, что код для создания сложных стилей Excel очень лаконичен. О том, что означает каждая строка кода, в комментариях очень ясно сказано, поэтому я не буду объяснять это здесь.

Запустите юнит-тест и посмотрите на результат:

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

4. Как генерировать многострочные данные?

Как динамически генерировать несколько строк? На самом деле это очень просто: повторно откройте только что измененный файл шаблона xml и добавьте выражение цикла freemark, где необходимо динамически генерировать несколько строк:

PS: Freemark больше об использовании регулярных выражений, маленькие друзья могут самостоятельно искать в основных поисковых системах, не потому, что в центре внимания этой статьи Freemark внимание ~

На приведенном выше рисунке мы имеемcommoditiesПоля зациклены, соответственно код фона тоже нужно модифицировать:

мы вcommoditiesДобавлены два объекта элемента в . Спешите запустить код, чтобы увидеть эффект!

Не волнуйтесь, есть еще одно место, которое нужно изменить, иначе будет сообщено об ошибке! !

оказаться<Table>Node, есть свойство, называемоеExpandedRowCount, который определяет общее количество строк таблицы, если значение не соответствует фактическому количеству строк, будут проблемы.

Здесь мы добавляем выражение Freemark, общее количество строк — это произведениеcommoditesДобавьте к размеру набора 16. Примечание: 16 — это фиксированное количество строк, за исключением количества динамически генерируемых строк.Если вы используете разные шаблоны xml, вам необходимо подтвердить размер этого значения самостоятельно.

После модификации снова запустите модульный тест, эффект будет следующим:

Готово!

5. Ограничения

Анализатор представления для создания Excel действительно элегантен (ленив) и одновременно гибок. Но он также имеет некоторые ограничения! Когда мелкие партнеры проходят технический отбор, они должны соответствовать реальному бизнес-сценарию.

  • Проблема с версией:

В настоящее время результатом личного теста является то, что в системе MAC может быть создана только версия Excel 03, а версия 07 не может быть открыта;

  • Невозможно записать объемные данные:

Файл, сгенерированный механизмом просмотра, не может добавлять данные в Excel, поэтому он подходит только для персонализированной генерации Excel с небольшим объемом данных, иначе возникнет ситуация нехватки памяти (OOM) при записи больших пакетов данных. ;

  • В системе MAC возникает ситуация, что сгенерированный файл Excel не может быть отредактирован и сохранен:

Сяоха обнаружил в тесте, что сгенерированный Excel не может быть сохранен после редактирования в системе MAC, в то время как система Windows, Microsoft Excel и WPS, могут быть отредактированы и сохранены в обычном режиме;

6. Резюме

В этой статье Сяоха рассказывает, как элегантно генерировать файлы Excel с помощью механизма просмотра, и демонстрирует соответствующий пример кода и связанные с ним ограничения. Надеюсь, вы сможете что-то узнать после прочтения этой статьи. Увидимся в следующем выпуске~

Пример кода на GitHub

Добро пожаловать в публичный аккаунт WeChat: Сяоха изучает Java

关注微信公众号【小哈学Java】,回复【资源】,即可免费无套路领取资源链接哦
Подпишитесь на общедоступную учетную запись WeChat [Xiao Ha Learn Java], ответьте на [Ресурсы], вы можете получить ссылку на ресурс бесплатно без каких-либо процедур.