задний план
В повседневной работе я сталкивался с данными экспорта какExcel
Требования, вот краткое изложение.
относительно файла экспорта какPDF
илиWord
, экспортExcel
Относительно более распространен.
На практике некоторые проекты экспортируются с помощью внешних плагинов.Excel
Когда объем данных относительно велик, требования к клиенту относительно высоки, а экспорт выполняется очень медленно, что влияет на работу пользователя. Другой — это прямой запрос, инкапсуляция и экспорт серверной части, представленные здесь сегодня какExcel
документ.
Используемые технологии:SpringBoot
,MyBatis
,hutool
,использоватьhutool
Инструмент экспортирует данные какExcel
.
полагаться
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.5.6</version>
</dependency>
<!--Export as Excel-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.1</version>
</dependency>
основной интерфейс экспорта
/**
* @Author Heartsuit
* @Date 2021-08-09
*/
@RestController
@RequestMapping("employee")
public class EmployeeController {
private final EmployeeService employeeService;
public EmployeeController(EmployeeService employeeService) {
this.employeeService = employeeService;
}
/**
* 导出全量数据,实际一般为条件检索后导出
* @param response
* @throws IOException
*/
@GetMapping("export-xls")
public void exportExcel(HttpServletResponse response) throws IOException, ClassNotFoundException {
ExcelWriter writer = ExcelUtil.getWriter();
List<Employee> employees = employeeService.findAll();
List<Map<String, Object>> rows = employees.stream().map(item -> {
Map<String, Object> maps = new HashMap<>();
maps.put("id", item.getId().toString());
maps.put("name", item.getName());
maps.put("age", item.getAge());
maps.put("phone", item.getPhone());
maps.put("createTime", item.getCreateTime().toString());
return maps;
}).collect(Collectors.toList());
// Title
int columns = Class.forName("com.heartsuit.springbootmybatis.oa.entity.Employee").getDeclaredFields().length;
writer.merge(columns - 1, "员工信息");
// Header
writer.addHeaderAlias("id", "ID");
writer.addHeaderAlias("name", "姓名");
writer.addHeaderAlias("age", "年龄");
writer.addHeaderAlias("phone", "电话");
writer.addHeaderAlias("createTime", "时间");
// Body
writer.setColumnWidth(0, 30);
writer.setColumnWidth(1, 30);
writer.setColumnWidth(2, 30);
writer.setColumnWidth(3, 30);
writer.setColumnWidth(4, 30);
writer.write(rows, true);
response.setContentType("application/vnd.ms-excel;charset=utf-8");
response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode("员工信息表-" + DateUtil.today() + ".xls", "utf-8"));
ServletOutputStream out = response.getOutputStream();
writer.flush(out, true);
writer.close();
IoUtil.close(out);
}
}
Тестовый интерфейс: полный экспорт
GET http://localhost:8000/employee/export-xls
Примечание: используется здесьGET
способ, легко проверить, практические советыPOST
.
Проверьте эффективность экспорта 10 000 единиц данных
- Вставьте десятки тысяч фрагментов данных в таблицу данных пакетами и снова проверьте эффективность экспорта;
- На самом деле время экспорта зависит от эффективности поиска и общего количества найденных данных (включая две части времени записи в Excel и передачи в Excel);
Интерфейс пакетной записи данных:
@Test
void insertBatch() {
SqlSessionFactory sqlSessionFactory = sqlSessionTemplate.getSqlSessionFactory();
//可以执行批量操作的sqlSession, try...with...
try (SqlSession openSession = sqlSessionFactory.openSession(ExecutorType.BATCH)) {
long start = System.currentTimeMillis();
EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
for (int i = 0; i < 10000; i++) {
Employee employee = new Employee();
employee.setName(UUID.randomUUID().toString().substring(0, 6));
employee.setAge(new Random().nextInt(100));
employee.setPhone(MobileNumber.generate(0));
mapper.save(employee);
}
openSession.commit();
long end = System.currentTimeMillis();
System.out.println("执行时长" + (end - start));
}
}
Экспортируйте 10 000 фрагментов данных из десятков тысяч записей за считанные секунды.
экспортный эффект
Source Code
Посмотреть полный исходный кодGitHub
:GitHub.com/heartsuit/…
If you have any questions or any bugs are found, please feel free to contact me.
Your comments and suggestions are welcome!