Commit a823da6d7cbf576850930a6612a913a188d0755c

Authored by 王通
1 parent 096cd356

1.一站一码扫码统计

2.minio访问加入签名验证
src/main/java/com/bsth/DataSourceConfig.java 0 → 100644
  1 +package com.bsth;
  2 +
  3 +import org.springframework.beans.factory.annotation.Qualifier;
  4 +import org.springframework.boot.context.properties.ConfigurationProperties;
  5 +import org.springframework.boot.jdbc.DataSourceBuilder;
  6 +import org.springframework.context.annotation.Bean;
  7 +import org.springframework.context.annotation.Configuration;
  8 +import org.springframework.context.annotation.Primary;
  9 +import org.springframework.jdbc.core.JdbcTemplate;
  10 +
  11 +import javax.sql.DataSource;
  12 +
  13 +/**
  14 + * @author Hill
  15 + */
  16 +@Configuration
  17 +public class DataSourceConfig {
  18 +
  19 + @Bean(name = "dataSource")
  20 + @Qualifier("dataSource")
  21 + @Primary
  22 + @ConfigurationProperties(prefix = "spring.datasource.control")
  23 + public DataSource dataSource(){
  24 + return DataSourceBuilder.create().build();
  25 + }
  26 +
  27 + @Bean(name = "infoPublishDataSource")
  28 + @Qualifier("infoPublishDataSource")
  29 + @ConfigurationProperties(prefix = "spring.datasource.info-publish")
  30 + public DataSource infoPublishDataSource(){
  31 + return DataSourceBuilder.create().build();
  32 + }
  33 +
  34 + @Bean(name = "jdbcTemplate")
  35 + @Primary
  36 + public JdbcTemplate jdbcTemplate(@Qualifier("dataSource")DataSource dataSource){
  37 + return new JdbcTemplate(dataSource);
  38 + }
  39 +
  40 + @Bean(name = "infoPublishJdbcTemplate")
  41 + public JdbcTemplate infoPublishJdbcTemplate(@Qualifier("infoPublishDataSource")DataSource dataSource){
  42 + return new JdbcTemplate(dataSource);
  43 + }
  44 +}
src/main/java/com/bsth/controller/alaram/MinioController.java 0 → 100644
  1 +package com.bsth.controller.alaram;
  2 +
  3 +import com.bsth.common.ResponseCode;
  4 +import io.minio.MinioClient;
  5 +import io.minio.GetPresignedObjectUrlArgs;
  6 +import io.minio.http.Method;
  7 +import org.slf4j.Logger;
  8 +import org.slf4j.LoggerFactory;
  9 +import org.springframework.beans.factory.annotation.Autowired;
  10 +import org.springframework.web.bind.annotation.RequestMapping;
  11 +import org.springframework.web.bind.annotation.RequestParam;
  12 +import org.springframework.web.bind.annotation.RestController;
  13 +
  14 +import java.util.ArrayList;
  15 +import java.util.HashMap;
  16 +import java.util.List;
  17 +import java.util.Map;
  18 +import java.util.concurrent.TimeUnit;
  19 +
  20 +@RestController
  21 +@RequestMapping("api/minio")
  22 +public class MinioController {
  23 +
  24 + private final static Logger log = LoggerFactory.getLogger(MinioController.class);
  25 +
  26 + @Autowired
  27 + private MinioClient minioClient;
  28 +
  29 + @RequestMapping(value = "/preSignedUrl")
  30 + public Map<String, Object> preSignedUrl(@RequestParam(defaultValue = "dsm") String bucket, @RequestParam(name = "objects[]") String[] objects) {
  31 + Map<String, Object> result = new HashMap<>();
  32 + try {
  33 + List<String> urls = new ArrayList<>();
  34 + for (String object : objects) {
  35 + String url = minioClient.getPresignedObjectUrl(
  36 + GetPresignedObjectUrlArgs.builder()
  37 + .bucket(bucket)
  38 + .object(object)
  39 + .method(Method.GET)
  40 + .expiry(5, TimeUnit.MINUTES)
  41 + .build()
  42 + );
  43 + urls.add(url);
  44 + }
  45 +
  46 + result.put("urls", urls);
  47 + result.put("status", ResponseCode.SUCCESS);
  48 + } catch (Exception e) {
  49 + log.error("minio预签名异常", e);
  50 + result.put("msg", "minio预签名异常");
  51 + result.put("status", ResponseCode.ERROR);
  52 + }
  53 +
  54 + return result;
  55 + }
  56 +}
src/main/java/com/bsth/controller/publish/InfoPublishController.java 0 → 100644
  1 +package com.bsth.controller.publish;
  2 +
  3 +import com.bsth.common.ResponseCode;
  4 +import com.bsth.entity.publish.ScanStatictic;
  5 +import com.bsth.message.entity.AlarmADASVo;
  6 +import com.bsth.service.alarm.AlarmAdasService;
  7 +import com.bsth.service.publish.InfoPublishService;
  8 +import com.bsth.util.ReportUtils;
  9 +import org.slf4j.Logger;
  10 +import org.slf4j.LoggerFactory;
  11 +import org.springframework.beans.factory.annotation.Autowired;
  12 +import org.springframework.web.bind.annotation.RequestMapping;
  13 +import org.springframework.web.bind.annotation.RequestParam;
  14 +import org.springframework.web.bind.annotation.RestController;
  15 +
  16 +import java.util.*;
  17 +
  18 +@RestController
  19 +@RequestMapping("api/info_publish")
  20 +public class InfoPublishController {
  21 +
  22 + private final static Logger log = LoggerFactory.getLogger(InfoPublishController.class);
  23 +
  24 + @Autowired
  25 + private InfoPublishService infoPublishService;
  26 +
  27 + @RequestMapping(value = "/scan_statistic/list")
  28 + public Map<String, Object> list(@RequestParam Map<String, String> param,
  29 + @RequestParam(defaultValue = "0") int page,
  30 + @RequestParam(defaultValue = "15") int size,
  31 + @RequestParam(defaultValue = "timestamp") String order,
  32 + @RequestParam(defaultValue = "0") int direction) {
  33 + Map<String, Object> result = new HashMap<>();
  34 + try {
  35 + Map<String, Object> results = infoPublishService.list(param, page, size, order, direction);
  36 +
  37 + result.putAll(results);
  38 + result.put("page", page);
  39 + result.put("status", ResponseCode.SUCCESS);
  40 + } catch (Exception e) {
  41 + result.put("status", ResponseCode.ERROR);
  42 + log.error(e.getMessage(), e);
  43 + }
  44 +
  45 + return result;
  46 + }
  47 +
  48 + @RequestMapping(value = "/scan_statistic/list_export")
  49 + public Map<String, Object> list(@RequestParam Map<String, String> param) {
  50 + Map<String, Object> result = new HashMap<>();
  51 + try {
  52 + Map<String, Object> results = infoPublishService.export(param);
  53 + ReportUtils util = new ReportUtils();
  54 + String path = this.getClass().getResource("/").getPath() + "static/pages/forms", rq = param.get("rq");
  55 + util.excelReplace((List<Iterator<?>>) results.get("list"), new Object[]{}, String.format("%s/mould/scanStatistic.xls", path), String.format("%s/export/一站一码扫码情况%s.xls", path, rq));
  56 +
  57 + result.put("status", ResponseCode.SUCCESS);
  58 + } catch (Exception e) {
  59 + result.put("status", ResponseCode.ERROR);
  60 + log.error(e.getMessage(), e);
  61 + }
  62 +
  63 + return result;
  64 + }
  65 +}
src/main/java/com/bsth/controller/realcontrol/DataManagerController.java
1 -package com.bsth.controller.realcontrol;  
2 -  
3 -import com.bsth.service.realcontrol.DataManagerService;  
4 -import org.apache.commons.lang3.StringEscapeUtils;  
5 -import org.springframework.beans.factory.annotation.Autowired;  
6 -import org.springframework.web.bind.annotation.RequestMapping;  
7 -import org.springframework.web.bind.annotation.RequestParam;  
8 -import org.springframework.web.bind.annotation.RestController;  
9 -  
10 -import java.util.Map;  
11 -  
12 -/**  
13 - * 数据管理,包括从老系统的数据迁移。新系统的数据校验等  
14 - * Created by panzhao on 2017/4/17.  
15 - */  
16 -@RestController  
17 -@RequestMapping("dataManager")  
18 -public class DataManagerController {  
19 -  
20 - @Autowired  
21 - DataManagerService dataManagerService;  
22 -  
23 - @RequestMapping("cars/old_now")  
24 - public Map<String, Object> carInfos(@RequestParam Integer lineId){  
25 - return dataManagerService.carInfos(lineId);  
26 - }  
27 -  
28 - @RequestMapping("car/updateDevices")  
29 - public Map<String, Object> updateDevices(@RequestParam String jsonStr){  
30 - jsonStr = StringEscapeUtils.unescapeHtml4(jsonStr);  
31 - return dataManagerService.updateDevices(jsonStr);  
32 - }  
33 -} 1 +package com.bsth.controller.realcontrol;
  2 +
  3 +import com.bsth.service.realcontrol.DataManagerService;
  4 +import org.apache.commons.lang3.StringEscapeUtils;
  5 +import org.springframework.beans.factory.annotation.Autowired;
  6 +import org.springframework.web.bind.annotation.RequestMapping;
  7 +import org.springframework.web.bind.annotation.RequestParam;
  8 +import org.springframework.web.bind.annotation.RestController;
  9 +
  10 +import java.util.Map;
  11 +
  12 +/**
  13 + * 数据管理,包括从老系统的数据迁移。新系统的数据校验等
  14 + * Created by panzhao on 2017/4/17.
  15 + */
  16 +//@RestController
  17 +@RequestMapping("dataManager")
  18 +public class DataManagerController {
  19 +
  20 + @Autowired
  21 + DataManagerService dataManagerService;
  22 +
  23 + @RequestMapping("cars/old_now")
  24 + public Map<String, Object> carInfos(@RequestParam Integer lineId){
  25 + return dataManagerService.carInfos(lineId);
  26 + }
  27 +
  28 + @RequestMapping("car/updateDevices")
  29 + public Map<String, Object> updateDevices(@RequestParam String jsonStr){
  30 + jsonStr = StringEscapeUtils.unescapeHtml4(jsonStr);
  31 + return dataManagerService.updateDevices(jsonStr);
  32 + }
  33 +}
src/main/java/com/bsth/entity/publish/ScanStatictic.java 0 → 100644
  1 +package com.bsth.entity.publish;
  2 +
  3 +public class ScanStatictic {
  4 +
  5 + private String rq;
  6 +
  7 + private String physicalCode;
  8 +
  9 + private String stationName;
  10 +
  11 + private int count;
  12 +
  13 + public String getRq() {
  14 + return rq;
  15 + }
  16 +
  17 + public void setRq(String rq) {
  18 + this.rq = rq;
  19 + }
  20 +
  21 + public String getPhysicalCode() {
  22 + return physicalCode;
  23 + }
  24 +
  25 + public void setPhysicalCode(String physicalCode) {
  26 + this.physicalCode = physicalCode;
  27 + }
  28 +
  29 + public String getStationName() {
  30 + return stationName;
  31 + }
  32 +
  33 + public void setStationName(String stationName) {
  34 + this.stationName = stationName;
  35 + }
  36 +
  37 + public int getCount() {
  38 + return count;
  39 + }
  40 +
  41 + public void setCount(int count) {
  42 + this.count = count;
  43 + }
  44 +}
src/main/java/com/bsth/service/publish/InfoPublishService.java 0 → 100644
  1 +package com.bsth.service.publish;
  2 +
  3 +import java.util.Map;
  4 +
  5 +public interface InfoPublishService {
  6 +
  7 + Map<String, Object> list(Map<String, String> map, int page, int size, String order, int direction);
  8 +
  9 + Map<String, Object> export(Map<String, String> map);
  10 +}
src/main/java/com/bsth/service/publish/impl/InfoPublishServiceImpl.java 0 → 100644
  1 +package com.bsth.service.publish.impl;
  2 +
  3 +import com.bsth.entity.publish.ScanStatictic;
  4 +import com.bsth.service.publish.InfoPublishService;
  5 +import org.springframework.beans.factory.annotation.Autowired;
  6 +import org.springframework.beans.factory.annotation.Qualifier;
  7 +import org.springframework.jdbc.core.BeanPropertyRowMapper;
  8 +import org.springframework.jdbc.core.JdbcTemplate;
  9 +import org.springframework.stereotype.Service;
  10 +import org.springframework.util.StringUtils;
  11 +
  12 +import java.util.*;
  13 +
  14 +@Service
  15 +public class InfoPublishServiceImpl implements InfoPublishService {
  16 +
  17 + @Autowired
  18 + @Qualifier("infoPublishJdbcTemplate")
  19 + private JdbcTemplate infoPublishJdbcTemplate;
  20 +
  21 + @Override
  22 + public Map<String, Object> list(Map<String, String> map, int page, int size, String order, int direction) {
  23 + Map<String, Object> result = new HashMap<>();
  24 + StringBuilder query = new StringBuilder("SELECT ? rq, physicalCode physical_code, stationName station_name,count(1) `count` FROM bsth_h_scan where 1 = 1");
  25 + List<Object> params = new ArrayList<>();
  26 + params.add(map.get("rq"));
  27 + for (Map.Entry<String, String> entry : map.entrySet()) {
  28 + String key = entry.getKey(), value = entry.getValue();
  29 + if (StringUtils.isEmpty(key) || ",page,size,order,direction,".indexOf(String.format(",%s,", key)) > -1) {
  30 + continue;
  31 + }
  32 + if ("rq".equals(key)) {
  33 + query.append(" and rq between ? and ?");
  34 + String[] rqs = value.split("-");
  35 + if (rqs.length != 2) {
  36 + throw new RuntimeException("异常的起止日期");
  37 + }
  38 + for (String rq : rqs) {
  39 + params.add(rq);
  40 + }
  41 + } else {
  42 + query.append(" and ").append(key).append(" like concat(?, '%')");
  43 + params.add(value);
  44 + }
  45 + }
  46 + query.append(" GROUP BY physicalCode, stationName");
  47 + StringBuilder count = new StringBuilder("SELECT COUNT(*) FROM (").append(query).append(") t");
  48 + Integer total = infoPublishJdbcTemplate.queryForObject(count.toString(), params.toArray(), Integer.class);
  49 + query.append(" ORDER BY physicalCode LIMIT ").append(page * size).append(",").append(size);
  50 + List<ScanStatictic> data = infoPublishJdbcTemplate.query(query.toString(), params.toArray(), BeanPropertyRowMapper.newInstance(ScanStatictic.class));
  51 + result.put("list", data);
  52 + result.put("totalPages", total % size == 0 ? total / size - 1 : total / size);
  53 +
  54 + return result;
  55 + }
  56 +
  57 + @Override
  58 + public Map<String, Object> export(Map<String, String> map) {
  59 + Map<String, Object> result = new HashMap<>();
  60 + StringBuilder query = new StringBuilder("SELECT ? rq, physicalCode, stationName,count(1) `count` FROM bsth_h_scan where 1 = 1");
  61 + List<Object> params = new ArrayList<>();
  62 + params.add(map.get("rq"));
  63 + for (Map.Entry<String, String> entry : map.entrySet()) {
  64 + String key = entry.getKey(), value = entry.getValue();
  65 + if ("rq".equals(key)) {
  66 + query.append(" and rq between ? and ?");
  67 + String[] rqs = value.split("-");
  68 + if (rqs.length != 2) {
  69 + throw new RuntimeException("异常的起止日期");
  70 + }
  71 + for (String rq : rqs) {
  72 + params.add(rq);
  73 + }
  74 + } else {
  75 + query.append(" and ").append(key).append(" like concat(?, '%')");
  76 + params.add(value);
  77 + }
  78 + }
  79 + query.append(" GROUP BY physicalCode, stationName");
  80 + query.append(" ORDER BY physicalCode");
  81 + List<Iterator<?>> iterators = new ArrayList<>();
  82 + iterators.add(infoPublishJdbcTemplate.queryForList(query.toString(), params.toArray()).iterator());
  83 + result.put("list", iterators);
  84 +
  85 + return result;
  86 + }
  87 +}
src/main/java/com/bsth/service/realcontrol/impl/DataManagerServiceImpl.java
1 -package com.bsth.service.realcontrol.impl;  
2 -  
3 -import com.alibaba.fastjson.JSONArray;  
4 -import com.alibaba.fastjson.JSONObject;  
5 -import com.bsth.common.ResponseCode;  
6 -import com.bsth.data.BasicData;  
7 -import com.bsth.entity.Cars;  
8 -import com.bsth.repository.CarsRepository;  
9 -import com.bsth.service.realcontrol.DataManagerService;  
10 -import com.bsth.util.db.DBUtils_oldSystem;  
11 -import org.slf4j.Logger;  
12 -import org.slf4j.LoggerFactory;  
13 -import org.springframework.beans.factory.annotation.Autowired;  
14 -import org.springframework.jdbc.core.JdbcTemplate;  
15 -import org.springframework.stereotype.Service;  
16 -  
17 -import java.util.ArrayList;  
18 -import java.util.HashMap;  
19 -import java.util.List;  
20 -import java.util.Map;  
21 -  
22 -/**  
23 - * Created by panzhao on 2017/4/18.  
24 - */  
25 -@Service  
26 -public class DataManagerServiceImpl implements DataManagerService{  
27 -  
28 - @Autowired  
29 - CarsRepository carsRepository;  
30 -  
31 - @Autowired  
32 - JdbcTemplate controlJdbcTemp;  
33 -  
34 - @Autowired  
35 - BasicData.BasicDataLoader dataLoader;  
36 -  
37 - Logger logger = LoggerFactory.getLogger(this.getClass());  
38 -  
39 - @Override  
40 - public Map<String, Object> carInfos(Integer lineId) {  
41 -  
42 - Map<String, Object> rs = new HashMap<>();  
43 - try {  
44 - List<Map<String, String>> nowData = new ArrayList<>();  
45 - List<Map<String, String>> oldData = new ArrayList<>();  
46 - Map<String, String> map;  
47 -  
48 - //查询新系统车辆信息  
49 - List<Cars> list = carsRepository.findCarsByLineId(lineId);  
50 - for(Cars c : list){  
51 - map = new HashMap<>();  
52 - map.put("nbbm", c.getInsideCode());  
53 - map.put("device", c.getEquipmentCode());  
54 - nowData.add(map);  
55 - }  
56 -  
57 - //获取老系统数据  
58 - JdbcTemplate jdbcTemplate = new JdbcTemplate(DBUtils_oldSystem.getDataSource());  
59 - List<Map<String, Object>> oyList = jdbcTemplate.queryForList("select NBBM,SBBH from JJWGPS_T_CLXXB t where xlbm=?", BasicData.lineId2CodeMap.get(lineId));  
60 - for(Map<String, Object> tempMap : oyList){  
61 - map = new HashMap<>();  
62 - map.put("nbbm", tempMap.get("NBBM").toString());  
63 - map.put("device", tempMap.get("SBBH").toString());  
64 - oldData.add(map);  
65 - }  
66 -  
67 - rs.put("status", ResponseCode.SUCCESS);  
68 - rs.put("nows", nowData);  
69 - rs.put("olds", oldData);  
70 - }catch (Exception e){  
71 - logger.error("", e);  
72 - rs.put("status", ResponseCode.ERROR);  
73 - rs.put("msg", e.getMessage());  
74 - }  
75 -  
76 - return rs;  
77 - }  
78 -  
79 - /**  
80 - * 更新设备号  
81 - * @param jsonStr  
82 - * @return  
83 - */  
84 - @Override  
85 - public Map<String, Object> updateDevices(String jsonStr) {  
86 - Map<String, Object> rs = new HashMap<>();  
87 - try {  
88 - int count=0;  
89 - JSONArray array = JSONArray.parseArray(jsonStr);  
90 - JSONObject jObj;  
91 - for(int i = 0; i < array.size(); i ++){  
92 - jObj = array.getJSONObject(i);  
93 - count += controlJdbcTemp.update("update bsth_c_cars set equipment_code=? where inside_code=?"  
94 - , jObj.getString("device"), jObj.getString("nbbm"));  
95 - }  
96 -  
97 - //刷新缓存  
98 - dataLoader.loadDeviceInfo();  
99 - rs.put("status", ResponseCode.SUCCESS);  
100 - rs.put("count", count);  
101 - }catch (Exception e){  
102 - logger.error("", e);  
103 - rs.put("status", ResponseCode.ERROR);  
104 - rs.put("msg", e.getMessage());  
105 - }  
106 - return rs;  
107 - }  
108 -} 1 +package com.bsth.service.realcontrol.impl;
  2 +
  3 +import com.alibaba.fastjson.JSONArray;
  4 +import com.alibaba.fastjson.JSONObject;
  5 +import com.bsth.common.ResponseCode;
  6 +import com.bsth.data.BasicData;
  7 +import com.bsth.entity.Cars;
  8 +import com.bsth.repository.CarsRepository;
  9 +import com.bsth.service.realcontrol.DataManagerService;
  10 +import com.bsth.util.db.DBUtils_oldSystem;
  11 +import org.slf4j.Logger;
  12 +import org.slf4j.LoggerFactory;
  13 +import org.springframework.beans.factory.annotation.Autowired;
  14 +import org.springframework.jdbc.core.JdbcTemplate;
  15 +import org.springframework.stereotype.Service;
  16 +
  17 +import java.util.ArrayList;
  18 +import java.util.HashMap;
  19 +import java.util.List;
  20 +import java.util.Map;
  21 +
  22 +/**
  23 + * Created by panzhao on 2017/4/18.
  24 + */
  25 +//@Service
  26 +public class DataManagerServiceImpl implements DataManagerService{
  27 +
  28 + @Autowired
  29 + CarsRepository carsRepository;
  30 +
  31 + @Autowired
  32 + JdbcTemplate controlJdbcTemp;
  33 +
  34 + @Autowired
  35 + BasicData.BasicDataLoader dataLoader;
  36 +
  37 + Logger logger = LoggerFactory.getLogger(this.getClass());
  38 +
  39 + @Override
  40 + public Map<String, Object> carInfos(Integer lineId) {
  41 +
  42 + Map<String, Object> rs = new HashMap<>();
  43 + try {
  44 + List<Map<String, String>> nowData = new ArrayList<>();
  45 + List<Map<String, String>> oldData = new ArrayList<>();
  46 + Map<String, String> map;
  47 +
  48 + //查询新系统车辆信息
  49 + List<Cars> list = carsRepository.findCarsByLineId(lineId);
  50 + for(Cars c : list){
  51 + map = new HashMap<>();
  52 + map.put("nbbm", c.getInsideCode());
  53 + map.put("device", c.getEquipmentCode());
  54 + nowData.add(map);
  55 + }
  56 +
  57 + //获取老系统数据
  58 + JdbcTemplate jdbcTemplate = new JdbcTemplate(DBUtils_oldSystem.getDataSource());
  59 + List<Map<String, Object>> oyList = jdbcTemplate.queryForList("select NBBM,SBBH from JJWGPS_T_CLXXB t where xlbm=?", BasicData.lineId2CodeMap.get(lineId));
  60 + for(Map<String, Object> tempMap : oyList){
  61 + map = new HashMap<>();
  62 + map.put("nbbm", tempMap.get("NBBM").toString());
  63 + map.put("device", tempMap.get("SBBH").toString());
  64 + oldData.add(map);
  65 + }
  66 +
  67 + rs.put("status", ResponseCode.SUCCESS);
  68 + rs.put("nows", nowData);
  69 + rs.put("olds", oldData);
  70 + }catch (Exception e){
  71 + logger.error("", e);
  72 + rs.put("status", ResponseCode.ERROR);
  73 + rs.put("msg", e.getMessage());
  74 + }
  75 +
  76 + return rs;
  77 + }
  78 +
  79 + /**
  80 + * 更新设备号
  81 + * @param jsonStr
  82 + * @return
  83 + */
  84 + @Override
  85 + public Map<String, Object> updateDevices(String jsonStr) {
  86 + Map<String, Object> rs = new HashMap<>();
  87 + try {
  88 + int count=0;
  89 + JSONArray array = JSONArray.parseArray(jsonStr);
  90 + JSONObject jObj;
  91 + for(int i = 0; i < array.size(); i ++){
  92 + jObj = array.getJSONObject(i);
  93 + count += controlJdbcTemp.update("update bsth_c_cars set equipment_code=? where inside_code=?"
  94 + , jObj.getString("device"), jObj.getString("nbbm"));
  95 + }
  96 +
  97 + //刷新缓存
  98 + dataLoader.loadDeviceInfo();
  99 + rs.put("status", ResponseCode.SUCCESS);
  100 + rs.put("count", count);
  101 + }catch (Exception e){
  102 + logger.error("", e);
  103 + rs.put("status", ResponseCode.ERROR);
  104 + rs.put("msg", e.getMessage());
  105 + }
  106 + return rs;
  107 + }
  108 +}
src/main/java/com/bsth/util/ReportUtils.java
1 -package com.bsth.util;  
2 -  
3 -import java.io.File;  
4 -import java.io.FileInputStream;  
5 -import java.io.FileOutputStream;  
6 -import java.util.*;  
7 -import java.util.regex.Matcher;  
8 -import java.util.regex.Pattern;  
9 -  
10 -import com.bsth.common.ResponseCode;  
11 -import org.apache.commons.lang3.StringUtils;  
12 -import org.apache.poi.hssf.usermodel.HSSFCell;  
13 -import org.apache.poi.hssf.usermodel.HSSFCellStyle;  
14 -import org.apache.poi.hssf.usermodel.HSSFFont;  
15 -import org.apache.poi.hssf.usermodel.HSSFRow;  
16 -import org.apache.poi.hssf.usermodel.HSSFSheet;  
17 -import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
18 -import org.apache.poi.poifs.filesystem.POIFSFileSystem;  
19 -import org.apache.poi.ss.usermodel.Cell;  
20 -import org.apache.poi.ss.usermodel.Workbook;  
21 -import org.apache.poi.ss.util.CellRangeAddress;  
22 -  
23 -import com.bsth.entity.Line;  
24 -import com.bsth.entity.realcontrol.ScheduleRealInfo;  
25 -import org.apache.poi.ss.util.RegionUtil;  
26 -import org.apache.poi.xssf.usermodel.XSSFCell;  
27 -  
28 -public class ReportUtils {  
29 - // private final String packaegName = "com.bsth.entity.";  
30 - private final String packaegName = "com.bsth.entity.realcontrol.";  
31 -  
32 - private final Pattern pattern = Pattern.compile("^\\d+(\\.\\d*)?$");  
33 -  
34 -  
35 - /**  
36 - * /**  
37 - *  
38 - * @param list  
39 - * 模板中,需要重复显示的行所需的数据  
40 - * @param map  
41 - * 模板中除以上list外所有的数据  
42 - * @param index  
43 - * 需要重复的行号,该值为行号减1  
44 - * @param sourcePath  
45 - * 模板路径  
46 - * @param targetPath  
47 - * 生成路径  
48 - */  
49 - public void excelReplace(List<Iterator<?>> list, Object[] tArray,  
50 - String sourcePath, String targetPath,String...NaN) {  
51 - try {  
52 - // 把源文件放入流中  
53 - POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(  
54 - sourcePath));  
55 - HSSFWorkbook wb = new HSSFWorkbook(fs);  
56 - if(tArray.length != 0 && tArray[0] instanceof java.util.Map){  
57 - Map<String, Object> m = (Map<String, Object>)tArray[0];  
58 - if(m.containsKey("sheetName") && m.get("sheetName")!=null  
59 - && m.get("sheetName").toString().trim().length()!=0)  
60 - wb.setSheetName(0, m.get("sheetName").toString());  
61 - }  
62 - HSSFSheet sheet = wb.getSheetAt(0);  
63 - HSSFRow row;  
64 - HSSFCell cell = null;  
65 - String key;  
66 - // 取得总行数  
67 - int rowNum = sheet.getLastRowNum();  
68 - // 取得总列数  
69 - int cellNum = sheet.getRow(0).getLastCellNum();  
70 -  
71 - // 遍历行  
72 - for (int i = 0; i < rowNum; i++) {  
73 - row = sheet.getRow(i);  
74 - // 遍历列  
75 - for (int j = 0; j < cellNum; j++) {  
76 - if (row == null) {  
77 - continue;  
78 - }  
79 - cell = row.getCell(j);  
80 - if (cell == null) {  
81 - continue;  
82 - }  
83 - // 取得每列的内容,如果列内容是$key$格式,则替换内容  
84 - key = getCellValue(cell);  
85 - if (key != null && (key.indexOf("$") != -1 || key.indexOf("#list#") != -1)) {  
86 - // * 列中内容有#list#,则表示该行为模板行,需要以该行为模板  
87 - // * 例如:模板行格式 #list#0_0 $Car.id$  
88 - // * 第一个0表示需要在list中取iterator的索引值  
89 - // * 第二个0表示在iterator中取的第几个对象,如果不为0,则取下一个对象,而不是沿用前面获取的对象  
90 - // * $Car.id$表示所取的对象为Car的对象,并且取值为id的值  
91 - if (key.indexOf("#list#") != -1) {  
92 - key = key.replace("#list#", "").trim();  
93 - String[] lists = key.split(" ");  
94 - // 取得list中的索引值  
95 - int listIndex = Integer  
96 - .valueOf(lists[0].split("_")[0]);  
97 - Iterator<?> iterator = list.get(listIndex);  
98 - // 根据模板创建行并填弃数据,返回增加的行数  
99 - int rowCount = iteratorFillCellValue(wb, sheet,  
100 - cell, iterator, i, rowNum, key,NaN);  
101 - rowNum += rowCount;  
102 - i += rowCount;  
103 - break;  
104 - } else {  
105 - // 直接填充数据的列,从对象数组中取得值,这里的数组不传值  
106 - getValueAndSetCellValue(cell, key, tArray, new String[]{""},NaN);  
107 - }  
108 - }  
109 -  
110 - }  
111 - }  
112 - // 创建目标文件夹  
113 - createFolder(targetPath);  
114 - // 输出文件  
115 - FileOutputStream fileOut = new FileOutputStream(targetPath);  
116 - wb.write(fileOut);  
117 - fileOut.close();  
118 - } catch (Exception e) {  
119 - e.printStackTrace();  
120 - }  
121 - }  
122 -  
123 -  
124 - /**  
125 - *  
126 - * @param sheetList 多sheet模板中,需要重复显示的行所需的数据  
127 - * @param tArray  
128 - * @param sourcePath 模板路径  
129 - * @param targetPath 生成路径  
130 - * @param NaN 非数字参数(String[] 传入的key不做数字处理)  
131 - */  
132 - public void excelMoreSheetReplace(List<List<Iterator<?>>> sheetList, Object[] tArray,  
133 - String sourcePath, String targetPath,String...NaN) {  
134 - try {  
135 - // 把源文件放入流中  
136 - POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(  
137 - sourcePath));  
138 - HSSFWorkbook wb = new HSSFWorkbook(fs);  
139 - for (int s=0; s<sheetList.size(); s++){  
140 - List<Iterator<?>> list = sheetList.get(s);  
141 - if(tArray.length != 0 && tArray[0] instanceof java.util.Map){  
142 - Map<String, Object> m = (Map<String, Object>)tArray[0];  
143 - if(m.containsKey("sheetName"+s+1) && m.get("sheetName"+s+1)!=null  
144 - && m.get("sheetName"+s+1).toString().trim().length()!=0)  
145 - wb.setSheetName(0, m.get("sheetName"+s+1).toString());  
146 - }  
147 - HSSFSheet sheet = wb.getSheetAt(s);  
148 - HSSFRow row;  
149 - HSSFCell cell = null;  
150 - String key;  
151 - // 取得总行数  
152 - int rowNum = sheet.getLastRowNum();  
153 - // 取得总列数  
154 - int cellNum = sheet.getRow(0).getLastCellNum();  
155 -  
156 - // 遍历行  
157 - for (int i = 0; i <= rowNum; i++) {  
158 - row = sheet.getRow(i);  
159 - // 遍历列  
160 - for (int j = 0; j < cellNum; j++) {  
161 - if (row == null) {  
162 - continue;  
163 - }  
164 - cell = row.getCell(j);  
165 - if (cell == null) {  
166 - continue;  
167 - }  
168 - // 取得每列的内容,如果列内容是$key$格式,则替换内容  
169 - key = getCellValue(cell);  
170 - if (key != null && (key.indexOf("$") != -1 || key.indexOf("#list#") != -1)) {  
171 - // * 列中内容有#list#,则表示该行为模板行,需要以该行为模板  
172 - // * 例如:模板行格式 #list#0_0 $Car.id$  
173 - // * 第一个0表示需要在list中取iterator的索引值  
174 - // * 第二个0表示在iterator中取的第几个对象,如果不为0,则取下一个对象,而不是沿用前面获取的对象  
175 - // * $Car.id$表示所取的对象为Car的对象,并且取值为id的值  
176 - if (key.indexOf("#list#") != -1) {  
177 - key = key.replace("#list#", "").trim();  
178 - String[] lists = key.split(" ");  
179 - // 取得list中的索引值  
180 - int listIndex = Integer  
181 - .valueOf(lists[0].split("_")[0]);  
182 - Iterator<?> iterator = list.get(listIndex);  
183 - // 根据模板创建行并填充数据,返回增加的行数  
184 - int rowCount = iteratorFillCellValue(wb, sheet,  
185 - cell, iterator, i, rowNum, key);  
186 - rowNum += rowCount;  
187 - i += rowCount;  
188 - break;  
189 - } else {  
190 - // 直接填充数据的列,从对象数组中取得值,这里的数组不传值  
191 - getValueAndSetCellValue(cell, key, tArray, new String[]{""},NaN);  
192 - }  
193 - }  
194 -  
195 - }  
196 - }  
197 - }  
198 -  
199 - // 创建目标文件夹  
200 - createFolder(targetPath);  
201 - // 输出文件  
202 - FileOutputStream fileOut = new FileOutputStream(targetPath);  
203 - wb.write(fileOut);  
204 - fileOut.close();  
205 - } catch (Exception e) {  
206 - e.printStackTrace();  
207 - }  
208 - }  
209 -  
210 - /**  
211 - * 将file1中的一页sheet复制到file2中  
212 - *  
213 - * @param file1  
214 - * 原sheet所在的excel文件  
215 - * @param file2  
216 - * 目标excel文件  
217 - * @param page  
218 - * 原excel中要被复制的sheet的位置(从0开始)  
219 - * @param rate  
220 - * 调整复制后的缩放倍率(列如:145,则为缩放145%)  
221 - */  
222 - public void copySheetByFile(File file1, File file2, int page, int rate) {  
223 - try {  
224 - // 把源文件放入流中  
225 - POIFSFileSystem fs1 = new POIFSFileSystem(new FileInputStream(file1));  
226 - HSSFWorkbook wb1 = new HSSFWorkbook(fs1);  
227 - HSSFSheet sheet = wb1.getSheetAt(page);  
228 - POIFSFileSystem fs2 = new POIFSFileSystem(new FileInputStream(file2));  
229 - HSSFWorkbook wb2 = new HSSFWorkbook(fs2);  
230 - HSSFSheet createSheet = wb2.createSheet(sheet.getSheetName());  
231 - HSSFCellStyle createCellStyle = wb2.createCellStyle();  
232 - HSSFRow row;  
233 -  
234 - createSheet.setZoom(rate, 100);  
235 - for(int i = 0; i < sheet.getRow(0).getPhysicalNumberOfCells(); i++){  
236 - createSheet.setColumnWidth(i, sheet.getColumnWidth(i));  
237 - }  
238 -  
239 - List<CellRangeAddress> mergedRegions = sheet.getMergedRegions();  
240 - for(int l = 0; l < mergedRegions.size(); l++){  
241 - //复制源表中的合并单元格  
242 - createSheet.addMergedRegion(mergedRegions.get(l));  
243 - }  
244 - int firstRow = sheet.getFirstRowNum();  
245 - int lastRow = sheet.getLastRowNum();  
246 - for(int k = firstRow; k <= lastRow; k++){  
247 - // 创建新建excel Sheet的行  
248 - HSSFRow rowCreat = createSheet.createRow(k);  
249 - // 取得源有excel Sheet的行  
250 - row = sheet.getRow(k);  
251 -// rowCreat.setHeight(row.getHeight()); //设置行高  
252 - // 单元格式样  
253 - int firstCell = row.getFirstCellNum();  
254 - int lastCell = row.getLastCellNum();  
255 - for (int j = firstCell; j < lastCell; j++) {  
256 - // 自动适应列宽 貌似不起作用  
257 -// createSheet.autoSizeColumn(j);  
258 -// System.out.println(row.getCell(j));  
259 - rowCreat.createCell(j);  
260 - String strVal = "";  
261 - if (row.getCell(j)==null) {  
262 -  
263 - } else {  
264 -// strVal = getCellValue(row.getCell(j));  
265 - switch(row.getCell(j).getCellType()) {  
266 - // String  
267 - case HSSFCell.CELL_TYPE_STRING:  
268 - rowCreat.getCell(j).setCellValue(row.getCell(j).getStringCellValue().toString());  
269 - break;  
270 - // numeric类型,excel中,日期格式会转成数字格式存储  
271 - case HSSFCell.CELL_TYPE_NUMERIC:  
272 - rowCreat.getCell(j).setCellValue(row.getCell(j).getNumericCellValue());  
273 - break;  
274 - // 公式类型  
275 - case HSSFCell.CELL_TYPE_FORMULA:  
276 - rowCreat.getCell(j).setCellValue(row.getCell(j).getCellFormula());  
277 - break;  
278 - // boolean类型  
279 - case HSSFCell.CELL_TYPE_BOOLEAN:  
280 - rowCreat.getCell(j).setCellValue(row.getCell(j).getBooleanCellValue());  
281 - break;  
282 - // 空格  
283 - case HSSFCell.CELL_TYPE_BLANK:  
284 - rowCreat.getCell(j).setCellValue("");  
285 - break;  
286 - // 错误值  
287 - case HSSFCell.CELL_TYPE_ERROR:  
288 - rowCreat.getCell(j).setCellValue("");  
289 - break;  
290 - default :  
291 - rowCreat.getCell(j).setCellValue("");  
292 - break;  
293 - }  
294 -// strVal = row.getCell(j).getStringCellValue();  
295 -// rowCreat.getCell(j).setCellValue(strVal);  
296 - copyCellStyle(wb1, row.getCell(j).getCellStyle(), createCellStyle);  
297 - createCellStyle.setBorderTop((short)1);  
298 - createCellStyle.setBorderLeft((short)1);  
299 - createCellStyle.setBorderRight((short)1);  
300 - createCellStyle.setBorderBottom((short)1);  
301 - rowCreat.getCell(j).setCellStyle(createCellStyle);  
302 - }  
303 - }  
304 - }  
305 -  
306 -// int firstRowNum = createSheet.getFirstRowNum();  
307 -// int lastRowNum = createSheet.getLastRowNum();  
308 -// int test = 0;  
309 -// for(int k = firstRowNum; k <= lastRowNum; k++){  
310 -// HSSFRow createRow = createSheet.getRow(k);  
311 -// int firstCellNum = createRow.getFirstCellNum();  
312 -// int lastCellNum = createRow.getLastCellNum();  
313 -// for(int i = firstCellNum; i < lastCellNum; i++){  
314 -// HSSFCell cell = createRow.getCell(i);  
315 -// cell.getCellStyle().setBorderTop(HSSFCellStyle.BORDER_THIN);  
316 -// cell.getCellStyle().setBorderLeft(HSSFCellStyle.BORDER_THIN);  
317 -// cell.getCellStyle().setBorderRight(HSSFCellStyle.BORDER_THIN);  
318 -// cell.getCellStyle().setBorderBottom(HSSFCellStyle.BORDER_THIN);  
319 -// test ++;  
320 -// }  
321 -// }  
322 -// System.out.println("test = " + test);  
323 -  
324 - FileOutputStream fileOut = new FileOutputStream(file2);  
325 - wb2.write(fileOut);  
326 - fileOut.close();  
327 - wb2.close();  
328 - wb1.close();  
329 - fs2.close();  
330 - fs1.close();  
331 - file1.delete();  
332 -// // 创建目标文件夹  
333 -// createFolder(targetPath);  
334 - // 输出文件  
335 - } catch (Exception e) {  
336 - e.printStackTrace();  
337 - }  
338 - }  
339 -  
340 - public void test(File file){  
341 - POIFSFileSystem fs;  
342 - try {  
343 - fs = new POIFSFileSystem(new FileInputStream(file));  
344 - HSSFWorkbook wb = new HSSFWorkbook(fs);  
345 - for(int j = 0; j < wb.getNumberOfSheets(); j++){  
346 - HSSFSheet sheet = wb.getSheetAt(j);  
347 - int firstRowNum = sheet.getFirstRowNum();  
348 - int lastRowNum = sheet.getLastRowNum();  
349 - int test = 0;  
350 - for(int k = firstRowNum; k <= lastRowNum; k++){  
351 - HSSFRow createRow = sheet.getRow(k);  
352 - int firstCellNum = createRow.getFirstCellNum();  
353 - int lastCellNum = createRow.getLastCellNum();  
354 - for(int i = firstCellNum; i < lastCellNum; i++){  
355 - HSSFCell cell = createRow.getCell(i);  
356 - HSSFCellStyle cellStyle = wb.createCellStyle();  
357 -  
358 - cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);  
359 - cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);  
360 - cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);  
361 - cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);  
362 - cell.setCellStyle(cellStyle);  
363 - test ++;  
364 - }  
365 - }  
366 - System.out.println("test = " + test);  
367 -  
368 - FileOutputStream fileOut = new FileOutputStream(file);  
369 - wb.write(fileOut);  
370 - fileOut.close();  
371 - }  
372 - } catch (Exception e) {  
373 - // TODO Auto-generated catch block  
374 - e.printStackTrace();  
375 - }  
376 -  
377 - }  
378 -  
379 - public String getCellValue(HSSFCell cell) {  
380 - int cellType = 0;  
381 - String result = "";  
382 - double d;  
383 - if(cell != null) {  
384 - // 获取列数据类型  
385 - cellType = cell.getCellType();  
386 - // 不同列数据类型,取值方法不同  
387 - switch(cellType) {  
388 - // String  
389 - case HSSFCell.CELL_TYPE_STRING:  
390 - result = cell.getStringCellValue().toString();  
391 - break;  
392 - // numeric类型,excel中,日期格式会转成数字格式存储  
393 - case HSSFCell.CELL_TYPE_NUMERIC:  
394 - result = cell.getNumericCellValue()+"";  
395 - break;  
396 - // 公式类型  
397 - case HSSFCell.CELL_TYPE_FORMULA:  
398 - result = cell.getCellFormula() + "";  
399 - break;  
400 - // boolean类型  
401 - case HSSFCell.CELL_TYPE_BOOLEAN:  
402 - result = cell.getBooleanCellValue() + "";  
403 - break;  
404 - // 空格  
405 - case HSSFCell.CELL_TYPE_BLANK:  
406 - result = null;  
407 - break;  
408 - // 错误值  
409 - case HSSFCell.CELL_TYPE_ERROR:  
410 - result = null;  
411 - break;  
412 - default :  
413 - System.out.println("其它");  
414 - break;  
415 - }  
416 - }  
417 - return result;  
418 - }  
419 -  
420 - /**  
421 - * 根据iterator,以及模板中的标识,填充模板  
422 - *  
423 - * @param wb  
424 - * @param sheet  
425 - * @param cell  
426 - * @param iterator  
427 - * iterator  
428 - * @param index  
429 - * 模板行索引  
430 - * @param rowNum  
431 - * 表格总行数  
432 - * @param key  
433 - * 表格内容  
434 - * @param NaN 非数字参数(String[] 传入的key不做数字处理)  
435 - * @return  
436 - */  
437 - private int iteratorFillCellValue(HSSFWorkbook wb, HSSFSheet sheet,  
438 - HSSFCell cell, Iterator<?> iterator, int index, int rowNum,  
439 - String key,String...NaN) {  
440 - int rowCount = 0;  
441 - Object obj = null;  
442 - int p = 0;  
443 - int i = index;  
444 - HSSFRow newRow = null;  
445 - int tmpCellNum = 0;  
446 - int k = 0;  
447 - int listIndex = 0;  
448 - // 取得模板行  
449 - HSSFRow orgRow = sheet.getRow(index);  
450 - HSSFCellStyle style= wb.createCellStyle();  
451 - try {  
452 - while (iterator.hasNext()) {  
453 - // 取得iterator的对象  
454 - obj = iterator.next();  
455 - // 移动当前编辑行以下的所有行  
456 - if (p != 0) {  
457 - rowNum += 1;  
458 - i += 1;  
459 - rowCount += 1;// 增加的总行数  
460 - // 把当前行以下的所有行往下移动1行  
461 - sheet.shiftRows(i, rowNum, 1);  
462 - }  
463 - p = 1;  
464 - // 创建新行  
465 - newRow = sheet.createRow(index + k++);  
466 - // 把新行的内容换成和模板行一样  
467 - copyRow(wb, orgRow, newRow, true,style);  
468 - tmpCellNum = newRow.getLastCellNum();  
469 - for (int l = 0; l < tmpCellNum; l++) {  
470 - cell = newRow.getCell(l);  
471 - key = getCellValue(cell);  
472 - /**  
473 - * 如果单无格内容为#list#,表示该行是模板行 #list#0_0  
474 - * 第一个0表示需要在list中取iterator的索引值  
475 - * 第二个0表示在iterator中取的第几个对象,如果不为0,则取下一个对象,而不是沿用前面获取的对象  
476 - */  
477 - if(key == null || key.equals("")){  
478 - obj = iterator.next();  
479 - }  
480 - if (key.indexOf("#list#") != -1 && key.indexOf("_0") == -1) {  
481 - if (iterator.hasNext()) {  
482 - obj = iterator.next();  
483 - } else {  
484 - obj = null;  
485 - }  
486 - }  
487 - if (key.trim().indexOf(" ") != -1) {  
488 - key = key.split(" ")[1];  
489 - }  
490 - getValueAndSetCellValue(cell, key, obj,new String[]{listIndex+""},NaN);  
491 - }  
492 - // list的数量  
493 - listIndex ++;  
494 - }  
495 - } catch (Exception e) {  
496 - e.printStackTrace();  
497 - }  
498 - return rowCount;  
499 - }  
500 -  
501 - /**  
502 - * 取到相应的值并填入相应的列中  
503 - *  
504 - * @param cell 列  
505 - * @param key 列内容  
506 - * @param obj 数据源对象  
507 - * @param args 其他参数 数组  
508 - * @param NaN 非数字参数(String[] 传入的key不做数字处理)  
509 - * 数组内容:  
510 - * 0位:在list中的第几条数据  
511 - */  
512 - private void getValueAndSetCellValue(HSSFCell cell, String key, Object obj, String[] args,String...NaN) {  
513 - try {  
514 - // 保有存单元格的内容  
515 - String cellValue = key = key.replace("\\n", "");  
516 - String tmpKey;  
517 - String fieldName = null;  
518 - // 判断单元格内容是否是公式  
519 - if(cell.getCellType() == HSSFCell.CELL_TYPE_FORMULA){  
520 - Pattern p=Pattern.compile("(\\d+)"); //  
521 - Matcher m=p.matcher(key);  
522 - if(m.find()){  
523 - cellValue = key.replace(m.group(1),  
524 - Integer.valueOf(m.group(1))+Integer.valueOf(args[0])+"");  
525 - cell.setCellFormula(cellValue);  
526 - return;  
527 - }  
528 - }else{//其他格式  
529 -  
530 - // 循环截取两个$中间的内容,反射出值  
531 - while (key.indexOf("$") != -1) {  
532 - key = key.substring(key.indexOf("$") + 1);  
533 - // 取两个$中间的内容  
534 - tmpKey = key.substring(0, key.indexOf("$"));  
535 - key = key.substring(key.indexOf("$") + 1);  
536 - // 如果内容是如下格式Cars.id,则从obj中值得相应的对象的值  
537 - if (tmpKey.indexOf(".") != -1) {  
538 - String className = tmpKey.substring(0, tmpKey.indexOf("."));  
539 - // 取得类的全限定名  
540 - String classWholeName = packaegName + className;  
541 - fieldName = tmpKey.substring(tmpKey.indexOf(".") + 1);  
542 - // 如果obj是数组,循环判断哪个对象是对应的  
543 - if (obj instanceof Object[]) {  
544 - Object[] objs = (Object[]) obj;  
545 - for (int k = 0; k < objs.length; k++) {  
546 - if (objs[k].getClass().getName().equals(classWholeName)) {  
547 - cellValue = cellValue.replace("$" + tmpKey  
548 - + "$", getKeyValue(objs[k], fieldName)  
549 - + "");  
550 - } else if(objs[k].getClass().getName().equals("java.util.HashMap")){  
551 - Map<String,Object> map = (HashMap<String,Object>)objs[k];  
552 - cellValue = cellValue.replace("$" + tmpKey + "$",map.get(fieldName)+"");  
553 - }  
554 - }  
555 - } else if (obj.getClass().getName().equals(classWholeName)) {  
556 - cellValue = cellValue.replace("$" + tmpKey + "$",getKeyValue(obj, fieldName) + "");  
557 - } else if (obj.getClass().getName().equals("java.util.HashMap")){  
558 - Map<String,Object> map = (HashMap<String,Object>)obj;  
559 - cellValue = cellValue.replace("$" + tmpKey + "$",map.get(fieldName)+"");  
560 - }  
561 - }  
562 - }  
563 - }  
564 - cell.setCellValue(cellValue);  
565 - Matcher matcher = pattern.matcher(cellValue);  
566 - if (matcher.matches() && !Arrays.asList(NaN).contains(fieldName)) {  
567 - if (cellValue.indexOf(".") > -1) {  
568 - cell.setCellValue(Double.parseDouble(cellValue));  
569 - } else {  
570 - cell.setCellValue(Integer.parseInt(cellValue));  
571 - }  
572 - }  
573 - } catch (Exception e) {  
574 - e.printStackTrace();  
575 - }  
576 -  
577 - }  
578 -  
579 - /**  
580 - * 给列填充数据  
581 - *  
582 - * @param cell  
583 - * 列  
584 - * @param obj  
585 - * 数据源对象  
586 - * @param fieldName  
587 - * 需要取数据的字段  
588 - */  
589 - private Object getKeyValue(Object obj, String fieldName) {  
590 - Object value = "";  
591 - try {  
592 - if (obj != null) {  
593 - ReportRelatedUtils test = new ReportRelatedUtils();  
594 - value = test.getValue(obj, fieldName) == null ? "" : test .getValue(obj, fieldName);  
595 - }  
596 - } catch (Exception e) {  
597 - e.printStackTrace();  
598 - }  
599 - return value;  
600 - }  
601 -  
602 - public static void main(String[] args) {  
603 -  
604 - try {  
605 - ReportUtils ee = new ReportUtils();  
606 - List<Iterator<?>> list = new ArrayList<Iterator<?>>();  
607 - Line line = new Line();  
608 - line.setId(1);  
609 - line.setName("line1");  
610 -  
611 - List<Object> dataList = new ArrayList<Object>();  
612 -  
613 -  
614 - ScheduleRealInfo srr = new ScheduleRealInfo();  
615 - srr.setId((long) 111);  
616 - srr.setXlName("abc11");  
617 -  
618 - ScheduleRealInfo sr = new ScheduleRealInfo();  
619 - sr.setZdsj("06:10");  
620 - sr.setZdsjActual("06:25");  
621 - dataList.add(sr);  
622 - sr = new ScheduleRealInfo();  
623 - sr.setZdsj("06:20");  
624 - sr.setZdsjActual("");  
625 - dataList.add(sr);  
626 - list.add(dataList.iterator());  
627 -  
628 - ee.excelReplace(list, new Object[] { srr }, "D:/waybill.xls",  
629 - "D:/22.xls");  
630 - System.out.println("ok");  
631 - } catch (Exception e) {  
632 - e.printStackTrace();  
633 - }  
634 - }  
635 -  
636 - /**  
637 - * 行复制功能  
638 - *  
639 - * @param fromRow  
640 - * @param toRow  
641 - */  
642 - private void copyRow(HSSFWorkbook wb, HSSFRow fromRow, HSSFRow toRow,  
643 - boolean copyValueFlag, HSSFCellStyle style) {  
644 - for (Iterator<Cell> cellIt = fromRow.cellIterator(); cellIt.hasNext();) {  
645 - HSSFCell tmpCell = (HSSFCell) cellIt.next();  
646 - HSSFCell newCell = toRow.createCell(tmpCell.getColumnIndex(), 0);  
647 - copyCell(wb, tmpCell, newCell, copyValueFlag, tmpCell.getCellStyle());  
648 - }  
649 - }  
650 -  
651 - /**  
652 - * 复制单元格  
653 - *  
654 - * @param srcCell  
655 - * @param distCell  
656 - * @param copyValueFlag  
657 - * true则连同cell的内容一起复制  
658 - */  
659 - public void copyCell(HSSFWorkbook wb, HSSFCell srcCell, HSSFCell distCell,  
660 - boolean copyValueFlag, HSSFCellStyle newstyle) {  
661 -// HSSFCellStyle newstyle = wb.createCellStyle();  
662 - copyCellStyle(wb, srcCell.getCellStyle(), newstyle);  
663 - // 样式  
664 - distCell.setCellStyle(newstyle);  
665 - // 评论  
666 - if (srcCell.getCellComment() != null) {  
667 - distCell.setCellComment(srcCell.getCellComment());  
668 - }  
669 - // 不同数据类型处理  
670 - int srcCellType = srcCell.getCellType();  
671 - distCell.setCellType(srcCellType);  
672 - if (copyValueFlag) {  
673 - if (srcCellType == HSSFCell.CELL_TYPE_NUMERIC) {  
674 - distCell.setCellValue(srcCell.getDateCellValue());  
675 - } else if (srcCellType == HSSFCell.CELL_TYPE_STRING) {  
676 - distCell.setCellValue(srcCell.getRichStringCellValue());  
677 - } else if (srcCellType == HSSFCell.CELL_TYPE_BLANK) {  
678 -  
679 - } else if (srcCellType == HSSFCell.CELL_TYPE_BOOLEAN) {  
680 - distCell.setCellValue(srcCell.getBooleanCellValue());  
681 - } else if (srcCellType == HSSFCell.CELL_TYPE_ERROR) {  
682 - distCell.setCellErrorValue(srcCell.getErrorCellValue());  
683 - } else if (srcCellType == HSSFCell.CELL_TYPE_FORMULA) {  
684 - distCell.setCellFormula(srcCell.getCellFormula());  
685 - } else {  
686 - }  
687 - }  
688 - }  
689 -  
690 - /**  
691 - * 复制一个单元格样式到目的单元格样式  
692 - *  
693 - * @param fromStyle  
694 - * @param toStyle  
695 - */  
696 - public void copyCellStyle(HSSFWorkbook wb, HSSFCellStyle fromStyle,  
697 - HSSFCellStyle toStyle) {  
698 - toStyle.setAlignment(fromStyle.getAlignment());  
699 - // 边框和边框颜色  
700 - toStyle.setBorderBottom(fromStyle.getBorderBottom());  
701 - toStyle.setBorderLeft(fromStyle.getBorderLeft());  
702 - toStyle.setBorderRight(fromStyle.getBorderRight());  
703 - toStyle.setBorderTop(fromStyle.getBorderTop());  
704 - toStyle.setTopBorderColor(fromStyle.getTopBorderColor());  
705 - toStyle.setBottomBorderColor(fromStyle.getBottomBorderColor());  
706 - toStyle.setRightBorderColor(fromStyle.getRightBorderColor());  
707 - toStyle.setLeftBorderColor(fromStyle.getLeftBorderColor());  
708 -  
709 - // 背景和前景  
710 - toStyle.setFillBackgroundColor(fromStyle.getFillBackgroundColor());  
711 - toStyle.setFillForegroundColor(fromStyle.getFillForegroundColor());  
712 -  
713 - toStyle.setDataFormat(fromStyle.getDataFormat());  
714 - toStyle.setFillPattern(fromStyle.getFillPattern());  
715 - toStyle.setHidden(fromStyle.getHidden());  
716 - toStyle.setIndention(fromStyle.getIndention());// 首行缩进  
717 - toStyle.setLocked(fromStyle.getLocked());  
718 - toStyle.setRotation(fromStyle.getRotation());// 旋转  
719 - toStyle.setVerticalAlignment(fromStyle.getVerticalAlignment());  
720 - toStyle.setWrapText(fromStyle.getWrapText());  
721 - // 字体  
722 - toStyle.setFont(fromStyle.getFont(wb));  
723 -  
724 - }  
725 -  
726 - /**  
727 - * 创建文件夹,并删除原有文件  
728 - *  
729 - * @param path  
730 - */  
731 - private void createFolder(String path) {  
732 - File targetFile = null;  
733 - targetFile = new File(path);  
734 - if (targetFile.exists()) {// 删除原有文件  
735 - targetFile.delete();  
736 - }  
737 - // 创建目标文件夹  
738 - targetFile = new File(path.substring(0, path.lastIndexOf("/")));  
739 - if (!targetFile.exists()) {  
740 - targetFile.mkdirs();  
741 - }  
742 - }  
743 -  
744 - public void createFlie(List<List<String>> list, String name, String type){  
745 - HSSFWorkbook workbook = new HSSFWorkbook();  
746 - // 生成一个样式  
747 - HSSFCellStyle style = workbook.createCellStyle();  
748 - // 设置这些样式  
749 -// style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);  
750 -// style.setFillPattern(HSSFCellStyle.BORDER_THIN);  
751 - style.setBorderBottom(HSSFCellStyle.BORDER_THIN);  
752 - style.setBorderLeft(HSSFCellStyle.BORDER_THIN);  
753 - style.setBorderRight(HSSFCellStyle.BORDER_THIN);  
754 - style.setBorderTop(HSSFCellStyle.BORDER_THIN);  
755 - style.setAlignment(HSSFCellStyle.ALIGN_CENTER);  
756 - // 生成一个字体  
757 - HSSFFont font = workbook.createFont();  
758 -// font.setColor(HSSFColor.VIOLET.index);  
759 - font.setFontHeightInPoints((short) 12);  
760 - font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  
761 - // 把字体应用到当前的样式  
762 - style.setFont(font);  
763 - HSSFCellStyle cellStyle =workbook.createCellStyle();  
764 - cellStyle.setFont(font);  
765 - cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); //水平布局:居中  
766 - cellStyle.setWrapText(true);  
767 -  
768 - //设置wordsheet名  
769 - HSSFSheet sheetYS = workbook.createSheet();//设置wordsheet名  
770 - HSSFRow row = sheetYS.createRow(0);  
771 - setCellStyleAndValue(row, style, 0, name);  
772 - CellRangeAddress callRangeAddress = new CellRangeAddress(0,0,0,list.get(0).size()-1);  
773 - sheetYS.addMergedRegion(callRangeAddress);  
774 - // 样式  
775 - setMergeCellStyle (callRangeAddress, sheetYS, workbook);  
776 -  
777 - try{  
778 - for(int i=0; i<list.size(); i++){  
779 - HSSFRow rowYSi = sheetYS.createRow(i+1);  
780 - List<String> stringList = list.get(i);  
781 - int num = 4;  
782 - if("xl".equals(type))  
783 - num = 2;  
784 - else if("cl".equals(type))  
785 - num = 5;  
786 - for(int j=0; j<stringList.size(); j++){  
787 - String str = stringList.get(j);  
788 - if(i == list.size()-1){  
789 - if(j==0) {  
790 - setCellStyleAndValue(rowYSi, style, j, str);  
791 - CellRangeAddress callRangeAddressYSi = new CellRangeAddress(i+1,i+1,0,num);  
792 - sheetYS.addMergedRegion(callRangeAddressYSi);  
793 - // 样式  
794 - setMergeCellStyle (callRangeAddressYSi, sheetYS, workbook);  
795 - }else  
796 - setCellStyleAndValue(rowYSi,style,j+num,str);  
797 - } else {  
798 - setCellStyleAndValue(rowYSi,style,j,str);  
799 - }  
800 - }  
801 - }  
802 -  
803 - // 给列设置宽度自适应  
804 - setSizeColumn1(sheetYS,1,list.get(0).size());  
805 - String path = this.getClass().getResource("/").getPath() + "static/pages/forms/export/";  
806 - String targetPath = path+name+".xls";  
807 - createFolder(targetPath);  
808 - FileOutputStream fout = new FileOutputStream(targetPath);  
809 - //5.输出  
810 - workbook.write(fout);  
811 - fout.close();  
812 - } catch (Exception e) {  
813 - e.printStackTrace();  
814 - }  
815 - }  
816 -  
817 - /**  
818 - * 自适应宽度(中文支持)  
819 - * @param sheet  
820 - * @param size  
821 - */  
822 - private static void setSizeColumn(HSSFSheet sheet, int size) {  
823 - for (int columnNum = 0; columnNum < size; columnNum++) {  
824 - int columnWidth = sheet.getColumnWidth(columnNum) / 256;  
825 - for (int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) {  
826 - HSSFRow currentRow;  
827 - //当前行未被使用过  
828 - if (sheet.getRow(rowNum) == null) {  
829 - currentRow = sheet.createRow(rowNum);  
830 - } else {  
831 - currentRow = sheet.getRow(rowNum);  
832 - }  
833 - if (currentRow.getCell(columnNum) != null) {  
834 - HSSFCell currentCell = currentRow.getCell(columnNum);  
835 - if (currentCell.getCellType() == XSSFCell.CELL_TYPE_STRING) {  
836 - int length = currentCell.getStringCellValue().getBytes().length;  
837 - if (columnWidth < length) {  
838 - columnWidth = length;  
839 - }  
840 - }  
841 - }  
842 - }  
843 - sheet.setColumnWidth(columnNum, columnWidth * 300);  
844 -// sheet.setColumnWidth(columnNum, columnWidth * 256);  
845 - }  
846 - }  
847 -  
848 - /**  
849 - * 自适应宽度(中文支持)  
850 - * @param sheet  
851 - * @param index 从那一行开始自适应  
852 - * @param size  
853 - */  
854 - private static void setSizeColumn1(HSSFSheet sheet,int index, int size) {  
855 - for (int columnNum = index; columnNum < size; columnNum++) {  
856 - int columnWidth = sheet.getColumnWidth(columnNum) / 256;  
857 - for (int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) {  
858 - HSSFRow currentRow;  
859 - //当前行未被使用过  
860 - if (sheet.getRow(rowNum) == null) {  
861 - currentRow = sheet.createRow(rowNum);  
862 - } else {  
863 - currentRow = sheet.getRow(rowNum);  
864 - }  
865 - if (currentRow.getCell(columnNum) != null) {  
866 - HSSFCell currentCell = currentRow.getCell(columnNum);  
867 - if (currentCell.getCellType() == XSSFCell.CELL_TYPE_STRING) {  
868 - int length = currentCell.getStringCellValue().getBytes().length;  
869 - if (columnWidth < length) {  
870 - columnWidth = length;  
871 - }  
872 - }  
873 - }  
874 - }  
875 - sheet.setColumnWidth(columnNum, columnWidth * 300);  
876 -// sheet.setColumnWidth(columnNum, columnWidth * 256);  
877 - }  
878 - }  
879 -  
880 - /**  
881 - * 设置单元格值和样式  
882 - * @param row  
883 - * @param style  
884 - * @param index  
885 - * @param value  
886 - */  
887 - public static void setCellStyleAndValue(HSSFRow row,HSSFCellStyle style,int index,String value){  
888 - HSSFCell cell = row.createCell(index);  
889 - cell.setCellValue(value);  
890 - cell.setCellStyle(style);  
891 - }  
892 - /**  
893 - * 设置合并单元格样式  
894 - * @param cra  
895 - * @param sheet  
896 - * @param workbook  
897 - */  
898 - public static void setMergeCellStyle (CellRangeAddress cra, HSSFSheet sheet, Workbook workbook){  
899 - // 使用RegionUtil类为合并后的单元格添加边框  
900 - RegionUtil.setBorderBottom(1, cra, sheet, workbook); // 下边框  
901 - RegionUtil.setBorderLeft(1, cra, sheet, workbook); // 左边框  
902 - RegionUtil.setBorderRight(1, cra, sheet, workbook); // 有边框  
903 - RegionUtil.setBorderTop(1, cra, sheet, workbook); // 上边框  
904 - }  
905 -} 1 +package com.bsth.util;
  2 +
  3 +import java.io.File;
  4 +import java.io.FileInputStream;
  5 +import java.io.FileOutputStream;
  6 +import java.util.*;
  7 +import java.util.regex.Matcher;
  8 +import java.util.regex.Pattern;
  9 +
  10 +import com.bsth.common.ResponseCode;
  11 +import org.apache.commons.lang3.StringUtils;
  12 +import org.apache.poi.hssf.usermodel.HSSFCell;
  13 +import org.apache.poi.hssf.usermodel.HSSFCellStyle;
  14 +import org.apache.poi.hssf.usermodel.HSSFFont;
  15 +import org.apache.poi.hssf.usermodel.HSSFRow;
  16 +import org.apache.poi.hssf.usermodel.HSSFSheet;
  17 +import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  18 +import org.apache.poi.poifs.filesystem.POIFSFileSystem;
  19 +import org.apache.poi.ss.usermodel.Cell;
  20 +import org.apache.poi.ss.usermodel.Workbook;
  21 +import org.apache.poi.ss.util.CellRangeAddress;
  22 +
  23 +import com.bsth.entity.Line;
  24 +import com.bsth.entity.realcontrol.ScheduleRealInfo;
  25 +import org.apache.poi.ss.util.RegionUtil;
  26 +import org.apache.poi.xssf.usermodel.XSSFCell;
  27 +
  28 +public class ReportUtils {
  29 + // private final String packaegName = "com.bsth.entity.";
  30 + private final String packaegName = "com.bsth.entity.realcontrol.";
  31 +
  32 + private final Pattern pattern = Pattern.compile("^\\d+(\\.\\d*)?$");
  33 +
  34 +
  35 + /**
  36 + * /**
  37 + *
  38 + * @param list
  39 + * 模板中,需要重复显示的行所需的数据
  40 + * @param map
  41 + * 模板中除以上list外所有的数据
  42 + * @param index
  43 + * 需要重复的行号,该值为行号减1
  44 + * @param sourcePath
  45 + * 模板路径
  46 + * @param targetPath
  47 + * 生成路径
  48 + */
  49 + public void excelReplace(List<Iterator<?>> list, Object[] tArray,
  50 + String sourcePath, String targetPath,String...NaN) {
  51 + try {
  52 + // 把源文件放入流中
  53 + POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(
  54 + sourcePath));
  55 + HSSFWorkbook wb = new HSSFWorkbook(fs);
  56 + if(tArray.length != 0 && tArray[0] instanceof java.util.Map){
  57 + Map<String, Object> m = (Map<String, Object>)tArray[0];
  58 + if(m.containsKey("sheetName") && m.get("sheetName")!=null
  59 + && m.get("sheetName").toString().trim().length()!=0)
  60 + wb.setSheetName(0, m.get("sheetName").toString());
  61 + }
  62 + HSSFSheet sheet = wb.getSheetAt(0);
  63 + HSSFRow row;
  64 + HSSFCell cell = null;
  65 + String key;
  66 + // 取得总行数
  67 + int rowNum = sheet.getLastRowNum();
  68 + // 取得总列数
  69 + int cellNum = sheet.getRow(0).getLastCellNum();
  70 +
  71 + // 遍历行
  72 + for (int i = 0; i < rowNum; i++) {
  73 + row = sheet.getRow(i);
  74 + // 遍历列
  75 + for (int j = 0; j < cellNum; j++) {
  76 + if (row == null) {
  77 + continue;
  78 + }
  79 + cell = row.getCell(j);
  80 + if (cell == null) {
  81 + continue;
  82 + }
  83 + // 取得每列的内容,如果列内容是$key$格式,则替换内容
  84 + key = getCellValue(cell);
  85 + if (key != null && (key.indexOf("$") != -1 || key.indexOf("#list#") != -1)) {
  86 + // * 列中内容有#list#,则表示该行为模板行,需要以该行为模板
  87 + // * 例如:模板行格式 #list#0_0 $Car.id$
  88 + // * 第一个0表示需要在list中取iterator的索引值
  89 + // * 第二个0表示在iterator中取的第几个对象,如果不为0,则取下一个对象,而不是沿用前面获取的对象
  90 + // * $Car.id$表示所取的对象为Car的对象,并且取值为id的值
  91 + if (key.indexOf("#list#") != -1) {
  92 + key = key.replace("#list#", "").trim();
  93 + String[] lists = key.split(" ");
  94 + // 取得list中的索引值
  95 + int listIndex = Integer
  96 + .valueOf(lists[0].split("_")[0]);
  97 + Iterator<?> iterator = list.get(listIndex);
  98 + // 根据模板创建行并填弃数据,返回增加的行数
  99 + int rowCount = iteratorFillCellValue(wb, sheet,
  100 + cell, iterator, i, rowNum, key,NaN);
  101 + rowNum += rowCount;
  102 + i += rowCount;
  103 + break;
  104 + } else {
  105 + // 直接填充数据的列,从对象数组中取得值,这里的数组不传值
  106 + getValueAndSetCellValue(cell, key, tArray, new String[]{""},NaN);
  107 + }
  108 + }
  109 +
  110 + }
  111 + }
  112 + // 创建目标文件夹
  113 + createFolder(targetPath);
  114 + // 输出文件
  115 + FileOutputStream fileOut = new FileOutputStream(targetPath);
  116 + wb.write(fileOut);
  117 + fileOut.close();
  118 + } catch (Exception e) {
  119 + e.printStackTrace();
  120 + }
  121 + }
  122 +
  123 +
  124 + /**
  125 + *
  126 + * @param sheetList 多sheet模板中,需要重复显示的行所需的数据
  127 + * @param tArray
  128 + * @param sourcePath 模板路径
  129 + * @param targetPath 生成路径
  130 + * @param NaN 非数字参数(String[] 传入的key不做数字处理)
  131 + */
  132 + public void excelMoreSheetReplace(List<List<Iterator<?>>> sheetList, Object[] tArray,
  133 + String sourcePath, String targetPath,String...NaN) {
  134 + try {
  135 + // 把源文件放入流中
  136 + POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(
  137 + sourcePath));
  138 + HSSFWorkbook wb = new HSSFWorkbook(fs);
  139 + for (int s=0; s<sheetList.size(); s++){
  140 + List<Iterator<?>> list = sheetList.get(s);
  141 + if(tArray.length != 0 && tArray[0] instanceof java.util.Map){
  142 + Map<String, Object> m = (Map<String, Object>)tArray[0];
  143 + if(m.containsKey("sheetName"+s+1) && m.get("sheetName"+s+1)!=null
  144 + && m.get("sheetName"+s+1).toString().trim().length()!=0)
  145 + wb.setSheetName(0, m.get("sheetName"+s+1).toString());
  146 + }
  147 + HSSFSheet sheet = wb.getSheetAt(s);
  148 + HSSFRow row;
  149 + HSSFCell cell = null;
  150 + String key;
  151 + // 取得总行数
  152 + int rowNum = sheet.getLastRowNum();
  153 + // 取得总列数
  154 + int cellNum = sheet.getRow(0).getLastCellNum();
  155 +
  156 + // 遍历行
  157 + for (int i = 0; i <= rowNum; i++) {
  158 + row = sheet.getRow(i);
  159 + // 遍历列
  160 + for (int j = 0; j < cellNum; j++) {
  161 + if (row == null) {
  162 + continue;
  163 + }
  164 + cell = row.getCell(j);
  165 + if (cell == null) {
  166 + continue;
  167 + }
  168 + // 取得每列的内容,如果列内容是$key$格式,则替换内容
  169 + key = getCellValue(cell);
  170 + if (key != null && (key.indexOf("$") != -1 || key.indexOf("#list#") != -1)) {
  171 + // * 列中内容有#list#,则表示该行为模板行,需要以该行为模板
  172 + // * 例如:模板行格式 #list#0_0 $Car.id$
  173 + // * 第一个0表示需要在list中取iterator的索引值
  174 + // * 第二个0表示在iterator中取的第几个对象,如果不为0,则取下一个对象,而不是沿用前面获取的对象
  175 + // * $Car.id$表示所取的对象为Car的对象,并且取值为id的值
  176 + if (key.indexOf("#list#") != -1) {
  177 + key = key.replace("#list#", "").trim();
  178 + String[] lists = key.split(" ");
  179 + // 取得list中的索引值
  180 + int listIndex = Integer
  181 + .valueOf(lists[0].split("_")[0]);
  182 + Iterator<?> iterator = list.get(listIndex);
  183 + // 根据模板创建行并填充数据,返回增加的行数
  184 + int rowCount = iteratorFillCellValue(wb, sheet,
  185 + cell, iterator, i, rowNum, key);
  186 + rowNum += rowCount;
  187 + i += rowCount;
  188 + break;
  189 + } else {
  190 + // 直接填充数据的列,从对象数组中取得值,这里的数组不传值
  191 + getValueAndSetCellValue(cell, key, tArray, new String[]{""},NaN);
  192 + }
  193 + }
  194 +
  195 + }
  196 + }
  197 + }
  198 +
  199 + // 创建目标文件夹
  200 + createFolder(targetPath);
  201 + // 输出文件
  202 + FileOutputStream fileOut = new FileOutputStream(targetPath);
  203 + wb.write(fileOut);
  204 + fileOut.close();
  205 + } catch (Exception e) {
  206 + e.printStackTrace();
  207 + }
  208 + }
  209 +
  210 + /**
  211 + * 将file1中的一页sheet复制到file2中
  212 + *
  213 + * @param file1
  214 + * 原sheet所在的excel文件
  215 + * @param file2
  216 + * 目标excel文件
  217 + * @param page
  218 + * 原excel中要被复制的sheet的位置(从0开始)
  219 + * @param rate
  220 + * 调整复制后的缩放倍率(列如:145,则为缩放145%)
  221 + */
  222 + public void copySheetByFile(File file1, File file2, int page, int rate) {
  223 + try {
  224 + // 把源文件放入流中
  225 + POIFSFileSystem fs1 = new POIFSFileSystem(new FileInputStream(file1));
  226 + HSSFWorkbook wb1 = new HSSFWorkbook(fs1);
  227 + HSSFSheet sheet = wb1.getSheetAt(page);
  228 + POIFSFileSystem fs2 = new POIFSFileSystem(new FileInputStream(file2));
  229 + HSSFWorkbook wb2 = new HSSFWorkbook(fs2);
  230 + HSSFSheet createSheet = wb2.createSheet(sheet.getSheetName());
  231 + HSSFCellStyle createCellStyle = wb2.createCellStyle();
  232 + HSSFRow row;
  233 +
  234 + createSheet.setZoom(rate, 100);
  235 + for(int i = 0; i < sheet.getRow(0).getPhysicalNumberOfCells(); i++){
  236 + createSheet.setColumnWidth(i, sheet.getColumnWidth(i));
  237 + }
  238 +
  239 + List<CellRangeAddress> mergedRegions = sheet.getMergedRegions();
  240 + for(int l = 0; l < mergedRegions.size(); l++){
  241 + //复制源表中的合并单元格
  242 + createSheet.addMergedRegion(mergedRegions.get(l));
  243 + }
  244 + int firstRow = sheet.getFirstRowNum();
  245 + int lastRow = sheet.getLastRowNum();
  246 + for(int k = firstRow; k <= lastRow; k++){
  247 + // 创建新建excel Sheet的行
  248 + HSSFRow rowCreat = createSheet.createRow(k);
  249 + // 取得源有excel Sheet的行
  250 + row = sheet.getRow(k);
  251 +// rowCreat.setHeight(row.getHeight()); //设置行高
  252 + // 单元格式样
  253 + int firstCell = row.getFirstCellNum();
  254 + int lastCell = row.getLastCellNum();
  255 + for (int j = firstCell; j < lastCell; j++) {
  256 + // 自动适应列宽 貌似不起作用
  257 +// createSheet.autoSizeColumn(j);
  258 +// System.out.println(row.getCell(j));
  259 + rowCreat.createCell(j);
  260 + String strVal = "";
  261 + if (row.getCell(j)==null) {
  262 +
  263 + } else {
  264 +// strVal = getCellValue(row.getCell(j));
  265 + switch(row.getCell(j).getCellType()) {
  266 + // String
  267 + case HSSFCell.CELL_TYPE_STRING:
  268 + rowCreat.getCell(j).setCellValue(row.getCell(j).getStringCellValue().toString());
  269 + break;
  270 + // numeric类型,excel中,日期格式会转成数字格式存储
  271 + case HSSFCell.CELL_TYPE_NUMERIC:
  272 + rowCreat.getCell(j).setCellValue(row.getCell(j).getNumericCellValue());
  273 + break;
  274 + // 公式类型
  275 + case HSSFCell.CELL_TYPE_FORMULA:
  276 + rowCreat.getCell(j).setCellValue(row.getCell(j).getCellFormula());
  277 + break;
  278 + // boolean类型
  279 + case HSSFCell.CELL_TYPE_BOOLEAN:
  280 + rowCreat.getCell(j).setCellValue(row.getCell(j).getBooleanCellValue());
  281 + break;
  282 + // 空格
  283 + case HSSFCell.CELL_TYPE_BLANK:
  284 + rowCreat.getCell(j).setCellValue("");
  285 + break;
  286 + // 错误值
  287 + case HSSFCell.CELL_TYPE_ERROR:
  288 + rowCreat.getCell(j).setCellValue("");
  289 + break;
  290 + default :
  291 + rowCreat.getCell(j).setCellValue("");
  292 + break;
  293 + }
  294 +// strVal = row.getCell(j).getStringCellValue();
  295 +// rowCreat.getCell(j).setCellValue(strVal);
  296 + copyCellStyle(wb1, row.getCell(j).getCellStyle(), createCellStyle);
  297 + createCellStyle.setBorderTop((short)1);
  298 + createCellStyle.setBorderLeft((short)1);
  299 + createCellStyle.setBorderRight((short)1);
  300 + createCellStyle.setBorderBottom((short)1);
  301 + rowCreat.getCell(j).setCellStyle(createCellStyle);
  302 + }
  303 + }
  304 + }
  305 +
  306 +// int firstRowNum = createSheet.getFirstRowNum();
  307 +// int lastRowNum = createSheet.getLastRowNum();
  308 +// int test = 0;
  309 +// for(int k = firstRowNum; k <= lastRowNum; k++){
  310 +// HSSFRow createRow = createSheet.getRow(k);
  311 +// int firstCellNum = createRow.getFirstCellNum();
  312 +// int lastCellNum = createRow.getLastCellNum();
  313 +// for(int i = firstCellNum; i < lastCellNum; i++){
  314 +// HSSFCell cell = createRow.getCell(i);
  315 +// cell.getCellStyle().setBorderTop(HSSFCellStyle.BORDER_THIN);
  316 +// cell.getCellStyle().setBorderLeft(HSSFCellStyle.BORDER_THIN);
  317 +// cell.getCellStyle().setBorderRight(HSSFCellStyle.BORDER_THIN);
  318 +// cell.getCellStyle().setBorderBottom(HSSFCellStyle.BORDER_THIN);
  319 +// test ++;
  320 +// }
  321 +// }
  322 +// System.out.println("test = " + test);
  323 +
  324 + FileOutputStream fileOut = new FileOutputStream(file2);
  325 + wb2.write(fileOut);
  326 + fileOut.close();
  327 + wb2.close();
  328 + wb1.close();
  329 + fs2.close();
  330 + fs1.close();
  331 + file1.delete();
  332 +// // 创建目标文件夹
  333 +// createFolder(targetPath);
  334 + // 输出文件
  335 + } catch (Exception e) {
  336 + e.printStackTrace();
  337 + }
  338 + }
  339 +
  340 + public void test(File file){
  341 + POIFSFileSystem fs;
  342 + try {
  343 + fs = new POIFSFileSystem(new FileInputStream(file));
  344 + HSSFWorkbook wb = new HSSFWorkbook(fs);
  345 + for(int j = 0; j < wb.getNumberOfSheets(); j++){
  346 + HSSFSheet sheet = wb.getSheetAt(j);
  347 + int firstRowNum = sheet.getFirstRowNum();
  348 + int lastRowNum = sheet.getLastRowNum();
  349 + int test = 0;
  350 + for(int k = firstRowNum; k <= lastRowNum; k++){
  351 + HSSFRow createRow = sheet.getRow(k);
  352 + int firstCellNum = createRow.getFirstCellNum();
  353 + int lastCellNum = createRow.getLastCellNum();
  354 + for(int i = firstCellNum; i < lastCellNum; i++){
  355 + HSSFCell cell = createRow.getCell(i);
  356 + HSSFCellStyle cellStyle = wb.createCellStyle();
  357 +
  358 + cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
  359 + cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
  360 + cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
  361 + cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
  362 + cell.setCellStyle(cellStyle);
  363 + test ++;
  364 + }
  365 + }
  366 + System.out.println("test = " + test);
  367 +
  368 + FileOutputStream fileOut = new FileOutputStream(file);
  369 + wb.write(fileOut);
  370 + fileOut.close();
  371 + }
  372 + } catch (Exception e) {
  373 + // TODO Auto-generated catch block
  374 + e.printStackTrace();
  375 + }
  376 +
  377 + }
  378 +
  379 + public String getCellValue(HSSFCell cell) {
  380 + int cellType = 0;
  381 + String result = "";
  382 + double d;
  383 + if(cell != null) {
  384 + // 获取列数据类型
  385 + cellType = cell.getCellType();
  386 + // 不同列数据类型,取值方法不同
  387 + switch(cellType) {
  388 + // String
  389 + case HSSFCell.CELL_TYPE_STRING:
  390 + result = cell.getStringCellValue().toString();
  391 + break;
  392 + // numeric类型,excel中,日期格式会转成数字格式存储
  393 + case HSSFCell.CELL_TYPE_NUMERIC:
  394 + result = cell.getNumericCellValue()+"";
  395 + break;
  396 + // 公式类型
  397 + case HSSFCell.CELL_TYPE_FORMULA:
  398 + result = cell.getCellFormula() + "";
  399 + break;
  400 + // boolean类型
  401 + case HSSFCell.CELL_TYPE_BOOLEAN:
  402 + result = cell.getBooleanCellValue() + "";
  403 + break;
  404 + // 空格
  405 + case HSSFCell.CELL_TYPE_BLANK:
  406 + result = null;
  407 + break;
  408 + // 错误值
  409 + case HSSFCell.CELL_TYPE_ERROR:
  410 + result = null;
  411 + break;
  412 + default :
  413 + System.out.println("其它");
  414 + break;
  415 + }
  416 + }
  417 + return result;
  418 + }
  419 +
  420 + /**
  421 + * 根据iterator,以及模板中的标识,填充模板
  422 + *
  423 + * @param wb
  424 + * @param sheet
  425 + * @param cell
  426 + * @param iterator
  427 + * iterator
  428 + * @param index
  429 + * 模板行索引
  430 + * @param rowNum
  431 + * 表格总行数
  432 + * @param key
  433 + * 表格内容
  434 + * @param NaN 非数字参数(String[] 传入的key不做数字处理)
  435 + * @return
  436 + */
  437 + private int iteratorFillCellValue(HSSFWorkbook wb, HSSFSheet sheet,
  438 + HSSFCell cell, Iterator<?> iterator, int index, int rowNum,
  439 + String key,String...NaN) {
  440 + int rowCount = 0;
  441 + Object obj = null;
  442 + int p = 0;
  443 + int i = index;
  444 + HSSFRow newRow = null;
  445 + int tmpCellNum = 0;
  446 + int k = 0;
  447 + int listIndex = 0;
  448 + // 取得模板行
  449 + HSSFRow orgRow = sheet.getRow(index);
  450 + HSSFCellStyle style= wb.createCellStyle();
  451 + try {
  452 + while (iterator.hasNext()) {
  453 + // 取得iterator的对象
  454 + obj = iterator.next();
  455 + // 移动当前编辑行以下的所有行
  456 + if (p != 0) {
  457 + rowNum += 1;
  458 + i += 1;
  459 + rowCount += 1;// 增加的总行数
  460 + // 把当前行以下的所有行往下移动1行
  461 + sheet.shiftRows(i, rowNum, 1);
  462 + }
  463 + p = 1;
  464 + // 创建新行
  465 + newRow = sheet.createRow(index + k++);
  466 + // 把新行的内容换成和模板行一样
  467 + copyRow(wb, orgRow, newRow, true,style);
  468 + tmpCellNum = newRow.getLastCellNum();
  469 + for (int l = 0; l < tmpCellNum; l++) {
  470 + cell = newRow.getCell(l);
  471 + key = getCellValue(cell);
  472 + /**
  473 + * 如果单无格内容为#list#,表示该行是模板行 #list#0_0
  474 + * 第一个0表示需要在list中取iterator的索引值
  475 + * 第二个0表示在iterator中取的第几个对象,如果不为0,则取下一个对象,而不是沿用前面获取的对象
  476 + */
  477 + if(key == null || key.equals("")){
  478 + obj = iterator.next();
  479 + }
  480 + if (key.indexOf("#list#") != -1 && key.indexOf("_0") == -1) {
  481 + if (iterator.hasNext()) {
  482 + obj = iterator.next();
  483 + } else {
  484 + obj = null;
  485 + }
  486 + }
  487 + if (key.trim().indexOf(" ") != -1) {
  488 + key = key.split(" ")[1];
  489 + }
  490 + getValueAndSetCellValue(cell, key, obj,new String[]{listIndex+""},NaN);
  491 + }
  492 + // list的数量
  493 + listIndex ++;
  494 + }
  495 + } catch (Exception e) {
  496 + e.printStackTrace();
  497 + }
  498 + return rowCount;
  499 + }
  500 +
  501 + /**
  502 + * 取到相应的值并填入相应的列中
  503 + *
  504 + * @param cell 列
  505 + * @param key 列内容
  506 + * @param obj 数据源对象
  507 + * @param args 其他参数 数组
  508 + * @param NaN 非数字参数(String[] 传入的key不做数字处理)
  509 + * 数组内容:
  510 + * 0位:在list中的第几条数据
  511 + */
  512 + private void getValueAndSetCellValue(HSSFCell cell, String key, Object obj, String[] args,String...NaN) {
  513 + try {
  514 + // 保有存单元格的内容
  515 + String cellValue = key = key.replace("\\n", "");
  516 + String tmpKey;
  517 + String fieldName = null;
  518 + // 判断单元格内容是否是公式
  519 + if(cell.getCellType() == HSSFCell.CELL_TYPE_FORMULA){
  520 + Pattern p=Pattern.compile("(\\d+)"); //
  521 + Matcher m=p.matcher(key);
  522 + if(m.find()){
  523 + cellValue = key.replace(m.group(1),
  524 + Integer.valueOf(m.group(1))+Integer.valueOf(args[0])+"");
  525 + cell.setCellFormula(cellValue);
  526 + return;
  527 + }
  528 + }else{//其他格式
  529 +
  530 + // 循环截取两个$中间的内容,反射出值
  531 + while (key.indexOf("$") != -1) {
  532 + key = key.substring(key.indexOf("$") + 1);
  533 + // 取两个$中间的内容
  534 + tmpKey = key.substring(0, key.indexOf("$"));
  535 + key = key.substring(key.indexOf("$") + 1);
  536 + // 如果内容是如下格式Cars.id,则从obj中值得相应的对象的值
  537 + if (tmpKey.indexOf(".") != -1) {
  538 + String className = tmpKey.substring(0, tmpKey.indexOf("."));
  539 + // 取得类的全限定名
  540 + String classWholeName = packaegName + className;
  541 + fieldName = tmpKey.substring(tmpKey.indexOf(".") + 1);
  542 + // 如果obj是数组,循环判断哪个对象是对应的
  543 + if (obj instanceof Object[]) {
  544 + Object[] objs = (Object[]) obj;
  545 + for (int k = 0; k < objs.length; k++) {
  546 + if (objs[k].getClass().getName().equals(classWholeName)) {
  547 + cellValue = cellValue.replace("$" + tmpKey
  548 + + "$", getKeyValue(objs[k], fieldName)
  549 + + "");
  550 + } else if(objs[k].getClass().getName().equals("java.util.HashMap")){
  551 + Map<String,Object> map = (HashMap<String,Object>)objs[k];
  552 + cellValue = cellValue.replace("$" + tmpKey + "$",map.get(fieldName)+"");
  553 + }
  554 + }
  555 + } else if (obj.getClass().getName().equals(classWholeName)) {
  556 + cellValue = cellValue.replace("$" + tmpKey + "$",getKeyValue(obj, fieldName) + "");
  557 + } else if (obj instanceof Map){
  558 + Map<String,Object> map = (Map<String, Object>) obj;
  559 + cellValue = cellValue.replace("$" + tmpKey + "$",map.get(fieldName)+"");
  560 + }
  561 + }
  562 + }
  563 + }
  564 + cell.setCellValue(cellValue);
  565 + Matcher matcher = pattern.matcher(cellValue);
  566 + if (matcher.matches() && !Arrays.asList(NaN).contains(fieldName)) {
  567 + if (cellValue.indexOf(".") > -1) {
  568 + cell.setCellValue(Double.parseDouble(cellValue));
  569 + } else {
  570 + cell.setCellValue(Integer.parseInt(cellValue));
  571 + }
  572 + }
  573 + } catch (Exception e) {
  574 + e.printStackTrace();
  575 + }
  576 +
  577 + }
  578 +
  579 + /**
  580 + * 给列填充数据
  581 + *
  582 + * @param cell
  583 + * 列
  584 + * @param obj
  585 + * 数据源对象
  586 + * @param fieldName
  587 + * 需要取数据的字段
  588 + */
  589 + private Object getKeyValue(Object obj, String fieldName) {
  590 + Object value = "";
  591 + try {
  592 + if (obj != null) {
  593 + ReportRelatedUtils test = new ReportRelatedUtils();
  594 + value = test.getValue(obj, fieldName) == null ? "" : test .getValue(obj, fieldName);
  595 + }
  596 + } catch (Exception e) {
  597 + e.printStackTrace();
  598 + }
  599 + return value;
  600 + }
  601 +
  602 + public static void main(String[] args) {
  603 +
  604 + try {
  605 + ReportUtils ee = new ReportUtils();
  606 + List<Iterator<?>> list = new ArrayList<Iterator<?>>();
  607 + Line line = new Line();
  608 + line.setId(1);
  609 + line.setName("line1");
  610 +
  611 + List<Object> dataList = new ArrayList<Object>();
  612 +
  613 +
  614 + ScheduleRealInfo srr = new ScheduleRealInfo();
  615 + srr.setId((long) 111);
  616 + srr.setXlName("abc11");
  617 +
  618 + ScheduleRealInfo sr = new ScheduleRealInfo();
  619 + sr.setZdsj("06:10");
  620 + sr.setZdsjActual("06:25");
  621 + dataList.add(sr);
  622 + sr = new ScheduleRealInfo();
  623 + sr.setZdsj("06:20");
  624 + sr.setZdsjActual("");
  625 + dataList.add(sr);
  626 + list.add(dataList.iterator());
  627 +
  628 + ee.excelReplace(list, new Object[] { srr }, "D:/waybill.xls",
  629 + "D:/22.xls");
  630 + System.out.println("ok");
  631 + } catch (Exception e) {
  632 + e.printStackTrace();
  633 + }
  634 + }
  635 +
  636 + /**
  637 + * 行复制功能
  638 + *
  639 + * @param fromRow
  640 + * @param toRow
  641 + */
  642 + private void copyRow(HSSFWorkbook wb, HSSFRow fromRow, HSSFRow toRow,
  643 + boolean copyValueFlag, HSSFCellStyle style) {
  644 + for (Iterator<Cell> cellIt = fromRow.cellIterator(); cellIt.hasNext();) {
  645 + HSSFCell tmpCell = (HSSFCell) cellIt.next();
  646 + HSSFCell newCell = toRow.createCell(tmpCell.getColumnIndex(), 0);
  647 + copyCell(wb, tmpCell, newCell, copyValueFlag, tmpCell.getCellStyle());
  648 + }
  649 + }
  650 +
  651 + /**
  652 + * 复制单元格
  653 + *
  654 + * @param srcCell
  655 + * @param distCell
  656 + * @param copyValueFlag
  657 + * true则连同cell的内容一起复制
  658 + */
  659 + public void copyCell(HSSFWorkbook wb, HSSFCell srcCell, HSSFCell distCell,
  660 + boolean copyValueFlag, HSSFCellStyle newstyle) {
  661 +// HSSFCellStyle newstyle = wb.createCellStyle();
  662 + copyCellStyle(wb, srcCell.getCellStyle(), newstyle);
  663 + // 样式
  664 + distCell.setCellStyle(newstyle);
  665 + // 评论
  666 + if (srcCell.getCellComment() != null) {
  667 + distCell.setCellComment(srcCell.getCellComment());
  668 + }
  669 + // 不同数据类型处理
  670 + int srcCellType = srcCell.getCellType();
  671 + distCell.setCellType(srcCellType);
  672 + if (copyValueFlag) {
  673 + if (srcCellType == HSSFCell.CELL_TYPE_NUMERIC) {
  674 + distCell.setCellValue(srcCell.getDateCellValue());
  675 + } else if (srcCellType == HSSFCell.CELL_TYPE_STRING) {
  676 + distCell.setCellValue(srcCell.getRichStringCellValue());
  677 + } else if (srcCellType == HSSFCell.CELL_TYPE_BLANK) {
  678 +
  679 + } else if (srcCellType == HSSFCell.CELL_TYPE_BOOLEAN) {
  680 + distCell.setCellValue(srcCell.getBooleanCellValue());
  681 + } else if (srcCellType == HSSFCell.CELL_TYPE_ERROR) {
  682 + distCell.setCellErrorValue(srcCell.getErrorCellValue());
  683 + } else if (srcCellType == HSSFCell.CELL_TYPE_FORMULA) {
  684 + distCell.setCellFormula(srcCell.getCellFormula());
  685 + } else {
  686 + }
  687 + }
  688 + }
  689 +
  690 + /**
  691 + * 复制一个单元格样式到目的单元格样式
  692 + *
  693 + * @param fromStyle
  694 + * @param toStyle
  695 + */
  696 + public void copyCellStyle(HSSFWorkbook wb, HSSFCellStyle fromStyle,
  697 + HSSFCellStyle toStyle) {
  698 + toStyle.setAlignment(fromStyle.getAlignment());
  699 + // 边框和边框颜色
  700 + toStyle.setBorderBottom(fromStyle.getBorderBottom());
  701 + toStyle.setBorderLeft(fromStyle.getBorderLeft());
  702 + toStyle.setBorderRight(fromStyle.getBorderRight());
  703 + toStyle.setBorderTop(fromStyle.getBorderTop());
  704 + toStyle.setTopBorderColor(fromStyle.getTopBorderColor());
  705 + toStyle.setBottomBorderColor(fromStyle.getBottomBorderColor());
  706 + toStyle.setRightBorderColor(fromStyle.getRightBorderColor());
  707 + toStyle.setLeftBorderColor(fromStyle.getLeftBorderColor());
  708 +
  709 + // 背景和前景
  710 + toStyle.setFillBackgroundColor(fromStyle.getFillBackgroundColor());
  711 + toStyle.setFillForegroundColor(fromStyle.getFillForegroundColor());
  712 +
  713 + toStyle.setDataFormat(fromStyle.getDataFormat());
  714 + toStyle.setFillPattern(fromStyle.getFillPattern());
  715 + toStyle.setHidden(fromStyle.getHidden());
  716 + toStyle.setIndention(fromStyle.getIndention());// 首行缩进
  717 + toStyle.setLocked(fromStyle.getLocked());
  718 + toStyle.setRotation(fromStyle.getRotation());// 旋转
  719 + toStyle.setVerticalAlignment(fromStyle.getVerticalAlignment());
  720 + toStyle.setWrapText(fromStyle.getWrapText());
  721 + // 字体
  722 + toStyle.setFont(fromStyle.getFont(wb));
  723 +
  724 + }
  725 +
  726 + /**
  727 + * 创建文件夹,并删除原有文件
  728 + *
  729 + * @param path
  730 + */
  731 + private void createFolder(String path) {
  732 + File targetFile = null;
  733 + targetFile = new File(path);
  734 + if (targetFile.exists()) {// 删除原有文件
  735 + targetFile.delete();
  736 + }
  737 + // 创建目标文件夹
  738 + targetFile = new File(path.substring(0, path.lastIndexOf("/")));
  739 + if (!targetFile.exists()) {
  740 + targetFile.mkdirs();
  741 + }
  742 + }
  743 +
  744 + public void createFlie(List<List<String>> list, String name, String type){
  745 + HSSFWorkbook workbook = new HSSFWorkbook();
  746 + // 生成一个样式
  747 + HSSFCellStyle style = workbook.createCellStyle();
  748 + // 设置这些样式
  749 +// style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);
  750 +// style.setFillPattern(HSSFCellStyle.BORDER_THIN);
  751 + style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
  752 + style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
  753 + style.setBorderRight(HSSFCellStyle.BORDER_THIN);
  754 + style.setBorderTop(HSSFCellStyle.BORDER_THIN);
  755 + style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
  756 + // 生成一个字体
  757 + HSSFFont font = workbook.createFont();
  758 +// font.setColor(HSSFColor.VIOLET.index);
  759 + font.setFontHeightInPoints((short) 12);
  760 + font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
  761 + // 把字体应用到当前的样式
  762 + style.setFont(font);
  763 + HSSFCellStyle cellStyle =workbook.createCellStyle();
  764 + cellStyle.setFont(font);
  765 + cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); //水平布局:居中
  766 + cellStyle.setWrapText(true);
  767 +
  768 + //设置wordsheet名
  769 + HSSFSheet sheetYS = workbook.createSheet();//设置wordsheet名
  770 + HSSFRow row = sheetYS.createRow(0);
  771 + setCellStyleAndValue(row, style, 0, name);
  772 + CellRangeAddress callRangeAddress = new CellRangeAddress(0,0,0,list.get(0).size()-1);
  773 + sheetYS.addMergedRegion(callRangeAddress);
  774 + // 样式
  775 + setMergeCellStyle (callRangeAddress, sheetYS, workbook);
  776 +
  777 + try{
  778 + for(int i=0; i<list.size(); i++){
  779 + HSSFRow rowYSi = sheetYS.createRow(i+1);
  780 + List<String> stringList = list.get(i);
  781 + int num = 4;
  782 + if("xl".equals(type))
  783 + num = 2;
  784 + else if("cl".equals(type))
  785 + num = 5;
  786 + for(int j=0; j<stringList.size(); j++){
  787 + String str = stringList.get(j);
  788 + if(i == list.size()-1){
  789 + if(j==0) {
  790 + setCellStyleAndValue(rowYSi, style, j, str);
  791 + CellRangeAddress callRangeAddressYSi = new CellRangeAddress(i+1,i+1,0,num);
  792 + sheetYS.addMergedRegion(callRangeAddressYSi);
  793 + // 样式
  794 + setMergeCellStyle (callRangeAddressYSi, sheetYS, workbook);
  795 + }else
  796 + setCellStyleAndValue(rowYSi,style,j+num,str);
  797 + } else {
  798 + setCellStyleAndValue(rowYSi,style,j,str);
  799 + }
  800 + }
  801 + }
  802 +
  803 + // 给列设置宽度自适应
  804 + setSizeColumn1(sheetYS,1,list.get(0).size());
  805 + String path = this.getClass().getResource("/").getPath() + "static/pages/forms/export/";
  806 + String targetPath = path+name+".xls";
  807 + createFolder(targetPath);
  808 + FileOutputStream fout = new FileOutputStream(targetPath);
  809 + //5.输出
  810 + workbook.write(fout);
  811 + fout.close();
  812 + } catch (Exception e) {
  813 + e.printStackTrace();
  814 + }
  815 + }
  816 +
  817 + /**
  818 + * 自适应宽度(中文支持)
  819 + * @param sheet
  820 + * @param size
  821 + */
  822 + private static void setSizeColumn(HSSFSheet sheet, int size) {
  823 + for (int columnNum = 0; columnNum < size; columnNum++) {
  824 + int columnWidth = sheet.getColumnWidth(columnNum) / 256;
  825 + for (int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) {
  826 + HSSFRow currentRow;
  827 + //当前行未被使用过
  828 + if (sheet.getRow(rowNum) == null) {
  829 + currentRow = sheet.createRow(rowNum);
  830 + } else {
  831 + currentRow = sheet.getRow(rowNum);
  832 + }
  833 + if (currentRow.getCell(columnNum) != null) {
  834 + HSSFCell currentCell = currentRow.getCell(columnNum);
  835 + if (currentCell.getCellType() == XSSFCell.CELL_TYPE_STRING) {
  836 + int length = currentCell.getStringCellValue().getBytes().length;
  837 + if (columnWidth < length) {
  838 + columnWidth = length;
  839 + }
  840 + }
  841 + }
  842 + }
  843 + sheet.setColumnWidth(columnNum, columnWidth * 300);
  844 +// sheet.setColumnWidth(columnNum, columnWidth * 256);
  845 + }
  846 + }
  847 +
  848 + /**
  849 + * 自适应宽度(中文支持)
  850 + * @param sheet
  851 + * @param index 从那一行开始自适应
  852 + * @param size
  853 + */
  854 + private static void setSizeColumn1(HSSFSheet sheet,int index, int size) {
  855 + for (int columnNum = index; columnNum < size; columnNum++) {
  856 + int columnWidth = sheet.getColumnWidth(columnNum) / 256;
  857 + for (int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) {
  858 + HSSFRow currentRow;
  859 + //当前行未被使用过
  860 + if (sheet.getRow(rowNum) == null) {
  861 + currentRow = sheet.createRow(rowNum);
  862 + } else {
  863 + currentRow = sheet.getRow(rowNum);
  864 + }
  865 + if (currentRow.getCell(columnNum) != null) {
  866 + HSSFCell currentCell = currentRow.getCell(columnNum);
  867 + if (currentCell.getCellType() == XSSFCell.CELL_TYPE_STRING) {
  868 + int length = currentCell.getStringCellValue().getBytes().length;
  869 + if (columnWidth < length) {
  870 + columnWidth = length;
  871 + }
  872 + }
  873 + }
  874 + }
  875 + sheet.setColumnWidth(columnNum, columnWidth * 300);
  876 +// sheet.setColumnWidth(columnNum, columnWidth * 256);
  877 + }
  878 + }
  879 +
  880 + /**
  881 + * 设置单元格值和样式
  882 + * @param row
  883 + * @param style
  884 + * @param index
  885 + * @param value
  886 + */
  887 + public static void setCellStyleAndValue(HSSFRow row,HSSFCellStyle style,int index,String value){
  888 + HSSFCell cell = row.createCell(index);
  889 + cell.setCellValue(value);
  890 + cell.setCellStyle(style);
  891 + }
  892 + /**
  893 + * 设置合并单元格样式
  894 + * @param cra
  895 + * @param sheet
  896 + * @param workbook
  897 + */
  898 + public static void setMergeCellStyle (CellRangeAddress cra, HSSFSheet sheet, Workbook workbook){
  899 + // 使用RegionUtil类为合并后的单元格添加边框
  900 + RegionUtil.setBorderBottom(1, cra, sheet, workbook); // 下边框
  901 + RegionUtil.setBorderLeft(1, cra, sheet, workbook); // 左边框
  902 + RegionUtil.setBorderRight(1, cra, sheet, workbook); // 有边框
  903 + RegionUtil.setBorderTop(1, cra, sheet, workbook); // 上边框
  904 + }
  905 +}
src/main/resources/application-cloud.properties
@@ -12,24 +12,41 @@ spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true @@ -12,24 +12,41 @@ spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
12 spring.jpa.show-sql= false 12 spring.jpa.show-sql= false
13 spring.jpa.properties.hibernate.dialect= org.hibernate.spatial.dialect.mysql.MySQL56InnoDBSpatialDialect 13 spring.jpa.properties.hibernate.dialect= org.hibernate.spatial.dialect.mysql.MySQL56InnoDBSpatialDialect
14 14
15 -#DATABASE  
16 -spring.datasource.driver-class-name= com.mysql.jdbc.Driver  
17 -spring.datasource.url= jdbc:mysql://10.10.2.20/control_dy?useUnicode=true&characterEncoding=utf-8&useSSL=false  
18 -spring.datasource.username= root  
19 -spring.datasource.password= root2jsp  
20 -spring.datasource.type= com.zaxxer.hikari.HikariDataSource  
21 -  
22 -#DATASOURCE SETTING  
23 -spring.datasource.hikari.minimum-idle= 8  
24 -spring.datasource.hikari.maximum-pool-size= 100  
25 -#spring.datasource.hikari.auto-commit= true  
26 -spring.datasource.hikari.idle-timeout= 60000  
27 -#spring.datasource.hikari.pool-name= HikariPool  
28 -spring.datasource.hikari.max-lifetime= 1800000  
29 -spring.datasource.hikari.connection-timeout= 3000  
30 -spring.datasource.hikari.connection-test-query= SELECT 1  
31 -spring.datasource.hikari.validation-timeout= 3000  
32 -spring.datasource.hikari.register-mbeans=true 15 +#DATABASE control
  16 +spring.datasource.control.driver-class-name= com.mysql.jdbc.Driver
  17 +spring.datasource.control.jdbc-url= jdbc:mysql://10.10.2.20/control_dy?useUnicode=true&characterEncoding=utf-8&useSSL=false
  18 +spring.datasource.control.username= root
  19 +spring.datasource.control.password= root2jsp
  20 +spring.datasource.control.type= com.zaxxer.hikari.HikariDataSource
  21 +#DATASOURCE
  22 +spring.datasource.control.hikari.minimum-idle= 8
  23 +spring.datasource.control.hikari.maximum-pool-size= 100
  24 +#spring.datasource.control.hikari.auto-commit= true
  25 +spring.datasource.control.hikari.idle-timeout= 60000
  26 +#spring.datasource.control.hikari.pool-name= HikariPool
  27 +spring.datasource.control.hikari.max-lifetime= 1800000
  28 +spring.datasource.control.hikari.connection-timeout= 3000
  29 +spring.datasource.control.hikari.connection-test-query= SELECT 1
  30 +spring.datasource.control.hikari.validation-timeout= 3000
  31 +spring.datasource.control.hikari.register-mbeans=true
  32 +
  33 +#DATABASE info-publish
  34 +spring.datasource.info-publish.driver-class-name= com.mysql.jdbc.Driver
  35 +spring.datasource.info-publish.jdbc-url= jdbc:mysql://10.10.2.20/info_publish?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=utf-8&useSSL=false
  36 +spring.datasource.info-publish.username= root
  37 +spring.datasource.info-publish.password= root2jsp
  38 +spring.datasource.info-publish.type= com.zaxxer.hikari.HikariDataSource
  39 +#DATASOURCE
  40 +spring.datasource.info-publish.hikari.minimum-idle= 8
  41 +spring.datasource.info-publish.hikari.maximum-pool-size= 100
  42 +#spring.datasource.info-publish.hikari.auto-commit= true
  43 +spring.datasource.info-publish.hikari.idle-timeout= 60000
  44 +#spring.datasource.info-publish.hikari.pool-name= HikariPool
  45 +spring.datasource.info-publish.hikari.max-lifetime= 1800000
  46 +spring.datasource.info-publish.hikari.connection-timeout= 3000
  47 +spring.datasource.info-publish.hikari.connection-test-query= SELECT 1
  48 +spring.datasource.info-publish.hikari.validation-timeout= 3000
  49 +spring.datasource.info-publish.hikari.register-mbeans=true
33 50
34 kafka.use= false 51 kafka.use= false
35 spring.kafka.consumer.bootstrap-servers= 127.0.0.1:9092 52 spring.kafka.consumer.bootstrap-servers= 127.0.0.1:9092
@@ -47,7 +64,7 @@ spring.rabbitmq.username= bsth @@ -47,7 +64,7 @@ spring.rabbitmq.username= bsth
47 spring.rabbitmq.password= bsth001 64 spring.rabbitmq.password= bsth001
48 spring.rabbitmq.virtual-host= /dsm 65 spring.rabbitmq.virtual-host= /dsm
49 66
50 -minio.url= http://10.10.2.21:9008 67 +minio.url= http://118.113.164.50:9008
51 minio.accessKey= umupRhEzO9EiVhLnJ7b9 68 minio.accessKey= umupRhEzO9EiVhLnJ7b9
52 minio.secretKey= VzjQUTN6c8p70HyX8AryRrB6ZjEsF2K28ndctHQh 69 minio.secretKey= VzjQUTN6c8p70HyX8AryRrB6ZjEsF2K28ndctHQh
53 minio.bucket= dsm 70 minio.bucket= dsm
src/main/resources/application-dev.properties
@@ -12,31 +12,41 @@ spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true @@ -12,31 +12,41 @@ spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
12 spring.jpa.show-sql= true 12 spring.jpa.show-sql= true
13 spring.jpa.properties.hibernate.dialect= org.hibernate.spatial.dialect.mysql.MySQL56InnoDBSpatialDialect 13 spring.jpa.properties.hibernate.dialect= org.hibernate.spatial.dialect.mysql.MySQL56InnoDBSpatialDialect
14 14
15 -#DATABASE  
16 -spring.datasource.driver-class-name= com.mysql.jdbc.Driver  
17 -#spring.datasource.url= jdbc:mysql://127.0.0.1/control?useUnicode=true&characterEncoding=utf-8&useSSL=false  
18 -##spring.datasource.url= jdbc:mysql://192.168.168.222/control?useUnicode=true&characterEncoding=utf-8&useSSL=false  
19 -#spring.datasource.username= root  
20 -#spring.datasource.password=  
21 -spring.datasource.url= jdbc:mysql://192.168.168.152/control_dy?useUnicode=true&characterEncoding=utf-8&useSSL=false  
22 -spring.datasource.username= root  
23 -spring.datasource.password= root2jsp  
24 -#spring.datasource.url= jdbc:mysql://192.168.168.241/control?useUnicode=true&characterEncoding=utf-8&useSSL=false  
25 -#spring.datasource.username= root  
26 -#spring.datasource.password= root2jsp  
27 -spring.datasource.type= com.zaxxer.hikari.HikariDataSource 15 +#DATABASE control
  16 +spring.datasource.control.driver-class-name= com.mysql.jdbc.Driver
  17 +spring.datasource.control.jdbc-url= jdbc:mysql://192.168.168.152/control_dy?useUnicode=true&characterEncoding=utf-8&useSSL=false
  18 +spring.datasource.control.username= root
  19 +spring.datasource.control.password= root2jsp
  20 +spring.datasource.control.type= com.zaxxer.hikari.HikariDataSource
  21 +#DATASOURCE
  22 +spring.datasource.control.hikari.minimum-idle= 8
  23 +spring.datasource.control.hikari.maximum-pool-size= 100
  24 +#spring.datasource.control.hikari.auto-commit= true
  25 +spring.datasource.control.hikari.idle-timeout= 60000
  26 +#spring.datasource.control.hikari.pool-name= HikariPool
  27 +spring.datasource.control.hikari.max-lifetime= 1800000
  28 +spring.datasource.control.hikari.connection-timeout= 3000
  29 +spring.datasource.control.hikari.connection-test-query= SELECT 1
  30 +spring.datasource.control.hikari.validation-timeout= 3000
  31 +spring.datasource.control.hikari.register-mbeans=true
28 32
29 -#DATASOURCE SETTING  
30 -spring.datasource.hikari.minimum-idle= 8  
31 -spring.datasource.hikari.maximum-pool-size= 100  
32 -#spring.datasource.hikari.auto-commit= true  
33 -spring.datasource.hikari.idle-timeout= 60000  
34 -#spring.datasource.hikari.pool-name= HikariPool  
35 -spring.datasource.hikari.max-lifetime= 1800000  
36 -spring.datasource.hikari.connection-timeout= 3000  
37 -spring.datasource.hikari.connection-test-query= SELECT 1  
38 -spring.datasource.hikari.validation-timeout= 3000  
39 -spring.datasource.hikari.register-mbeans=true 33 +#DATABASE info-publish
  34 +spring.datasource.info-publish.driver-class-name= com.mysql.jdbc.Driver
  35 +spring.datasource.info-publish.jdbc-url= jdbc:mysql://10.10.2.20/info_publish?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=utf-8&useSSL=false
  36 +spring.datasource.info-publish.username= root
  37 +spring.datasource.info-publish.password= root2jsp
  38 +spring.datasource.info-publish.type= com.zaxxer.hikari.HikariDataSource
  39 +#DATASOURCE
  40 +spring.datasource.info-publish.hikari.minimum-idle= 8
  41 +spring.datasource.info-publish.hikari.maximum-pool-size= 100
  42 +#spring.datasource.info-publish.hikari.auto-commit= true
  43 +spring.datasource.info-publish.hikari.idle-timeout= 60000
  44 +#spring.datasource.info-publish.hikari.pool-name= HikariPool
  45 +spring.datasource.info-publish.hikari.max-lifetime= 1800000
  46 +spring.datasource.info-publish.hikari.connection-timeout= 3000
  47 +spring.datasource.info-publish.hikari.connection-test-query= SELECT 1
  48 +spring.datasource.info-publish.hikari.validation-timeout= 3000
  49 +spring.datasource.info-publish.hikari.register-mbeans=true
40 50
41 kafka.use= false 51 kafka.use= false
42 spring.kafka.consumer.bootstrap-servers= localhost:9092 52 spring.kafka.consumer.bootstrap-servers= localhost:9092
src/main/resources/application-test.properties
@@ -12,27 +12,44 @@ spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true @@ -12,27 +12,44 @@ spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
12 spring.jpa.show-sql= false 12 spring.jpa.show-sql= false
13 spring.jpa.properties.hibernate.dialect= org.hibernate.spatial.dialect.mysql.MySQL56InnoDBSpatialDialect 13 spring.jpa.properties.hibernate.dialect= org.hibernate.spatial.dialect.mysql.MySQL56InnoDBSpatialDialect
14 14
15 -#DATABASE  
16 -spring.datasource.driver-class-name= com.mysql.jdbc.Driver  
17 -spring.datasource.url= jdbc:mysql://192.168.168.152/control_dy?useUnicode=true&characterEncoding=utf-8&useSSL=false  
18 -spring.datasource.username= root  
19 -spring.datasource.password= root2jsp  
20 -spring.datasource.type= com.zaxxer.hikari.HikariDataSource  
21 -  
22 -#DATASOURCE SETTING  
23 -spring.datasource.hikari.minimum-idle= 8  
24 -spring.datasource.hikari.maximum-pool-size= 100  
25 -#spring.datasource.hikari.auto-commit= true  
26 -spring.datasource.hikari.idle-timeout= 60000  
27 -#spring.datasource.hikari.pool-name= HikariPool  
28 -spring.datasource.hikari.max-lifetime= 1800000  
29 -spring.datasource.hikari.connection-timeout= 3000  
30 -spring.datasource.hikari.connection-test-query= SELECT 1  
31 -spring.datasource.hikari.validation-timeout= 3000  
32 -spring.datasource.hikari.register-mbeans=true 15 +#DATABASE control
  16 +spring.datasource.control.driver-class-name= com.mysql.jdbc.Driver
  17 +spring.datasource.control.jdbc-url= jdbc:mysql://10.10.2.200/control_dy?useUnicode=true&characterEncoding=utf-8&useSSL=false
  18 +spring.datasource.control.username= root
  19 +spring.datasource.control.password= root2jsp
  20 +spring.datasource.control.type= com.zaxxer.hikari.HikariDataSource
  21 +#DATASOURCE
  22 +spring.datasource.control.hikari.minimum-idle= 8
  23 +spring.datasource.control.hikari.maximum-pool-size= 100
  24 +#spring.datasource.control.hikari.auto-commit= true
  25 +spring.datasource.control.hikari.idle-timeout= 60000
  26 +#spring.datasource.control.hikari.pool-name= HikariPool
  27 +spring.datasource.control.hikari.max-lifetime= 1800000
  28 +spring.datasource.control.hikari.connection-timeout= 3000
  29 +spring.datasource.control.hikari.connection-test-query= SELECT 1
  30 +spring.datasource.control.hikari.validation-timeout= 3000
  31 +spring.datasource.control.hikari.register-mbeans=true
  32 +
  33 +#DATABASE info-publish
  34 +spring.datasource.info-publish.driver-class-name= com.mysql.jdbc.Driver
  35 +spring.datasource.info-publish.jdbc-url= jdbc:mysql://10.10.2.200/info_publish?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=utf-8&useSSL=false
  36 +spring.datasource.info-publish.username= root
  37 +spring.datasource.info-publish.password= root2jsp
  38 +spring.datasource.info-publish.type= com.zaxxer.hikari.HikariDataSource
  39 +#DATASOURCE
  40 +spring.datasource.info-publish.hikari.minimum-idle= 8
  41 +spring.datasource.info-publish.hikari.maximum-pool-size= 100
  42 +#spring.datasource.info-publish.hikari.auto-commit= true
  43 +spring.datasource.info-publish.hikari.idle-timeout= 60000
  44 +#spring.datasource.info-publish.hikari.pool-name= HikariPool
  45 +spring.datasource.info-publish.hikari.max-lifetime= 1800000
  46 +spring.datasource.info-publish.hikari.connection-timeout= 3000
  47 +spring.datasource.info-publish.hikari.connection-test-query= SELECT 1
  48 +spring.datasource.info-publish.hikari.validation-timeout= 3000
  49 +spring.datasource.info-publish.hikari.register-mbeans=true
33 50
34 kafka.use= false 51 kafka.use= false
35 -spring.kafka.consumer.bootstrap-servers= 192.170.100.114:9092,192.170.100.114:9093,192.170.100.114:9094 52 +spring.kafka.consumer.bootstrap-servers= 127.0.0.1:9092
36 spring.kafka.consumer.group-id= schedule-system-test 53 spring.kafka.consumer.group-id= schedule-system-test
37 spring.kafka.consumer.auto-offset-reset= latest 54 spring.kafka.consumer.auto-offset-reset= latest
38 spring.kafka.consumer.key-deserializer= org.apache.kafka.common.serialization.StringDeserializer 55 spring.kafka.consumer.key-deserializer= org.apache.kafka.common.serialization.StringDeserializer
src/main/resources/static/pages/forms/mould/scanStatistic.xls 0 → 100644
No preview for this file type
src/main/resources/static/pages/permission/authorize_all/user_auth.html
@@ -56,6 +56,7 @@ @@ -56,6 +56,7 @@
56 <li><label><input class="uk-checkbox" type="checkbox" data-event="form_message"> 调度消息分析</label></li> 56 <li><label><input class="uk-checkbox" type="checkbox" data-event="form_message"> 调度消息分析</label></li>
57 <li><label><input class="uk-checkbox" type="checkbox" data-event="form_changetochange"> 换人换车情况统计表</label></li> 57 <li><label><input class="uk-checkbox" type="checkbox" data-event="form_changetochange"> 换人换车情况统计表</label></li>
58 <li><label><input class="uk-checkbox" type="checkbox" data-event="form_repairReport"> 维修上报记录</label></li> 58 <li><label><input class="uk-checkbox" type="checkbox" data-event="form_repairReport"> 维修上报记录</label></li>
  59 + <li><label><input class="uk-checkbox" type="checkbox" data-event="form_scanStatistic"> 一站一码</label></li>
59 </ul> 60 </ul>
60 </div> 61 </div>
61 62
src/main/resources/static/real_control_v2/fragments/north/nav/alarm/adas.html
@@ -122,13 +122,27 @@ @@ -122,13 +122,27 @@
122 if (resetPagination) 122 if (resetPagination)
123 pagination(rs.totalPages + 1, rs.page); 123 pagination(rs.totalPages + 1, rs.page);
124 $('.image_link').on('click', function() { 124 $('.image_link').on('click', function() {
125 - var urls = $(this).data('url').split(','), items = []; 125 + var urls = $(this).data('url').split(','), items = [], file, type;
126 urls.forEach(function (url, idx) { 126 urls.forEach(function (url, idx) {
127 - if (url.endsWith('.bin')) return;  
128 - items.push({title: '附件' + (idx + 1), source: 'http://118.113.164.50:9008/dsm/' + url}); 127 + if (!url || url.endsWith('.bin')) return;
  128 + items.push(url);
129 }); 129 });
130 -  
131 - UIkit.lightbox.create(items, {keyboard: true}).show(); 130 + gb_common.$get('/api/minio/preSignedUrl', {objects: items}, function(res) {
  131 + urls = res.urls;
  132 + items = [];
  133 + urls.forEach(function (url, idx) {
  134 + file = url.substring(0, url.indexOf('?'));
  135 + if (file.endsWith('.png') || file.endsWith('.jpg')) {
  136 + type = 'image';
  137 + } else {
  138 + type = 'video';
  139 + }
  140 + items.push({title: '附件' + (idx + 1), source: url, type: type});
  141 + });
  142 + if (items.length > 0) {
  143 + UIkit.lightbox.create(items, {keyboard: true}).show();
  144 + }
  145 + })
132 }) 146 })
133 }); 147 });
134 }; 148 };
src/main/resources/static/real_control_v2/fragments/north/nav/alarm/dsm.html
@@ -125,13 +125,27 @@ @@ -125,13 +125,27 @@
125 if (resetPagination) 125 if (resetPagination)
126 pagination(rs.totalPages + 1, rs.page); 126 pagination(rs.totalPages + 1, rs.page);
127 $('.image_link').on('click', function() { 127 $('.image_link').on('click', function() {
128 - var urls = $(this).data('url').split(','), items = []; 128 + var urls = $(this).data('url').split(','), items = [], file, type;
129 urls.forEach(function (url, idx) { 129 urls.forEach(function (url, idx) {
130 - if (url.endsWith('.bin')) return;  
131 - items.push({title: '附件' + (idx + 1), source: 'http://118.113.164.50:9008/dsm/' + url}); 130 + if (!url || url.endsWith('.bin')) return;
  131 + items.push(url);
132 }); 132 });
133 -  
134 - UIkit.lightbox.create(items, {keyboard: true}).show(); 133 + gb_common.$get('/api/minio/preSignedUrl', {objects: items}, function(res) {
  134 + urls = res.urls;
  135 + items = [];
  136 + urls.forEach(function (url, idx) {
  137 + file = url.substring(0, url.indexOf('?'));
  138 + if (file.endsWith('.png') || file.endsWith('.jpg')) {
  139 + type = 'image';
  140 + } else {
  141 + type = 'video';
  142 + }
  143 + items.push({title: '附件' + (idx + 1), source: url, type: type});
  144 + });
  145 + if (items.length > 0) {
  146 + UIkit.lightbox.create(items, {keyboard: true}).show();
  147 + }
  148 + })
135 }) 149 })
136 }); 150 });
137 }; 151 };
src/main/resources/static/real_control_v2/fragments/north/nav/info_publish/scan_statistic.html 0 → 100644
  1 +<div class="uk-modal ct_move_modal" id="scan_statistic_modal" style="z-index: 99;">
  2 + <div class="uk-modal-dialog" style="width: 1150px;">
  3 + <a href="" class="uk-modal-close uk-close"></a>
  4 + <div class="uk-modal-header">
  5 + <h2>一站一码扫码情况</h2></div>
  6 +
  7 + <div class="uk-panel uk-panel-box uk-panel-box-primary">
  8 + <form class="uk-form search-form">
  9 + <fieldset data-uk-margin>
  10 + <legend>
  11 + 数据检索
  12 + </legend>
  13 + <span class="horizontal-field">日期</span>
  14 + <input class="uk-input" type="text" id="rq" name="rq" placeholder="日期" autocomplete="false">
  15 + <span class="horizontal-field">站名</span>
  16 + <input type="text" name="stationName" placeholder="站名" autocomplete="false"/>
  17 + <button class="uk-button">检索</button>
  18 + <button id="exportBtn" class="uk-button">导出</button>
  19 + </fieldset>
  20 + </form>
  21 + </div>
  22 + <div style="height: 495px;margin:5px 0 -18px;">
  23 + <table class="ct-fixed-table uk-table uk-table-hover">
  24 + <thead>
  25 + <tr>
  26 + <th style="width: 10%;">日期</th>
  27 + <th style="width: 11%;">站名</th>
  28 + <th style="width: 11%;">站点编码</th>
  29 + <th style="width: 12%;">次数</th>
  30 + </tr>
  31 + </thead>
  32 + <tbody data-uk-observe>
  33 + </tbody>
  34 + </table>
  35 + </div>
  36 +
  37 + <div class="uk-modal-footer uk-text-right pagination-wrap">
  38 + </div>
  39 + </div>
  40 +
  41 +
  42 + <script id="scan-statistic-table-template" type="text/html">
  43 + {{each array as statistic i}}
  44 + <tr>
  45 + <td style="width: 14%;">{{statistic.rq}}</td>
  46 + <td style="width: 14%;">{{statistic.stationName}}</td>
  47 + <td style="width: 13%;">{{statistic.physicalCode}}</td>
  48 + <td style="width: 13%;">{{statistic.count}}</td>
  49 + </tr>
  50 + {{/each}}
  51 + </script>
  52 +
  53 + <script>
  54 + (function() {
  55 + var modal = '#scan_statistic_modal';
  56 + var form = $('.search-form', modal);
  57 + var page = 0;
  58 + var pageSize = 12;
  59 +
  60 + //日期选择框
  61 + var fs='YYYYMMDD', ets=moment().subtract(1, 'days').format(fs), sts=moment().subtract(6, 'days').format(fs);
  62 + flatpickr('#rq', {
  63 + mode: "range", dateFormat: "Ymd","locale": "zh", defaultDate: [sts, ets]
  64 + });
  65 +
  66 + $(modal).on('init', function(e, data) {
  67 + e.stopPropagation();
  68 + //车辆 autocomplete
  69 + gb_common.carAutocomplete($('.autocomplete-cars', modal), gb_data_basic.carsArray());
  70 +
  71 + query();
  72 + });
  73 +
  74 + //sumit event
  75 + form.on('submit', function(e) {
  76 + e.preventDefault();
  77 + resetPagination = true;
  78 + page=0;
  79 + query();
  80 + });
  81 +
  82 + $('#exportBtn').on('click', function(e) {
  83 + var data = form.serializeJSON();
  84 + if (!data.rq) {
  85 + layer.msg('日期为必填项')
  86 + return;
  87 + }
  88 + var start = data.rq.substring(0, 8), end = data.rq.substring(11);
  89 + data.rq = start + '-' + end;
  90 +
  91 + gb_common.$get('/api/info_publish/scan_statistic/list_export', data, function (rs) {
  92 + window.open('/downloadFile/download?fileName=一站一码扫码情况' + data.rq + '.xls');
  93 + })
  94 + })
  95 +
  96 + var query = function() {
  97 + var data = form.serializeJSON();
  98 + if (!data.rq) {
  99 + layer.msg('日期为必填项')
  100 + return;
  101 + }
  102 + var start = data.rq.substring(0, 8), end = data.rq.substring(11);
  103 + data.rq = start + '-' + end;
  104 + data.page = page;
  105 + data.size = pageSize;
  106 +
  107 + gb_common.$post('/api/info_publish/scan_statistic/list', data, function (rs) {
  108 + var bodyHtml = template('scan-statistic-table-template', {
  109 + array: rs.list
  110 + });
  111 + $('table tbody', modal).html(bodyHtml);
  112 + if (resetPagination)
  113 + pagination(rs.totalPages + 1, rs.page);
  114 + });
  115 + };
  116 +
  117 + var resetPagination = true;
  118 + var pagination = function(pages, currentPage) {
  119 + var wrap = $('.pagination-wrap', modal).empty()
  120 + ,e = $('<ul class="uk-pagination"></ul>').appendTo(wrap);
  121 +
  122 + var pagination = UIkit.pagination(e, {
  123 + pages: pages,
  124 + currentPage: currentPage
  125 + });
  126 +
  127 + e.on('select.uk.pagination', function(e, pageIndex){
  128 + page = pageIndex;
  129 + query();
  130 + });
  131 +
  132 + resetPagination = false;
  133 + };
  134 + })();
  135 + </script>
  136 +</div>
src/main/resources/static/real_control_v2/js/data/json/north_toolbar.json
@@ -128,6 +128,12 @@ @@ -128,6 +128,12 @@
128 "text": "维修上报记录", 128 "text": "维修上报记录",
129 "event": "form_repairReport", 129 "event": "form_repairReport",
130 "icon": "uk-icon-table" 130 "icon": "uk-icon-table"
  131 + },
  132 + {
  133 + "id": 2.97,
  134 + "text": "一站一码",
  135 + "event": "form_scanStatistic",
  136 + "icon": "uk-icon-table"
131 } 137 }
132 ] 138 ]
133 }, 139 },
src/main/resources/static/real_control_v2/js/north/toolbar.js
@@ -212,6 +212,9 @@ var gb_northToolbar = (function () { @@ -212,6 +212,9 @@ var gb_northToolbar = (function () {
212 form_repairReport: function () { 212 form_repairReport: function () {
213 gb_embed_form_hanlde.open_modal_form_fragment('/pages/forms/statement/repairReport.html', '维修上报记录'); 213 gb_embed_form_hanlde.open_modal_form_fragment('/pages/forms/statement/repairReport.html', '维修上报记录');
214 }, 214 },
  215 + form_scanStatistic: function () {
  216 + open_modal('/real_control_v2/fragments/north/nav/info_publish/scan_statistic.html', {}, modal_opts);
  217 + },
215 form_turnoutrate: function () { 218 form_turnoutrate: function () {
216 gb_embed_form_hanlde.open_modal_form_fragment('/pages/mforms/changetochanges/turnoutrate.html', '营运线路出车率统计表'); 219 gb_embed_form_hanlde.open_modal_form_fragment('/pages/mforms/changetochanges/turnoutrate.html', '营运线路出车率统计表');
217 }, 220 },
src/main/resources/static/real_control_v2/js/safe_driv/safeDriv.js
@@ -108,16 +108,28 @@ var gb_safe_driv = (function () { @@ -108,16 +108,28 @@ var gb_safe_driv = (function () {
108 case 'dsm': 108 case 'dsm':
109 // adas报警数据 109 // adas报警数据
110 case 'adas': 110 case 'adas':
111 - var urls = $(this).data('url').split(','), items = []; 111 + var urls = $(this).data('url').split(','), items = [], that = this, file, type;
112 urls.forEach(function (url, idx) { 112 urls.forEach(function (url, idx) {
113 if (!url || url.endsWith('.bin')) return; 113 if (!url || url.endsWith('.bin')) return;
114 - items.push({title: '附件' + (idx + 1), source: 'http://118.113.164.50:9008/dsm/' + url}); 114 + items.push(url);
115 }); 115 });
116 - $(this).remove();  
117 -  
118 - if (items.length > 0) {  
119 - UIkit.lightbox.create(items, {keyboard: true}).show();  
120 - } 116 + gb_common.$get('/api/minio/preSignedUrl', {objects: items}, function(res) {
  117 + $(that).remove();
  118 + urls = res.urls;
  119 + items = [];
  120 + urls.forEach(function (url, idx) {
  121 + file = url.substring(0, url.indexOf('?'));
  122 + if (file.endsWith('.png') || file.endsWith('.jpg')) {
  123 + type = 'image';
  124 + } else {
  125 + type = 'video';
  126 + }
  127 + items.push({title: '附件' + (idx + 1), source: url, type: type});
  128 + });
  129 + if (items.length > 0) {
  130 + UIkit.lightbox.create(items, {keyboard: true}).show();
  131 + }
  132 + })
121 break; 133 break;
122 default: 134 default:
123 break; 135 break;