Skip to content

Excel 导入导出

公共方法包结构

公共导入导出后端依赖pangea-common/pangea-common-excel

html
<dependency>
    <groupId>com.hisense.pangea</groupId>
    <artifactId>pangea-common-excel</artifactId>
</dependency>

适用范围

Pangea v2.8.3+

使用方法

1.模板上传

模板上传为公共接口,无需后端开发代码

  • 请求路径 域名+模块名+/common/excels/uploadTemplate

例如在pangea-system模块中,请求路径为:域名+/system/common/excels/uploadTemplate

  • 请求方式
POST  multipart/form-data
  • 传入参数
{
    "file":模板文件,
    "fileName":"模板文件名称"
}
返回样例
{
    "msg": "success",
    "code": 0
}

2.模板下载

模板下载为公共接口,无需后端开代码

  • 请求路径
    网关域名+模块名+/common/excels/downloadTemplate

例如在pangea-system模块中,请求路径为:域名+/system/common/excels/downloadTemplate

  • 请求方式
    GET

  • 传入参数

请求路径?fileName=测试
  • 返回参数
    文件返回以文件流方式返回,无需另外处理

3.数据导入

数据导入分两个请求,第一个请求为数据文件解析,第二个为批量保存请求, 用户上传文件后将发送第一个请求,解析后的数据返回到前端预览,预览确认没问题后,将请求第二个批量保存请求。

第一个解析请求由框架提供,无需编写代码;第二个请求由业务系统开发人员编写。

以下为解析请求:

  • 请求路径 网关域名+模块名+/common/excels/upload

  • 请求方式

POST  multipart/form-data
  • 传入参数
{
    "file":数据文件.xlsx
}
  • 返回样例
{
    "msg": "success",
    "code": 200,
    "data": [
        {
            "filename": "Pangea2.0LDAP账号导入模板.xlsx",
            "data": [
                {
                    "A": "zhaoqi.ex"
                }
            ],
            "header": {
                "A": "LDAP账号"
            },
            "sheet": "Sheet1"
        }
    ]
}

数据导入后会在前端展示出数据,想把数据保存到数据库还需要一个自定义的保存方法,默认调用的是/api/system/**/saveBatch 需要在controller里加上该方法

java
	/**
	* 批量修改
	*/
	@PostMapping("saveBatch")
	public boolean saveBatch(@RequestBody List<xxx> xxxList) {
		return xxxService.saveBatch(xxxList);
	}

4.数据导出

数据导出请求由业务开发人员编写,请求处理逻辑分为两步,第一步查询要导出的数据,第二步生成excel文件并返回前端。 由于业务关联性较强,具体导出的数据在业务没确定之前框架是不知道的,所以框架只提供第二步的公共方法,即生成excel文件并返回前端。

数据查询后请调用以下方法生成excel文件:

/**
     * 导出数据
     *
     * @param fileName 自定义文件名 可为空
     * @param title 表头  可为空
     * @param headers 列名集合(excel列头)
     * @param fields 字段集合
     * @param dataList 数据集合
     * @param response 请求响应
     */
public static void exportByResponse(String fileName, String title, List<String> headers, List<String> fields, List dataList, HttpServletResponse response)

调用DEMO:

/**
  * @date 2020-04-13
  * @desc导出数据(Get请求)
  * @param response languageId, languageKey(like), defaultName(like)
 */
@GetMapping("/export")
public void exportData(HttpServletResponse response, @RequestBody Map<String, List<String>> params, Long languageId, String languageKey, String defaultName) {
    List<String> headers = params.get("headers");//headers对应表头名称
    List<String> columns = params.get("columns");//columns对应字段名称,columns与headers一一对应
    List<LangValue> userList = langValueService.findLanguageByIdAndKey(languageId,languageKey,defaultName);//userList为需要导出的数据
    ExcelService.exportByResponse(null,null, headers, columns, userList, response);
}

/**
  * @date 2020-04-13
  * @desc导出数据(Post请求)
  * @param response languageId, languageKey(like), defaultName(like)
 */
@PostMapping("/export")
public void exportData(HttpServletResponse response, @RequestBody Map<String, List<String>> params, Long languageId, String languageKey, String defaultName) {
    List<String> headers = params.get("headers");//headers对应表头名称
    List<String> columns = params.get("columns");//columns对应字段名称,columns与headers一一对应
    List<LangValue> userList = langValueService.findLanguageByIdAndKey(languageId,languageKey,defaultName);//userList为需要导出的数据
    ExcelService.exportByResponse(null,null, headers, columns, userList, response);
}

自定义表头宽度导出excel调用DEMO:

@PostMapping("/exportWidth")
public void exportDataWidth(HttpServletResponse response, @RequestBody Map<String, List<String>> params, Long languageId, String languageKey, String defaultName, String width) throws Exception {

    List<String> requestHeaders = params.get("headers");
    List<String> excelHeaders = new ArrayList<>();
    List<String> excelColumns = new ArrayList<>();

    // 根据systemName查询语言id
    String[] languageIdList = languageService.selectLanguageIdBySystemName(new Language());

    // 设置导出excel表头
    excelHeaders.add(0, requestHeaders.get(0));
    excelColumns.add(0, "LANGUAGE_KEY");
    for (int i = 0; i < languageIdList.length; i++) {
        Language language = languageService.selectLanguageById(Integer.parseInt(languageIdList[i]));
        excelHeaders.add(i + 1, language.getLanguageName());
        excelColumns.add(i + 1, language.getLanguageName());
    }

    Map<String, Object> requestParam = new HashMap<>();
    if (languageIdList != null) {
        requestParam.put("languageIdTemp", languageIdList);
    }
    //得到key最多的ID
    String languageid = languageService.selectLanguageMaxKey(requestParam);

    // 导出数据
    List<Map<String, Object>> dataList = langValueService.selectExportData(Long.parseLong(languageid), defaultName, languageIdList);
    String fileName = "Excel-" + String.valueOf(System.currentTimeMillis()).substring(4, 13) + ".xls";
    fileName = URLEncoder.encode(fileName, "utf-8");
    response.setContentType("application/octet-stream");
    response.setHeader("Content-Disposition", "attachment; filename=" + new String((fileName + ".xlsx").getBytes("GBK"), "ISO-8859-1"));

    String encrypt = ServletUtils.getRequest().getParameter("encrypt");
    if (encrypt != null && encrypt.equals("true")) {
        ExcelService.export(null, excelHeaders, excelColumns, dataList, response.getOutputStream(), true, Integer.parseInt(width));
    } else {
        ExcelService.export(null, excelHeaders, excelColumns, dataList, response.getOutputStream(), false, Integer.parseInt(width));
    }
}

测试方法

如需要本地调试,请使用PostMan工具

本地PostMan调试示例:

模板上传:

模板下载:

框架使用导入导出功能

基于以上的导入导出,框架为了方便各业务项目切换自己的环境,提供了基础数据的导出和导入功能(基础服务->公共数据服务) 可以把基础的表数据直接导出,然后导入到自己新搭建的项目里去。
具体的数据包含:
应用数据:sys_application、sys_application_group
页面菜单:sys_page、sys_menu
角色数据:sys_role 、sys_role_menu、sys_data_authority_rule
用户组数据:sys_group
组织数据:organization_type、organization
字典数据:sys_dict_type、sys_dict_value
国际化数据:language、lang_value

注意:
该功能只能应用于第一次初始化数据,业务项目的数据库是空的情况,否则id可能会冲突。后期会优化成可以增量插入的方式。