|
@@ -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();
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+}
|