Browse Source

添加Excel导入

jaikuai 3 years ago
parent
commit
bb43e2beee

+ 6 - 0
pom.xml

@@ -116,6 +116,12 @@
             <version>1.13</version>
         </dependency>
 
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+            <version>4.1.0</version>
+        </dependency>
+
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-configuration-processor</artifactId>

+ 0 - 1
src/main/java/cn/fastfun/controller/api/ApiSysUserController.java

@@ -61,7 +61,6 @@ public class ApiSysUserController {
     @ApiOperation(value = "分页搜索")
     @RequestMapping(value = "pageQuery", method = RequestMethod.POST)
     public ApiPageDTO pageQuery(@RequestBody QueryParam param) {
-
         return new ApiPageDTO(null, sysUserService.findByParam(param));
     }
 

+ 0 - 3
src/main/java/cn/fastfun/controller/api/UserController.java

@@ -21,9 +21,6 @@ import org.springframework.web.bind.annotation.RestController;
 @RequestMapping("/api/user")
 public class UserController {
 
-    @Autowired
-    JpaService<SysUser, String> sysUserService;
-
     @Autowired
     UtilService utilService;
 

+ 48 - 0
src/main/java/cn/fastfun/service/SysExcelFieldService.java

@@ -0,0 +1,48 @@
+package cn.fastfun.service;
+
+import cn.fastfun.service.entity.SysExcelField;
+import com.bridge.service.JpaService;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 服务类 Created by Bridge on 2017/3/14.
+ */
+public interface SysExcelFieldService extends JpaService<SysExcelField, String> {
+
+    /**
+     * 获得导入模板
+     *
+     * @param table 表名
+     */
+    HSSFWorkbook getTemplate(String table);
+
+    /**
+     * 导出数据
+     *
+     * @param table 表名
+     * @param data  数据
+     */
+    HSSFWorkbook export(String table, List<Map<String, Object>> data);
+
+    /**
+     * Excel导入
+     *
+     * @param table 表名
+     * @param file  导入文件
+     */
+    List<Map<String, Object>> importExcel(String table, MultipartFile file);
+
+    /**
+     * 输出Excel文件
+     *
+     * @param response 输出对象
+     * @param name     文件名称
+     * @param workbook Excel文件
+     */
+    void outExcelFile(HSSFWorkbook workbook, HttpServletResponse response, String name);
+}

+ 64 - 0
src/main/java/cn/fastfun/service/entity/SysExcelField.java

@@ -0,0 +1,64 @@
+package cn.fastfun.service.entity;
+
+
+import com.bridge.entity.IdEntity;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Table;
+
+
+@Entity
+@Table(name = "sys_excel_field")
+@Setter
+@Getter
+@JsonIgnoreProperties(value = {"hibernateLazyInitializer"})
+public class SysExcelField extends IdEntity {
+
+
+    private static final long serialVersionUID = -5104366147522238024L;
+
+    @ApiModelProperty(value = "文件名", name = "fileName", required = true)
+    @Column(name = "file_name")
+    private String fileName;
+
+    @ApiModelProperty(value = "表名", name = "tableName", required = true)
+    @Column(name = "table_name")
+    private String tableName;
+
+    @ApiModelProperty(value = "字段", name = "fieldName", required = true)
+    @Column(name = "field_name")
+    private String fieldName;
+
+    @ApiModelProperty(value = "字段标题", name = "fieldTitle", required = true)
+    @Column(name = "field_title")
+    private String fieldTitle;
+
+    @ApiModelProperty(value = "排序", name = "sort", required = true)
+    @Column(name = "sort")
+    private Integer sort;
+
+    @ApiModelProperty(value = "必填", name = "required", required = true)
+    @Column(name = "required")
+    private Integer required;
+
+    @ApiModelProperty(value = "字段类型", name = "objectName", required = true)
+    @Column(name = "object_name")
+    private String objectName;
+
+    @ApiModelProperty(value = "宽度", name = "width", required = true)
+    @Column(name = "width")
+    private Integer width;
+
+    @ApiModelProperty(value = "导入", name = "isImport", required = true)
+    @Column(name = "is_import")
+    private Integer isImport;
+
+    @ApiModelProperty(value = "导出", name = "isExport", required = true)
+    @Column(name = "is_export")
+    private Integer isExport;
+}

+ 1 - 1
src/main/java/cn/fastfun/service/entity/SysUser.java

@@ -49,7 +49,7 @@ public class SysUser extends DateEntity {
 
     @ApiModelProperty(value = "手机", name = "mobile", required = true)
     @Column(name = "mobile")
-    private Integer mobile;
+    private String mobile;
 
     @ApiModelProperty(value = "角色", name = "roleIds", required = true)
     @Transient

+ 190 - 0
src/main/java/cn/fastfun/service/impl/SysExcelFieldServiceImp.java

@@ -0,0 +1,190 @@
+package cn.fastfun.service.impl;
+
+import cn.fastfun.service.SysExcelFieldService;
+import cn.fastfun.service.entity.SysExcelField;
+import com.bridge.dto.QueryParam;
+import com.bridge.dto.QueryParamExp;
+import com.bridge.exception.ApiRuntimeException;
+import com.bridge.service.impl.JpaServiceImp;
+import org.apache.poi.hssf.usermodel.*;
+import org.apache.poi.poifs.filesystem.POIFSFileSystem;
+import org.apache.poi.ss.usermodel.CellType;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.math.BigDecimal;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 基础服务实现类 Created by Bridge on 2017/3/14.
+ */
+@Service("sysExcelFieldService")
+public class SysExcelFieldServiceImp extends JpaServiceImp<SysExcelField, String> implements SysExcelFieldService {
+
+
+    @Override
+    public HSSFWorkbook getTemplate(String table) {
+
+        QueryParam param = new QueryParam();
+        param.setSort("sort asc");
+        param.addParam(new QueryParamExp("tableName", table, QueryParam.EXP.EQ));
+        param.addParam(new QueryParamExp("isImport", 1, QueryParam.EXP.EQ));
+        List<SysExcelField> fields = findAll(param.getParam());
+        if (CollectionUtils.isEmpty(fields)) throw new ApiRuntimeException("没有Excel模板配置");
+
+        HSSFWorkbook workbook = new HSSFWorkbook();
+        //创建一个Excel表单,参数为sheet的名字
+        HSSFSheet sheet = workbook.createSheet("数据模板");
+        setTitle(workbook, sheet, fields);
+        return workbook;
+    }
+
+    @Override
+    public HSSFWorkbook export(String table, List<Map<String, Object>> data) {
+        QueryParam param = new QueryParam();
+        param.setSort("sort asc");
+        param.addParam(new QueryParamExp("tableName", table, QueryParam.EXP.EQ));
+        param.addParam(new QueryParamExp("isExport", 1, QueryParam.EXP.EQ));
+        List<SysExcelField> fields = findAll(param.getParam());
+        if (CollectionUtils.isEmpty(fields)) throw new ApiRuntimeException("没有Excel模板配置");
+
+        HSSFWorkbook workbook = new HSSFWorkbook();
+        //创建一个Excel表单,参数为sheet的名字
+        HSSFSheet sheet = workbook.createSheet("数据");
+        setTitle(workbook, sheet, fields);
+
+        // 填充数据
+        int length = fields.size();
+        int rowNum = 1;
+        for (Map<String, Object> p : data) {
+            HSSFRow row = sheet.createRow(rowNum);
+            for (int i = 0; i < length; i++) {
+                row.createCell(i).setCellValue(String.valueOf(p.get(fields.get(i).getFieldName())));
+            }
+            rowNum++;
+        }
+        return workbook;
+    }
+
+    @Override
+    public List<Map<String, Object>> importExcel(String table, MultipartFile file) {
+        // 构建数据
+        List<Map<String, Object>> list = new ArrayList<>();
+        try {
+            HSSFWorkbook workbook = new HSSFWorkbook(new POIFSFileSystem(file.getInputStream()));
+            if (workbook.getNumberOfSheets() != 1) throw new ApiRuntimeException("Sheet错误");
+            HSSFSheet sheet = workbook.getSheetAt(0);
+            int rows = sheet.getPhysicalNumberOfRows();
+            if (rows <= 1) throw new ApiRuntimeException("导入的是空数据");
+            QueryParam param = new QueryParam();
+            param.setSort("sort asc");
+            param.addParam(new QueryParamExp("tableName", table, QueryParam.EXP.EQ));
+            param.addParam(new QueryParamExp("isImport", 1, QueryParam.EXP.EQ));
+            List<SysExcelField> fields = findAll(param.getParam());
+            // 中文对应
+            Map<String, SysExcelField> titleMap = new HashMap<>();
+            fields.forEach(p -> titleMap.put(p.getFieldTitle(), p));
+            // 行数对应
+            Map<Integer, SysExcelField> cellMap = new HashMap<>();
+            for (int j = 0; j < rows; j++) {
+                HSSFRow row = sheet.getRow(j);
+                int cells = row.getPhysicalNumberOfCells();
+                // 数据组装
+                Map<String, Object> data = new HashMap<>();
+                for (int k = 0; k < cells; k++) {
+                    HSSFCell cell = row.getCell(k);
+                    String value = getCellValue(cell);
+                    if (j == 0) {
+                        if (!titleMap.containsKey(value))
+                            throw new ApiRuntimeException("模板标题错误:" + value);
+                        cellMap.put(k, titleMap.get(value));
+                    } else if (cellMap.containsKey(k)) {
+                        data.put(cellMap.get(k).getFieldName(), value);
+                    }
+                }
+                if (!CollectionUtils.isEmpty(data)) list.add(data);// 记录非空数据
+            }
+        } catch (IOException e) {
+            throw new ApiRuntimeException("导入文件错误,文件:" + file.getName());
+        }
+        return list;
+    }
+
+    @Override
+    public void outExcelFile(HSSFWorkbook workbook, HttpServletResponse response, String name) {
+        try {
+            //清空response
+            response.reset();
+            //设置response的Header
+            name = URLEncoder.encode(name, "utf-8");
+            response.addHeader("Content-Disposition", "attachment;filename=" + name);
+            OutputStream os = new BufferedOutputStream(response.getOutputStream());
+            response.setContentType("application/vnd.ms-excel;charset=gb2312");
+            //将excel写入到输出流中
+            workbook.write(os);
+            os.flush();
+            os.close();
+        } catch (IOException e) {
+            throw new ApiRuntimeException("模板下载失败");
+        }
+    }
+
+    /**
+     * 设置标题
+     *
+     * @param workbook 文档
+     * @param sheet    sheet
+     * @param fields   字段
+     */
+    private void setTitle(HSSFWorkbook workbook, HSSFSheet sheet, List<SysExcelField> fields) {
+        HSSFRow row = sheet.createRow(0);
+        //设置为居中加粗
+        HSSFCellStyle style = workbook.createCellStyle();
+        HSSFFont font = workbook.createFont();
+        font.setBold(true);
+        style.setFont(font);
+        // 数据填充
+        for (int i = 0; i < fields.size(); i++) {
+            SysExcelField p = fields.get(i);
+            sheet.setColumnWidth(i, p.getWidth() * 256);
+            HSSFCell cell = row.createCell(i);
+            cell.setCellValue(p.getFieldTitle());
+            cell.setCellStyle(style);
+        }
+    }
+
+    private String getCellValue(HSSFCell cell) {
+        if (cell == null) {
+            return "";
+        }
+        if (cell.getCellType() == CellType.NUMERIC) {
+            if (HSSFDateUtil.isCellDateFormatted(cell)) {
+                return HSSFDateUtil.getJavaDate(cell.getNumericCellValue()).toString();
+            } else {
+                return new BigDecimal(cell.getNumericCellValue()).toString();
+            }
+        } else if (cell.getCellType() == CellType.STRING) {
+            return cell.getStringCellValue();
+        } else if (cell.getCellType() == CellType.FORMULA) {
+            return cell.getCellFormula();
+        } else if (cell.getCellType() == CellType.BLANK) {
+            return "";
+        } else if (cell.getCellType() == CellType.BOOLEAN) {
+            return String.valueOf(cell.getBooleanCellValue());
+        } else if (cell.getCellType() == CellType.ERROR) {
+            return "ERROR";
+        } else {
+            return cell.toString().trim();
+        }
+
+    }
+}

+ 13 - 0
src/main/java/cn/fastfun/service/repository/SysExcelFieldRepository.java

@@ -0,0 +1,13 @@
+package cn.fastfun.service.repository;
+
+import cn.fastfun.service.entity.SysExcelField;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+
+/**
+ * Created by Eye
+ *
+ * @Author Bridge
+ */
+public interface SysExcelFieldRepository extends JpaRepository<SysExcelField, String>, JpaSpecificationExecutor<SysExcelField> {
+}