ffb88e69d06437e7b12a22f614812b8bb554576b.svn-base 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874
  1. package cn.com.goldenwater.dcproj.utils.impexcel;
  2. import cn.com.goldenwater.dcproj.dao.AttAdXBaseDao;
  3. import cn.com.goldenwater.dcproj.dao.AttRsBaseDao;
  4. import cn.com.goldenwater.dcproj.dao.AttRsBaseFjDao;
  5. import cn.com.goldenwater.dcproj.model.AttAdXBase;
  6. import cn.com.goldenwater.dcproj.model.AttRsBase;
  7. import cn.com.goldenwater.dcproj.model.AttRsBaseFj;
  8. import cn.com.goldenwater.dcproj.param.AttAdXBaseParam;
  9. import cn.com.goldenwater.dcproj.param.AttRsBaseParam;
  10. import cn.com.goldenwater.dcproj.service.AttRsBaseService;
  11. import cn.com.goldenwater.dcproj.socket.WebSocketServer;
  12. import org.apache.commons.collections.MapUtils;
  13. import org.apache.commons.lang.StringUtils;
  14. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  15. import org.apache.poi.ss.usermodel.Cell;
  16. import org.apache.poi.ss.usermodel.Row;
  17. import org.apache.poi.ss.usermodel.Sheet;
  18. import org.apache.poi.ss.usermodel.Workbook;
  19. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  20. import org.springframework.beans.factory.annotation.Autowired;
  21. import java.io.File;
  22. import java.io.FileInputStream;
  23. import java.io.IOException;
  24. import java.lang.reflect.Field;
  25. import java.lang.reflect.InvocationTargetException;
  26. import java.lang.reflect.Method;
  27. import java.text.ParseException;
  28. import java.text.SimpleDateFormat;
  29. import java.util.*;
  30. import java.util.regex.Matcher;
  31. import java.util.regex.Pattern;
  32. import static cn.com.goldenwater.dcproj.utils.export.FieldFormatDispatch.getFormatValue;
  33. import static cn.com.goldenwater.dcproj.utils.impexcel.ImpUtil.XLS;
  34. import static cn.com.goldenwater.dcproj.utils.impexcel.ImpUtil.checkIsDate;
  35. /**
  36. * <p>
  37. * 导入工具类
  38. *
  39. * </p>
  40. *
  41. * @author liyz
  42. * @date 2019/4/10 19:43
  43. */
  44. public class ImpRsExcel {
  45. private static final SimpleDateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
  46. private static final String EMPTY = "";
  47. @Autowired
  48. private AttRsBaseDao attRsBaseDao;
  49. @Autowired
  50. private AttAdXBaseDao attAdXBaseDao;
  51. @Autowired
  52. private AttRsBaseService attRsBaseService;
  53. @Autowired
  54. private AttRsBaseFjDao attRsBaseFjDao;
  55. public static void main(String[] args) {
  56. String filePath = "D:\\最新福建省水库名录20200227.xls";
  57. int startRow = 0;
  58. int endRow = 0;
  59. try {
  60. //List<HashMap> bookList = (List<HashMap>) ImpRsExcel.importExcel(filePath, startRow, endRow, HashMap.class, "", "sk");
  61. } catch (Exception e) {
  62. e.printStackTrace();
  63. }
  64. }
  65. /**
  66. * 正则表达式 用于匹配属性的第一个字母
  67. */
  68. private static final String REGEX = "[a-zA-Z]";
  69. /**
  70. * 功能: Excel数据导入到数据库
  71. * 参数: originUrl[Excel表的所在路径]
  72. * 参数: startRow[从第几行开始]
  73. * 参数: endRow[到第几行结束
  74. * (0表示所有行;
  75. * 正数表示到第几行结束;
  76. * 负数表示到倒数第几行结束)]
  77. * 参数: clazz[要返回的对象集合的类型]
  78. */
  79. public void importExcel(String originUrl, int startRow, int endRow, Class<?> clazz, String sid, String type) throws Exception {
  80. //是否打印提示信息
  81. boolean showInfo = true;
  82. //doImportExcel(originUrl, startRow, endRow, showInfo, clazz, sid, type);
  83. }
  84. /**
  85. * 功能:判断文件是否存在
  86. */
  87. public static File isExist(String originUrl) throws IOException {
  88. // 判断文件是否存在
  89. File file = new File(originUrl);
  90. if (!file.exists()) {
  91. throw new IOException("文件名为" + file.getName() + "Excel文件不存在!");
  92. }
  93. return file;
  94. }
  95. /**
  96. * 功能:真正实现导入
  97. */
  98. public void doImportExcel(String originUrl, int startRow, int endRow, boolean showInfo, Class<?> clazz,
  99. String sid, String type,AttAdXBaseDao attAdXBaseDao1,AttRsBaseFjDao attRsBaseFjDao1
  100. ,AttRsBaseService attRsBaseService1,AttRsBaseDao attRsBaseDao1) throws IOException, ParseException {
  101. attAdXBaseDao = attAdXBaseDao1;
  102. attRsBaseFjDao = attRsBaseFjDao1;
  103. attRsBaseService = attRsBaseService1;
  104. attRsBaseDao = attRsBaseDao1;
  105. // 判断文件是否存在
  106. File file = isExist(originUrl);
  107. HSSFWorkbook wb = null;
  108. FileInputStream fis = null;
  109. List<Row> rowList = new ArrayList<Row>();
  110. try {
  111. fis = new FileInputStream(file);
  112. // 去读Excel
  113. wb = new HSSFWorkbook(fis);
  114. Sheet sheet = wb.getSheetAt(0);
  115. // 获取最后行号
  116. int lastRowNum = sheet.getLastRowNum();
  117. // 如果>0,表示有数据
  118. if (lastRowNum > 0) {
  119. out("\n开始读取并校验名为【" + sheet.getSheetName() + "】的内容:", showInfo, sid);
  120. WebSocketServer.sendInfo(SIMPLE_DATE_FORMAT.format(new Date()) + "-②开始读取并校验名为【" + sheet.getSheetName() + "】的内容", sid);
  121. }
  122. List<String> keys = new ArrayList<>();
  123. Row keyRow = sheet.getRow(0);
  124. for (int i = 0; i < keyRow.getPhysicalNumberOfCells(); i++) {
  125. keys.add(keyRow.getCell(i).toString());
  126. }
  127. Row row = null;
  128. // 循环读取
  129. for (int i = startRow; i <= lastRowNum + endRow; i++) {
  130. row = sheet.getRow(i);
  131. HashMap<String, String> map = new LinkedHashMap<>();
  132. if (row != null) {
  133. rowList.add(row);
  134. // 获取每一单元格的值
  135. for (int j = 0; j < row.getLastCellNum(); j++) {
  136. String value = getCellValue(row.getCell(j));
  137. if(j<keys.size()){
  138. map.put(keys.get(j), value);
  139. }
  140. }
  141. String adCd="";
  142. Map<String, String> ads = getAdCds("福建省",map.get("所在市"),map.get("归属地"));
  143. String provinceCode = "350000000000";
  144. String cityCode = ads.get("shi");
  145. String countryCode = ads.get("xian");
  146. if(org.apache.commons.lang3.StringUtils.isNotBlank(countryCode)){
  147. adCd = countryCode;
  148. }else if(org.apache.commons.lang3.StringUtils.isNotBlank(cityCode)){
  149. adCd = cityCode;
  150. }else if(org.apache.commons.lang3.StringUtils.isNotBlank(provinceCode)){
  151. adCd = provinceCode;
  152. }
  153. if(StringUtils.isEmpty(countryCode)){
  154. System.out.println("行政区划未找到:"+map.get("所在市")+"--"+map.get("归属地")+"--"+map.get("水库名称"));
  155. }
  156. Map<String, String> mapRs = checkRsBase(map.get("水库名称"), countryCode);
  157. String rsCode = mapRs.get("rsCode");
  158. AttRsBaseFj attRsBase = new AttRsBaseFj();
  159. if(StringUtils.isNotBlank(rsCode)){
  160. attRsBase = attRsBaseFjDao.get(rsCode);
  161. }
  162. attRsBase.setRsName(map.get("水库名称"));
  163. attRsBase.setEngScal(encagl(map.get("工程规模")));
  164. attRsBase.setAdmDiv(adCd);
  165. attRsBase.setAdmDivName(map.get("归属地"));
  166. attRsBase.setLocation("福建省-"+map.get("所在市")+"-"+map.get("归属地"));
  167. attRsBase.setRsAdmName(map.get("管理单位名称"));
  168. attRsBase.setRegCode(map.get("注册登记号"));
  169. attRsBase.setRsClass(map.get("功能类别"));
  170. SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");//注意月份是MM
  171. if(StringUtils.isNotEmpty(map.get("下闸蓄水时间"))){
  172. Date date = simpleDateFormat.parse(map.get("下闸蓄水时间"));
  173. attRsBase.setImpdDt(date);
  174. }
  175. if(StringUtils.isNotEmpty(map.get("最近一次加固改造_蓄水运行时间"))){
  176. Date date = simpleDateFormat.parse(map.get("最近一次加固改造_蓄水运行时间"));
  177. attRsBase.setRnfcImpdDt(date);
  178. }
  179. if(StringUtils.isNotEmpty(map.get("总库容"))){
  180. attRsBase.setTotCap(Double.parseDouble(map.get("总库容")));
  181. }
  182. attRsBase.setDamType(map.get("主坝坝型"));
  183. attRsBase.setDamTypeMat(typeMat(map.get("主坝坝型")));
  184. attRsBase.setDamTypeStr(typeStr(map.get("主坝坝型")));
  185. if(StringUtils.isNotEmpty(map.get("主坝最大坝高"))){
  186. attRsBase.setDamSizeHig(Double.parseDouble(map.get("主坝最大坝高")));
  187. }
  188. if(StringUtils.isNotEmpty(map.get("设计洪水位"))){
  189. attRsBase.setDesFlStag(Double.parseDouble(map.get("设计洪水位")));
  190. }
  191. if(StringUtils.isNotEmpty(map.get("防洪高水位"))){
  192. attRsBase.setFlConTopStag(Double.parseDouble(map.get("防洪高水位")));
  193. }
  194. attRsBase.setEdtrPesr("福建");
  195. attRsBase.setWiunWaoLegPers(map.get("行政责任人"));
  196. attRsBase.setWiunWaoLegPersUnit(map.get("行政责任人工作单位"));
  197. attRsBase.setWiunWaoLegPersDuty(map.get("行政责任人职务"));
  198. attRsBase.setWiunWaoLegPersTel(map.get("行政责任人联系方式"));
  199. attRsBase.setTechPers(map.get("技术责任人"));
  200. attRsBase.setTechPersUnit(map.get("技术责任人工作单位"));
  201. attRsBase.setTechPersDuty(map.get("技术责任人职务"));
  202. attRsBase.setTechPersTel(map.get("技术责任人联系方式"));
  203. attRsBase.setPatrolPers(map.get("巡查责任人"));
  204. attRsBase.setPatrolPersUnit(map.get("巡查责任人工作单位"));
  205. attRsBase.setPatrolPersDuty(map.get("巡查责任人职务"));
  206. attRsBase.setPatrolPersTel(map.get("巡查责任人联系方式"));
  207. attRsBase.setUptm(new Date());
  208. attRsBase.setRegNo(i+1+"");
  209. if(StringUtils.isEmpty(rsCode)){
  210. String str = attRsBaseFjDao.findMax(countryCode.substring(0,6));
  211. if(StringUtils.isEmpty(str)){
  212. str = countryCode;
  213. }
  214. long a = Long.parseLong(str)+1;
  215. rsCode = a+"";
  216. attRsBase.setRsCode(rsCode);
  217. out("第" + (i + 1) + "行:", showInfo, false, sid);
  218. System.out.println(attRsBase.toString());
  219. attRsBaseFjDao.insert(attRsBase);
  220. }else {
  221. attRsBase.setRsCode(rsCode);
  222. attRsBaseFjDao.insert(attRsBase);
  223. }
  224. }
  225. }
  226. } catch (IOException e) {
  227. e.printStackTrace();
  228. } finally {
  229. wb.close();
  230. }
  231. //return returnObjectList(rowList, type, sid);
  232. }
  233. /**
  234. * 功能:获取单元格的值
  235. */
  236. private static String getCellValue(Cell cell) {
  237. Object result = "";
  238. if (cell != null) {
  239. switch (cell.getCellType()) {
  240. case STRING:
  241. result = cell.getStringCellValue();
  242. break;
  243. case NUMERIC:
  244. result = cell.getNumericCellValue();
  245. break;
  246. case BOOLEAN:
  247. result = cell.getBooleanCellValue();
  248. break;
  249. case FORMULA:
  250. result = cell.getCellFormula();
  251. break;
  252. case ERROR:
  253. result = cell.getErrorCellValue();
  254. break;
  255. case BLANK:
  256. break;
  257. default:
  258. break;
  259. }
  260. }
  261. return result.toString();
  262. }
  263. /**
  264. * 功能:返回指定的对象集合
  265. */
  266. private static List<Object> returnObjectList(List<Row> rowList, String type, String sid) {
  267. List<Object> objectList = null;
  268. List<String> keys = new ArrayList<>();
  269. Row keyRow = rowList.get(0);
  270. for (int i = 0; i < keyRow.getPhysicalNumberOfCells(); i++) {
  271. keys.add(keyRow.getCell(i).toString());
  272. }
  273. try {
  274. objectList = new ArrayList<>();
  275. for (int i = 1; i < rowList.size(); i++) {
  276. Row row = rowList.get(i);
  277. HashMap<String, String> map = new LinkedHashMap<>();
  278. int check = 0;
  279. for (int j = 0; j < keys.size(); j++) {
  280. // 此单元格的值
  281. String cellValue = getCellValue(row.getCell(j));
  282. // 格式化后的值
  283. String formatValue = getFormatValue(type, keys.get(j), cellValue, true).toString();
  284. map.put(keys.get(j), formatValue);
  285. // 先不格式化
  286. // map.put(keys.get(j), getCellValue(row.getCell(j)));
  287. // 错误的话输出一下
  288. if (formatValue.contains("$E$")) {
  289. check++;
  290. WebSocketServer.sendInfo(SIMPLE_DATE_FORMAT.format(new Date()) + "-第" + (i + 5) + "行[" + cellValue + "]填写有误,请查看弹出信息,并重新上传模板!", sid);
  291. }
  292. }
  293. if (check == 0 && row.getCell(2) != null && !"".equals(row.getCell(2).toString())) {
  294. WebSocketServer.sendInfo(SIMPLE_DATE_FORMAT.format(new Date()) + "-第" + (i + 5) + "行验证完毕,数据无误。", sid);
  295. }
  296. objectList.add(map);
  297. }
  298. } catch (Exception e) {
  299. e.printStackTrace();
  300. }
  301. return objectList;
  302. }
  303. /**
  304. * 功能:返回指定的对象集合,(有单表实体类时可用)
  305. */
  306. private static List<Object> returnObjectList(List<Row> rowList, Class<?> clazz) {
  307. List<Object> objectList = null;
  308. Object obj = null;
  309. String attribute = null;
  310. String value = null;
  311. int j = 0;
  312. try {
  313. objectList = new ArrayList<Object>();
  314. Field[] declaredFields = clazz.getDeclaredFields();
  315. for (Row row : rowList) {
  316. j = 0;
  317. obj = clazz.newInstance();
  318. for (Field field : declaredFields) {
  319. attribute = field.getName().toString();
  320. value = getCellValue(row.getCell(j));
  321. setAttrributeValue(obj, attribute, value);
  322. j++;
  323. }
  324. objectList.add(obj);
  325. }
  326. } catch (Exception e) {
  327. e.printStackTrace();
  328. }
  329. return objectList;
  330. }
  331. /**
  332. * 功能:给指定对象的指定属性赋值
  333. */
  334. public static void setAttrributeValue(Object obj, String attribute, String value) {
  335. //得到该属性的set方法名
  336. String methodName = convertToMethodName(attribute, obj.getClass(), true);
  337. Method[] methods = obj.getClass().getMethods();
  338. for (Method method : methods) {
  339. /*
  340. 因为这里只是调用bean中属性的set方法,属性名称不能重复
  341. 所以set方法也不会重复,所以就直接用方法名称去锁定一个方法
  342. (注:在java中,锁定一个方法的条件是方法名及参数)
  343. */
  344. if (method.getName().equals(methodName)) {
  345. Class<?>[] parameterC = method.getParameterTypes();
  346. try {
  347. /*
  348. 如果是(整型,浮点型,布尔型,字节型,时间类型,Long类型),
  349. 按照各自的规则把value值转换成各自的类型
  350. 否则一律按类型强制转换(比如:String类型)
  351. */
  352. if (parameterC[0] == int.class || parameterC[0] == Integer.class) {
  353. value = value.substring(0, value.lastIndexOf("."));
  354. method.invoke(obj, Integer.valueOf(value));
  355. break;
  356. } else if (parameterC[0] == float.class || parameterC[0] == Float.class) {
  357. method.invoke(obj, Float.valueOf(value));
  358. break;
  359. } else if (parameterC[0] == double.class || parameterC[0] == Double.class) {
  360. if (value != null && !"".equals(value)) {
  361. method.invoke(obj, Double.valueOf(value));
  362. }
  363. break;
  364. } else if (parameterC[0] == long.class || parameterC[0] == Long.class) {
  365. if (value != null && !"".equals(value)) {
  366. method.invoke(obj, Long.valueOf(value));
  367. }
  368. break;
  369. } else if (parameterC[0] == byte.class || parameterC[0] == Byte.class) {
  370. method.invoke(obj, Byte.valueOf(value));
  371. break;
  372. } else if (parameterC[0] == boolean.class || parameterC[0] == Boolean.class) {
  373. method.invoke(obj, Boolean.valueOf(value));
  374. break;
  375. } else if (parameterC[0] == Date.class) {
  376. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  377. Date date = null;
  378. try {
  379. if (StringUtils.isNotBlank(value)) {
  380. // 可能是年月日格式的,处理一下
  381. value = value.replace("年","-").replace("月","-").replace("日","");
  382. if(checkIsDate(value)){
  383. date = sdf.parse(value.replace("/","-"));
  384. }
  385. }
  386. } catch (Exception e) {
  387. e.printStackTrace();
  388. }
  389. method.invoke(obj, date);
  390. break;
  391. } else {
  392. method.invoke(obj, parameterC[0].cast(value));
  393. break;
  394. }
  395. } catch (IllegalArgumentException e) {
  396. e.printStackTrace();
  397. } catch (IllegalAccessException e) {
  398. e.printStackTrace();
  399. } catch (InvocationTargetException e) {
  400. e.printStackTrace();
  401. } catch (SecurityException e) {
  402. e.printStackTrace();
  403. }
  404. }
  405. }
  406. }
  407. /**
  408. * 功能:根据属性生成对应的set/get方法
  409. */
  410. private static String convertToMethodName(String attribute, Class<?> objClass, boolean isSet) {
  411. // 通过正则表达式来匹配第一个字符
  412. Pattern p = Pattern.compile(REGEX);
  413. Matcher m = p.matcher(attribute);
  414. StringBuilder sb = new StringBuilder();
  415. // 如果是set方法名称
  416. if (isSet) {
  417. sb.append("set");
  418. } else {
  419. // get方法名称
  420. try {
  421. Field attributeField = objClass.getDeclaredField(attribute);
  422. // 如果类型为boolean
  423. if (attributeField.getType() == boolean.class || attributeField.getType() == Boolean.class) {
  424. sb.append("is");
  425. } else {
  426. sb.append("get");
  427. }
  428. } catch (SecurityException e) {
  429. e.printStackTrace();
  430. } catch (NoSuchFieldException e) {
  431. e.printStackTrace();
  432. }
  433. }
  434. // 针对以下划线开头的属性
  435. if (attribute.charAt(0) != '_' && m.find()) {
  436. sb.append(m.replaceFirst(m.group().toUpperCase()));
  437. } else {
  438. sb.append(attribute);
  439. }
  440. return sb.toString();
  441. }
  442. /**
  443. * 功能:输出提示信息(普通信息打印)
  444. */
  445. private static void out(String info, boolean showInfo, String sid) {
  446. if (showInfo) {
  447. // System.out.print(info + (showInfo ? "\n" : ""));
  448. }
  449. }
  450. /**
  451. * 功能:输出提示信息(同一行的不同单元格信息打印)
  452. */
  453. private static void out(String info, boolean showInfo, boolean nextLine, String sid) {
  454. if (showInfo) {
  455. if (nextLine) {
  456. // System.out.print(info + (showInfo ? "\n" : ""));
  457. WebSocketServer.sendInfo(info + (showInfo ? "\n" : ""), sid);
  458. } else {
  459. // System.out.print(info);
  460. }
  461. }
  462. }
  463. // 新方法
  464. /**
  465. * 功能:获取Excel数据行集合(可单独使用)
  466. *
  467. * @param originUrl Excel文件路径
  468. * @param startRow 起始读取行
  469. * @param endRow 结束读取行
  470. */
  471. public static List<Row> getRowList(String originUrl, int startRow, int endRow) throws IOException {
  472. // 判断文件是否存在
  473. File file = isExist(originUrl);
  474. // 开始读取Excel的内容
  475. Workbook wb = null;
  476. FileInputStream fis = null;
  477. List<Row> rowList = new ArrayList<Row>();
  478. try {
  479. fis = new FileInputStream(file);
  480. if (originUrl.substring(originUrl.lastIndexOf(".") + 1).equals(XLS)) {
  481. wb = new HSSFWorkbook(fis);
  482. } else {
  483. wb = new XSSFWorkbook(fis);
  484. }
  485. Sheet sheet = wb.getSheetAt(0);
  486. // int lastRowNum = sheet.getLastRowNum();
  487. int lastRowNum = sheet.getPhysicalNumberOfRows();
  488. Row row;
  489. for (int i = startRow; i <= lastRowNum + endRow; i++) {
  490. row = sheet.getRow(i);
  491. if (row != null) {
  492. rowList.add(row);
  493. }
  494. }
  495. } catch (IOException e) {
  496. e.printStackTrace();
  497. } finally {
  498. if (wb != null) {
  499. wb.close();
  500. }
  501. if (fis != null) {
  502. fis.close();
  503. }
  504. }
  505. return rowList;
  506. }
  507. /**
  508. * 功能:把List<Row>转为List<Map>并格式化字段(可单独使用)
  509. */
  510. public static List<LinkedHashMap<String, Object>> getDataList(List<Row> rowList, Class<?> clazz) {
  511. List<LinkedHashMap<String, Object>> objectList = null;
  512. List<String> nameKeys = new ArrayList<>();
  513. Row keyRow = rowList.get(0);
  514. for (int i = 0; i < keyRow.getPhysicalNumberOfCells(); i++) {
  515. nameKeys.add(keyRow.getCell(i).toString().trim());
  516. }
  517. try {
  518. objectList = new ArrayList<>();
  519. for (int i = 1; i < rowList.size(); i++) {
  520. Row row = rowList.get(i);
  521. LinkedHashMap<String, Object> map = new LinkedHashMap<>();
  522. int check = 0;
  523. for (int j = 0; j < nameKeys.size(); j++) {
  524. // 此单元格的值
  525. String cellValue = getCellValue(row.getCell(j));
  526. // 格式化后的值
  527. String name = nameKeys.get(j);
  528. map.put(name, formatValue(name, cellValue, clazz));
  529. }
  530. objectList.add(map);
  531. }
  532. } catch (Exception e) {
  533. e.printStackTrace();
  534. }
  535. return objectList;
  536. }
  537. /**
  538. * 功能:格式化字段(可单独使用,具体格式化方式由claszz决定,通常也检查字段是否合法,并注上错误标识)
  539. */
  540. public static Object formatValue(String name, Object value, Class<?> formatClazz) {
  541. Method[] methods = formatClazz.getMethods();
  542. for (Method method : methods) {
  543. if (("format" + name).toLowerCase().equals(method.getName().toLowerCase())) {
  544. try {
  545. Class<?>[] parameterC = method.getParameterTypes();
  546. if (parameterC[0] == Date.class) {
  547. if (value instanceof Date) {
  548. return method.invoke(formatClazz, (Date) value);
  549. } else {
  550. return value;
  551. }
  552. } else {
  553. // 找到对应的方法,并把原始值传进去,返回格式化后的值
  554. return method.invoke(formatClazz, value);
  555. }
  556. } catch (Exception e) {
  557. e.printStackTrace();
  558. }
  559. }
  560. }
  561. return value;
  562. }
  563. /**
  564. * 功能:直接调用此方法获取解析后的数据
  565. */
  566. public static List<LinkedHashMap<String, Object>> getParseData(String originUrl, int startRow, int endRow
  567. , Class<?> clazz) throws IOException {
  568. return getDataList(getRowList(originUrl, startRow, endRow), clazz);
  569. }
  570. /**
  571. * 功能:把解析数据转为展示数据,例如:字典项 1 转为 是
  572. */
  573. public static List<LinkedHashMap<String, Object>> getShowData(List<LinkedHashMap<String, Object>> parseData, Class<?> clazz) {
  574. List<LinkedHashMap<String, Object>> listShow = new ArrayList<>();
  575. for (LinkedHashMap lhm : parseData) {
  576. LinkedHashMap<String, Object> map = new LinkedHashMap<>();
  577. for (Object o : lhm.keySet()) {
  578. String key = o.toString();
  579. String value = lhm.get(key).toString();
  580. Object formatValue = ImpRsExcel.formatValue(key, value, clazz);
  581. map.put(key, formatValue);
  582. }
  583. listShow.add(map);
  584. }
  585. return listShow;
  586. }
  587. /**
  588. * 功能:把Map转成Bean (主要用于把从Excel解析出来的Map对象还原成实体类对象,方便入库)
  589. */
  590. public static Object convertMapToBean(Class<?> clazz, Map lhp) throws IllegalAccessException, InstantiationException {
  591. Field[] fields = clazz.getDeclaredFields();
  592. Object obj = clazz.newInstance();
  593. for (Field field : fields) {
  594. setAttrributeValue(obj, field.getName(), MapUtils.getString(lhp, field.getName()));
  595. }
  596. return obj;
  597. }
  598. public Map<String, String> getAdCds(String sheng, String shi, String xian){
  599. Map<String, String> map = new HashMap<>();
  600. AttAdXBaseParam attAdXBaseParam = new AttAdXBaseParam();
  601. attAdXBaseParam.setAdName(sheng);
  602. attAdXBaseParam.setAdGrad("2");
  603. AttAdXBase attAdXBase = attAdXBaseDao.getBy(attAdXBaseParam);
  604. if(attAdXBase!=null){
  605. String shengCode = attAdXBase.getAdCode();
  606. attAdXBaseParam.setAdFcode(shengCode);
  607. map.put("sheng",shengCode);
  608. }else {
  609. attAdXBaseParam.setAdName("");
  610. attAdXBaseParam.setAdFullName(sheng);
  611. attAdXBase = attAdXBaseDao.getBy(attAdXBaseParam);
  612. if(attAdXBase!=null){
  613. String shengCode = attAdXBase.getAdCode();
  614. attAdXBaseParam.setAdFcode(shengCode);
  615. map.put("sheng",shengCode);
  616. }
  617. }
  618. if(org.apache.commons.lang3.StringUtils.isNotBlank(shi)){
  619. attAdXBaseParam.setAdName(shi);
  620. attAdXBaseParam.setAdGrad("3");
  621. attAdXBase = attAdXBaseDao.getBy(attAdXBaseParam);
  622. if(attAdXBase!=null){
  623. String shiCode = attAdXBase.getAdCode();
  624. attAdXBaseParam.setAdFcode(shiCode);
  625. map.put("shi",shiCode);
  626. }else {
  627. shi = shi.replaceAll("州","");
  628. shi = shi.replaceAll("市","");
  629. attAdXBase = attAdXBaseDao.getBy(attAdXBaseParam);
  630. if(attAdXBase!=null){
  631. String shiCode = attAdXBase.getAdCode();
  632. attAdXBaseParam.setAdFcode(shiCode);
  633. map.put("shi",shiCode);
  634. }else {
  635. attAdXBaseParam.setAdName("");
  636. attAdXBaseParam.setAdFullName(shi);
  637. attAdXBase = attAdXBaseDao.getBy(attAdXBaseParam);
  638. if(attAdXBase!=null){
  639. String shiCode = attAdXBase.getAdCode();
  640. attAdXBaseParam.setAdFcode(shiCode);
  641. map.put("shi",shiCode);
  642. }else {
  643. attAdXBaseParam.setAdFcode("");
  644. attAdXBaseParam.setAdCode(map.get("sheng").substring(0,2));
  645. }
  646. }
  647. }
  648. }else{
  649. attAdXBaseParam.setAdFcode("");
  650. attAdXBaseParam.setAdCode(map.get("sheng").substring(0,2));
  651. }
  652. if(org.apache.commons.lang3.StringUtils.isNotBlank(xian)){
  653. attAdXBaseParam.setAdName(xian);
  654. attAdXBaseParam.setAdGrad("4");
  655. List<AttAdXBase> adXBases = attAdXBaseDao.findList(attAdXBaseParam);
  656. if(adXBases!=null&&adXBases.size()>0){
  657. if (adXBases.size()==1){
  658. attAdXBase = adXBases.get(0);
  659. }else {
  660. for (AttAdXBase adXBase:adXBases) {
  661. if(xian.equals(adXBase.getAdName())){
  662. attAdXBase = adXBase;
  663. break;
  664. }
  665. }
  666. }
  667. }else {
  668. xian = xian.replaceAll("风景名胜区","");
  669. xian = xian.replaceAll("管理区","");
  670. xian = xian.replaceAll("开发区、","");
  671. xian = xian.replaceAll("经济区","");
  672. xian = xian.replaceAll("新区","");
  673. xian = xian.replaceAll("区","");
  674. xian = xian.replaceAll("自治县","");
  675. xian = xian.replaceAll("县","");
  676. xian = xian.replaceAll("市","");
  677. xian = xian.replaceAll("管委会","");
  678. attAdXBaseParam.setAdName(xian);
  679. adXBases = attAdXBaseDao.findList(attAdXBaseParam);
  680. if(adXBases!=null&&adXBases.size()>0){
  681. if (adXBases.size()==1){
  682. attAdXBase = adXBases.get(0);
  683. }else {
  684. for (AttAdXBase adXBase:adXBases) {
  685. if(xian.equals(adXBase.getAdName())){
  686. attAdXBase = adXBase;
  687. break;
  688. }
  689. }
  690. }
  691. }else {
  692. attAdXBase = new AttAdXBase();
  693. }
  694. }
  695. //attAdXBase = attAdXBaseService.getBy(attAdXBaseParam);
  696. if(attAdXBase!=null){
  697. String xianCode = attAdXBase.getAdCode();
  698. map.put("xian",xianCode);
  699. if (org.apache.commons.lang3.StringUtils.isBlank(map.get("shi"))){
  700. map.put("shi",attAdXBase.getAdFcode());
  701. }
  702. }else{
  703. attAdXBaseParam.setAdName("");
  704. attAdXBaseParam.setAdFullName(xian);
  705. attAdXBase = attAdXBaseDao.getBy(attAdXBaseParam);
  706. if(attAdXBase!=null){
  707. String xianCode = attAdXBase.getAdCode();
  708. map.put("xian",xianCode);
  709. if (org.apache.commons.lang3.StringUtils.isBlank(map.get("shi"))){
  710. map.put("shi",attAdXBase.getAdFcode());
  711. }
  712. }else{
  713. if(xian.endsWith("县")||xian.endsWith("区")){
  714. xian = xian.substring(0,xian.length()-1);
  715. }
  716. attAdXBaseParam.setAdName(xian);
  717. attAdXBaseParam.setAdGrad("4");
  718. attAdXBase = attAdXBaseDao.getBy(attAdXBaseParam);
  719. if(attAdXBase!=null){
  720. String xianCode = attAdXBase.getAdCode();
  721. map.put("xian",xianCode);
  722. if (org.apache.commons.lang3.StringUtils.isBlank(map.get("shi"))){
  723. map.put("shi",attAdXBase.getAdFcode());
  724. }
  725. }
  726. }
  727. }
  728. }
  729. return map;
  730. }
  731. public Map<String, String> checkRsBase(String rsvrNm, String adCd){
  732. if(rsvrNm.contains("水库水库")){
  733. rsvrNm = rsvrNm.replaceAll("水库水库","水库");
  734. }else if(rsvrNm.contains("小二型")){
  735. rsvrNm = rsvrNm.replaceAll("小二型","");
  736. }
  737. Map<String, String> map = new HashMap<>();
  738. AttRsBaseParam rsBaseParam = new AttRsBaseParam();
  739. rsBaseParam.setAdmDiv(adCd);
  740. rsBaseParam.setRsName(rsvrNm);
  741. List<AttRsBase> rsBaseList = attRsBaseService.findRsList(rsBaseParam);
  742. if(rsBaseList!=null&&rsBaseList.size()>0){
  743. if(rsBaseList.size()>1){
  744. for (AttRsBase attRs:rsBaseList) {
  745. String name = attRs.getRsName();
  746. if(rsvrNm.equals(name)){
  747. map.put("rsCode",attRs.getRsCode());
  748. }
  749. }
  750. }else{
  751. AttRsBase attRs = rsBaseList.get(0);
  752. map.put("rsCode",attRs.getRsCode());
  753. }
  754. }else{
  755. if(rsvrNm.contains("电站")&&!"汶洋水电站水库".equals(rsvrNm)){
  756. if (rsvrNm.contains("水电站")){
  757. rsvrNm = rsvrNm.replaceAll("水电站","");
  758. }else if(rsvrNm.contains("电站")){
  759. rsvrNm = rsvrNm.replaceAll("电站","");
  760. }
  761. rsBaseParam.setRsName(rsvrNm);
  762. rsBaseList = attRsBaseService.findRsList(rsBaseParam);
  763. if(rsBaseList!=null&&rsBaseList.size()>0){
  764. if(rsBaseList.size()>1){
  765. for (AttRsBase attRs:rsBaseList) {
  766. String name = attRs.getRsName();
  767. if(rsvrNm.equals(name)){
  768. map.put("rsCode",attRs.getRsCode());
  769. }
  770. }
  771. }else{
  772. AttRsBase attRs = rsBaseList.get(0);
  773. map.put("rsCode",attRs.getRsCode());
  774. }
  775. }
  776. }
  777. }
  778. return map;
  779. }
  780. private static String encagl(String desc) {
  781. if ("小(2)型".equals(desc)) {
  782. return "5";
  783. }else if ("小(1)型".equals(desc)) {
  784. return "4";
  785. }else if ("中型".equals(desc)) {
  786. return "3";
  787. }else if ("大(2)型".equals(desc)) {
  788. return "2";
  789. }else if ("大(1)型".equals(desc)) {
  790. return "1";
  791. }
  792. return "";
  793. }
  794. private String typeMat(String desc){
  795. //1:混凝土坝;2:碾压混凝土坝;3:浆砌石坝;4:土坝;5:堆石坝;6:挡水坝;7:其他)
  796. if (desc.contains("碾压混凝土")) {
  797. return "2";
  798. }else if (desc.contains("混凝土")) {
  799. return "1";
  800. }else if (desc.contains("浆砌石坝")||desc.contains("土石混合")) {
  801. return "3";
  802. }else if ("土坝".equals(desc)||"粘土".equals(desc)) {
  803. return "4";
  804. }else if (desc.contains("堆石坝")||desc.contains("砌石")) {
  805. return "5";
  806. }else if ("挡水坝".equals(desc)) {
  807. return "6";
  808. }else{
  809. return "7";
  810. }
  811. }
  812. private String typeStr(String desc){
  813. //常态混凝土变曲拱坝;常态混凝土单曲拱坝;常态混凝土空腹重力坝;常态混凝土宽缝重力坝;常态混凝土实体重力坝;常态混凝土双曲拱坝;大头坝;
  814. // 混凝土心墙坝;均质土坝;连拱坝;面板堆石坝;碾压混凝土单曲拱坝;碾压混凝土双曲拱坝;碾压混凝土重力坝;碾压式土石坝;平板坝;其他;
  815. // 砌石拱坝;砌石重力坝;土石混合坝;粘土斜墙坝;粘土心墙坝
  816. if (desc.contains("重力坝")) {
  817. return "1";
  818. }else if (desc.contains("拱坝")) {
  819. return "2";
  820. }else if (desc.contains("支墩坝")) {
  821. return "3";
  822. }else if (desc.contains("均质")) {
  823. return "4";
  824. }else if (desc.contains("心墙坝")) {
  825. return "5";
  826. }else if (desc.contains("斜墙坝")) {
  827. return "6";
  828. }else if (desc.contains("面板")) {
  829. return "7";
  830. }else if (desc.contains("平板坝")) {
  831. return "8";
  832. }else if (desc.contains("大头坝")) {
  833. return "10";
  834. }else{
  835. return "9";
  836. }
  837. }
  838. }