Экспорт файла: используйте Hutool для экспорта данных в файл Excel.

Spring Boot
Экспорт файла: используйте Hutool для экспорта данных в файл Excel.

задний план

В повседневной работе я сталкивался с данными экспорта как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 фрагментов данных из десятков тысяч записей за считанные секунды.

экспортный эффект

2022-01-03-ExportExcel.jpg

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!