Слияние кода завершено, страница обновится автоматически
Лёгкий инструмент для импорта и экспорта Excel с поддержкой кастомных шаблонов для экспорта. Поддерживает Spring MVC и Spring Boot.
Примечание: Также поддерживается экспорт CSV!
mvn clean install -DskipTests
<dependency>
<groupId>xin.yangda</groupId>
<artifactId>poi-plus</artifactId>
<version>1.0</version>
</dependency>
package xin.yangda.poiplus.test.controller;
``````java
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import xin.yangda.poiplus.constants.PoiPlusFileExtend;
import xin.yangda.poiplus.designer.SimpleXlsDesigner;
import xin.yangda.poiplus.designer.csv.CsvDesigner;
import xin.yangda.poiplus.handler.ExcelReadHandler;
import xin.yangda.poiplus.loader.SimpleXlsxLoader;
import xin.yangda.poiplus.pojo.ExcelData;
import xin.yangda.poiplus.pojo.ExcelErrorField;
import xin.yangda.poiplus.test.entity.UserEntity;
import xin.yangda.poiplus.test.service.UserService;
``````java
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
/**
* @author yangdaxin
* @version Created on 2019/1/21 16:32
*/
@RestController
@RequestMapping(value = "/user")
public class UserController {
private static final Logger LOGGER = LoggerFactory.getLogger(UserController.class);
private static final String XLS_EXCEL_TEMPLATE_PATH = "templates/user.xls";
private static final String XLSX_EXCEL_TEMPLATE_PATH = "templates/user.xlsx";
@Autowired
private UserService userService;
/**
* Загрузка Excel (с шаблоном)
*
* @param request
* @param response
*/
@GetMapping(value = "/excelTemp")
public void exportExcelTemp(HttpServletRequest request, HttpServletResponse response) {
// Открытие шаблона
// InputStream inputStream = getClass().getClassLoader().getResourceAsStream(XLS_EXCEL_TEMPLATE_PATH);
InputStream inputStream = getClass().getClassLoader().getResourceAsStream(XLSX_EXCEL_TEMPLATE_PATH);
try (SimpleXlsDesigner simpleXlsDesigner = new SimpleXlsDesigner(inputStream)) {
// Заполнение данных
Map<String, String> map = Maps.newConcurrentMap();
map.put("createUser", "yangdaxin");
map.put("createTime", "2019-01-18 18:05:00");
ExcelData<UserEntity> excelData = new ExcelData<>(UserEntity.class, map, userService.queryList());
simpleXlsDesigner.setData(excelData);
// Обработка данных
simpleXlsDesigner.process();
// Сохранение Excel
simpleXlsDesigner.download(request, response, PoiPlusFileExtend.XLS);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Загрузка Excel (без шаблона)
*
* @param request
* @param response
*/
@GetMapping(value = "/excel")
public void exportExcel(HttpServletRequest request, HttpServletResponse response) {
try (SimpleXlsDesigner simpleXlsDesigner = new SimpleXlsDesigner()) {
// Заполнение данных
ExcelData<UserEntity> excelData = new ExcelData<>(UserEntity.class, userService.queryList());
simpleXlsDesigner.setData(excelData);
// Обработка данных
simpleXlsDesigner.process();
// Сохранение Excel
simpleXlsDesigner.download(request, response, PoiPlusFileExtend.XLS);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Загрузка шаблона
*
* @param request
* @param response
*/
@GetMapping(value = "/template")
public void exportTemplate(HttpServletRequest request, HttpServletResponse response) {
try (SimpleXlsDesigner simpleXlsDesigner = new SimpleXlsDesigner()) {
// Заполнение данных
ExcelData<UserEntity> excelData = new ExcelData<>(UserEntity.class);
simpleXlsDesigner.setData(excelData);
// Обработка данных
simpleXlsDesigner.process(true);
// Сохранение Excel
simpleXlsDesigner.download(request, response, PoiPlusFileExtend.XLS);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Экспорт CSV
*
* @param request
* @param response
*/
@GetMapping(value = "/csv")
public void exportCsv(HttpServletRequest request, HttpServletResponse response) {
ExcelData<UserEntity> excelData = new ExcelData<>(UserEntity.class, userService.queryList());
CsvDesigner.build(excelData).download(request, response);
}
/**
* Импорт Excel
*
* @param file
* @return
* @throws IOException
*/
@PostMapping("/import")
public ResponseEntity<?> importExcel(@RequestParam("excelFile") MultipartFile file) throws IOException {
// Выполнение импорта файла.
long beginTimeMillis = System.currentTimeMillis();
final List<UserEntity> userList = Lists.newArrayList();
final List<Map<String, Object>> error = Lists.newArrayList();
SimpleXlsxLoader.build(UserEntity.class).readXlsx(file.getInputStream(), new ExcelReadHandler<UserEntity>() {
@Override
public void onSuccess(int sheet, int row, UserEntity userEntity) {
// Успешное чтение текущей строки, вставка в базу данных или добавление в очередь массовой вставки.
userList.add(userEntity);
}```java
@Override
public void onError(int sheet, int row, List<ExcelErrorField> errorFields) {
// Чтение текущей строки завершилось ошибкой, получение деталей ошибки.
error.add(ImmutableMap.of("строка", row, "ошибки", errorFields));
}
});
long time = ((System.currentTimeMillis() - beginTimeMillis) / 1000L);
LOGGER.info("Количество данных: {}, затраченное время: {} секунд", userList.size(), time);
ImmutableMap<String, Object> retJsonMap = ImmutableMap.of(
"время", "Затраченное время " + time + " секунд",
"данные", userList,
"ошибки", error
);
return ResponseEntity.ok(retJsonMap);
}
}
2\. Пример импорта/экспорта с несколькими листами (для более подробных примеров, см. юнит-тесты)
```java
package xin.yangda.poiplus.test.controller;
import com.google.common.collect.Lists;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import xin.yangda.poiplus.constants.PoiPlusFileExtend;
import xin.yangda.poiplus.designer.MultipleXlsDesigner;
import xin.yangda.poiplus.pojo.ExcelData;
import xin.yangda.poiplus.test.entity.OrderEntity;
import xin.yangda.poiplus.test.entity.UserEntity;
import xin.yangda.poiplus.test.service.OrderService;
import xin.yangda.poiplus.test.service.UserService;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.util.List;
/**
* @author yangdaxin
* @version Created on 2019/1/21 16:32
*/
@RestController
@RequestMapping(value = "/userOrder", produces = "application/json;charset=UTF-8")
public class UserOrderController {
private static final String XLS_EXCEL_TEMP_PATH = "templates/userOrder.xls";
private static final String XLSX_EXCEL_TEMP_PATH = "templates/userOrder.xlsx";
}
``````java
@Autowired
private UserService userService;
@Autowired
private OrderService orderService;
/**
* Загрузка Excel (с использованием шаблона)
*
* @param request
* @param response
*/
@GetMapping(value = "/excelByTemplate")
public void exportExcelTemp(HttpServletRequest request, HttpServletResponse response) {
// Открытие шаблона
InputStream inputStream = getClass().getClassLoader().getResourceAsStream(XLS_EXCEL_TEMP_PATH);
//InputStream inputStream = getClass().getClassLoader().getResourceAsStream(XLSX_EXCEL_TEMP_PATH);
try (MultipleXlsDesigner multipleXlsDesigner = new MultipleXlsDesigner(inputStream)) {
// Заполнение данных
ExcelData<UserEntity> userData = new ExcelData<>(UserEntity.class, userService.queryList());
ExcelData<OrderEntity> orderData = new ExcelData<>(OrderEntity.class, orderService.queryList());
List<ExcelData> excelDataList = Lists.newArrayList();
excelDataList.add(userData);
excelDataList.add(orderData);
// Установка данных
multipleXlsDesigner.setData(excelDataList);
// Обработка данных
multipleXlsDesigner.process();
// Сохранение Excel
multipleXlsDesigner.download(request, response, PoiPlusFileExtend.XLS);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Экспорт Excel (без использования шаблона)
*
* @param request
* @param response
*/
@GetMapping(value = "/excel")
public void exportExcel(HttpServletRequest request, HttpServletResponse response) {
try (MultipleXlsDesigner multipleXlsDesigner = new MultipleXlsDesigner()) {
// Заполнение источника данных
ExcelData<UserEntity> userData = new ExcelData<>(UserEntity.class, userService.queryList());
ExcelData<OrderEntity> orderData = new ExcelData<>(OrderEntity.class, orderService.queryList());
List<ExcelData> excelDataList = Lists.newArrayList();
excelDataList.add(userData);
excelDataList.add(orderData);
``````markdown
## Журнал обновлений
### 28 января 2019 года 11:00
1. Устранена проблема с экспортом Excel-шаблона при отсутствии данных в источнике данных.
2. Оптимизация способа создания источника данных для экспорта.
3. Устранена проблема импорта Excel.
### 21 февраля 2019 года 15:35
1. Улучшение импорта xlsx, теперь поддерживаются пользовательские значения для начала строки импорта.
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ExportController {
public void exportData(HttpServletRequest request, HttpServletResponse response) {
try {
multipleXlsDesigner.setData(excelDataList);
// Обработка данных
multipleXlsDesigner.process();
// Сохранение Excel
multipleXlsDesigner.download(request, response, PoiPlusFileExtend.XLS);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Экспорт шаблона
*
* @param request
* @param response
*/
@GetMapping(value = "/template")
public void exportTemplate(HttpServletRequest request, HttpServletResponse response) {
try (MultipleXlsDesigner multipleXlsDesigner = new MultipleXlsDesigner()) {
// Заполнение источника данных
ExcelData<UserEntity> userData = new ExcelData<>(UserEntity.class);
ExcelData<OrderEntity> orderData = new ExcelData<>(OrderEntity.class);
List<ExcelData> excelDataList = Lists.newArrayList();
excelDataList.add(userData);
excelDataList.add(orderData);
multipleXlsDesigner.setData(excelDataList);
// Обработка данных
multipleXlsDesigner.process(true);
// Сохранение Excel
multipleXlsDesigner.download(request, response, PoiPlusFileExtend.XLS);
} catch (Exception e) {
e.printStackTrace();
}
}
}
```1. Это личный проект; если у вас есть вопросы, вы можете отправить мне электронное письмо, а также приветствуем создание issue для программных вопросов.
2. Вы также можете следить за моим личным блогом: <http://www.yangda.xin/topic/12.html>
3. Сканирование QR-кода ниже позволит вам подписаться на мой маленький проект.<div align=center>
<img src="http://www.yangda.xin/upload/image/20190125/1548382988970574.jpg" align=center width="200px" height="200px" title="QR-код" />
</div>
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )