1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/izifeng-poi-plus

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

poi-plus

Описание

Лёгкий инструмент для импорта и экспорта Excel с поддержкой кастомных шаблонов для экспорта. Поддерживает Spring MVC и Spring Boot.

Примечание: Также поддерживается экспорт CSV!

Какие возможности предоставляет poi-plus?

  1. Поддержка кастомных шаблонов Excel для импорта и экспорта. Теперь вы больше не будете беспокоиться о сложных требованиях к экспорту таблиц.
  2. Поддержка xls, xlsx и csv файлов для экспорта.
  3. Поддержка массового импорта данных.
  4. Поддержка нескольких листов в одном документе.
  5. Поддержка экспорта Excel с использованием шаблона.

Инструкция по установке

  1. Скомпилировать проект в локальную Maven репозиторию
mvn clean install -DskipTests
  1. Добавьте poi-plus в pom.xml вашего проекта
<dependency>
    <groupId>xin.yangda</groupId>
    <artifactId>poi-plus</artifactId>
    <version>1.0</version>
</dependency>

Инструкция по использованию

  1. Пример одиночного листа для импорта и экспорта (более примеров можно найти в юнит тестах)
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 )

Вы можете оставить комментарий после Вход в систему

Введение

Лёгкий инструмент для импорта и экспорта данных из Excel с поддержкой пользовательских шаблонов экспорта. Развернуть Свернуть
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/izifeng-poi-plus.git
git@api.gitlife.ru:oschina-mirror/izifeng-poi-plus.git
oschina-mirror
izifeng-poi-plus
izifeng-poi-plus
master