KprDangyangWaterBizFun.java 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510
  1. package io.github.pnoker.gateway.bizmgr;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONArray;
  4. import com.alibaba.fastjson.JSONObject;
  5. import com.alibaba.fastjson.TypeReference;
  6. import io.github.pnoker.gateway.comtool.*;
  7. import io.github.pnoker.gateway.comtool.dangyangThread.ThreadDinzhiHistoryTask;
  8. import io.github.pnoker.gateway.comtool.dangyangThread.ThreadHistoryTask;
  9. import io.github.pnoker.gateway.comtool.dangyangThread.ThreadPoolTaskTool;
  10. import io.github.pnoker.gateway.comtool.dangyangThread.ThreadTask;
  11. import io.github.pnoker.gateway.dbdao.DBMgrProxy;
  12. import io.github.pnoker.gateway.dbdao.services.intef.DeviceKindService;
  13. import io.github.pnoker.gateway.dbdao.services.intef.TypeDefineService;
  14. import io.github.pnoker.gateway.utils.HttpUtil;
  15. import io.github.pnoker.gateway.utils.InfulxDbUtil;
  16. import org.apache.poi.ss.usermodel.Cell;
  17. import org.apache.poi.ss.usermodel.Row;
  18. import org.apache.poi.ss.usermodel.Sheet;
  19. import org.apache.poi.ss.usermodel.Workbook;
  20. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  21. import org.slf4j.Logger;
  22. import org.slf4j.LoggerFactory;
  23. import org.springframework.util.StringUtils;
  24. import java.io.FileOutputStream;
  25. import java.io.IOException;
  26. import java.util.*;
  27. import java.util.concurrent.ScheduledExecutorService;
  28. import java.util.stream.Collectors;
  29. /**
  30. * @ClassName KprDangyangWaterBizFun
  31. * @Description: TODO 当阳数据采集
  32. * @Author LX
  33. * @Date 2024/9/3
  34. * @Version V1.0
  35. **/
  36. public class KprDangyangWaterBizFun {
  37. private static final Logger log = LoggerFactory.getLogger(KprDangyangWaterBizFun.class);
  38. private final static String mStrClassName = "KprDangyangWaterBizFun";
  39. private final static String EMPTY_NULL = "NULL";
  40. //TODO 每隔一段时间刷新集合值
  41. public static List<Map<String,Object>> deviceKindList = new ArrayList<>();//设备类型字典
  42. public static List<Map<String,Object>> typeDefineList = new ArrayList<>();//设备类型详细字典
  43. public static DeviceKindService deviceKindService(){
  44. return DBMgrProxy.getInstance().applyDeviceKineApi();
  45. }
  46. public static TypeDefineService typeDefineService(){
  47. return DBMgrProxy.getInstance().applyTypeDefineApi();
  48. }
  49. public static String dangyangToken = null;//调用数据接口token
  50. public static InfulxDbUtil infulxDbUtil = null;//infulx工具类对象
  51. public static JSONArray deviceType = null;//设备类型集合
  52. public static String username = null;//token调用账号
  53. public static String password = null;//token调用密码
  54. public static String tokenUrl = null;//token接口地址
  55. public static String realtimeDataListUrl = null;//实时数据接口地址
  56. public static String hisDataListUrl = null;//历史数据接口地址
  57. public static String listUrl = null;//设备列表接口地址
  58. private static boolean checkApplicationParam(){
  59. if(deviceType==null||infulxDbUtil==null|| StringUtils.isEmpty(dangyangToken)
  60. || StringUtils.isEmpty(realtimeDataListUrl)
  61. || StringUtils.isEmpty(hisDataListUrl)
  62. || StringUtils.isEmpty(listUrl)
  63. || StringUtils.isEmpty(tokenUrl)
  64. || StringUtils.isEmpty(username)
  65. || StringUtils.isEmpty(password)){
  66. return false;
  67. }else{
  68. return true;
  69. }
  70. }
  71. //TODO 刷新获取字典信息
  72. public static void flushDefine(){
  73. deviceKindList = deviceKindService().batchQueryWithsEx("","",new HashMap<>(),new HashMap<>(),
  74. "","");
  75. Map<String,Object> andWhere = new HashMap<>();
  76. andWhere.put("kind",0);
  77. typeDefineList = typeDefineService().batchQueryWithsEx("","",andWhere,new HashMap<>()
  78. ,"","");
  79. }
  80. //TODO 获取token
  81. public static JSONObject getDangyangToken(){
  82. try {
  83. Map<String, String> headers = new HashMap<>();
  84. headers.put("Content-type", "application/json");
  85. headers.put("Tenant-Id", "1");
  86. JSONObject paramObj = new JSONObject();
  87. paramObj.put("username",username);
  88. paramObj.put("password",password);
  89. String tokenStr = HttpUtil.sendPost(tokenUrl,paramObj.toJSONString(), headers);
  90. JSONObject resObj = JSONObject.parseObject(tokenStr);
  91. if(resObj!=null&&(resObj.getInteger("code")==0)){
  92. return resObj.getJSONObject("data");
  93. }else{
  94. log.error("调用设备列表失败:"+tokenStr);
  95. return null;
  96. }
  97. }catch(Exception ex){
  98. log.error("获取token数据异常:"+ex.getLocalizedMessage());
  99. return null;
  100. }
  101. }
  102. //TODO 同步历史数据
  103. public static void checkOneMonth(){
  104. try{
  105. if(!checkApplicationParam()){
  106. log.error("获取配置参数错误");
  107. return;
  108. }
  109. Map<String, String> headers = new HashMap<>();
  110. headers.put("Authorization", "Bearer "+dangyangToken);
  111. for (int i = 0; i <deviceType.size(); i++) {
  112. List<Map<String,Object>> totalList = new ArrayList<>();//当前类型设备列表总集
  113. //TODO 外层循环是要查一个类型的所有设备列表
  114. JSONObject itemType = deviceType.getJSONObject(i);
  115. Map<String,String> paramsTotal = new HashMap<>();
  116. paramsTotal.put("pageNo","1");
  117. paramsTotal.put("pageSize","1");
  118. paramsTotal.put("deviceType",itemType.getString("key"));
  119. JSONObject totalRes = JSONObject.parseObject(HttpUtil.sendGet(
  120. listUrl,paramsTotal,headers));
  121. if(totalRes!=null&&totalRes.getInteger("code")==0
  122. &&totalRes.getJSONObject("data")!=null
  123. &&!totalRes.getJSONObject("data")
  124. .getJSONArray("list").isEmpty()) {
  125. //TODO 优化 以分页方式查询所有,初始分页行数定为200查询速率较好
  126. int nTotals = totalRes.getJSONObject("data").getInteger("total");
  127. int pageNum = nTotals % 200 == 0 ? nTotals / 200 : (nTotals / 200) + 1;//总页数
  128. Integer limit = 200;
  129. if (pageNum <= 1) {
  130. limit = nTotals;//说明总数比第一页小
  131. }
  132. for (int k = 1; k <= pageNum; k++) {
  133. Map<String, String> paramsPage = new HashMap<>();
  134. paramsPage.put("pageNo", String.valueOf(k));
  135. paramsPage.put("pageSize", String.valueOf(limit));
  136. paramsPage.put("deviceType", itemType.getString("key"));
  137. JSONObject pageRes = JSONObject.parseObject(HttpUtil.sendGet(
  138. listUrl, paramsPage, headers));
  139. if (pageRes != null && pageRes.getInteger("code") == 0 &&pageRes.getJSONObject("data")!=null &&!pageRes.getJSONObject("data").getJSONArray("list").isEmpty()) {
  140. //TODO 将分页获取的列表数据添加至总集中
  141. totalList.addAll(JSON.parseObject(pageRes.getJSONObject("data").getJSONArray("list").toJSONString()
  142. , new TypeReference<List<Map<String, Object>>>() {
  143. }));
  144. } else {
  145. log.error(TimeTool.convertUTC2DateStr(TimeTool.getCurMsUTC(), TimeTool.TIMESTAMP_FORMAT)
  146. + "获取设备列表失败:" + itemType.getString("key") + ";" + (pageRes == null ? null : pageRes.toJSONString())
  147. + ";param:" + JSON.toJSONString(paramsPage));
  148. }
  149. }
  150. List<Map<String, Object>> nullFrequencyList = totalList.stream()
  151. .filter(map -> !map.containsKey("collectionFrequency") || map.get("collectionFrequency") == null)
  152. .collect(Collectors.toList());
  153. // 输出结果
  154. nullFrequencyList.forEach(System.out::println);
  155. //TODO 获取到当前类型的设备列表总集后,查询总集的历史数据,并添加到infulxdb
  156. // 根据 采集频率 collectionFrequency (秒)字段进行分组
  157. // 要根据采集频率取建立定时任务
  158. Map<Integer, List<Map<String, Object>>> groupedByFrequency = totalList.stream()
  159. .collect(Collectors.groupingBy(map -> {
  160. Object frequency = map.get("collectionFrequency");
  161. return (frequency == null) ? 0 : (Integer) frequency;
  162. }));
  163. //TODO 创建任务池
  164. ScheduledExecutorService scheduler = ThreadPoolTaskTool.createTaskScheduler(groupedByFrequency.keySet().size());
  165. for (Integer groupKey:groupedByFrequency.keySet()){
  166. String taskId = itemType.getString("key")+"_history"+"_"+groupKey;
  167. //TODO 任务时间间隔
  168. if (groupKey==0||groupKey<0){
  169. continue;
  170. }
  171. // if(itemType.getString("key").equals("FLOW_METER")) {//测试用
  172. ThreadHistoryTask threadHistoryTask = new ThreadHistoryTask(taskId, groupKey
  173. , itemType.getString("key"), groupedByFrequency.get(groupKey));
  174. ThreadPoolTaskTool.scheduleHistroyTask(scheduler, taskId, threadHistoryTask, getInitialDelay()
  175. , 24 * 60 * 60);
  176. // }
  177. }
  178. }
  179. }
  180. }catch(Exception ex){
  181. ex.printStackTrace();
  182. log.error(TimeTool.convertUTC2DateStr(TimeTool.getCurMsUTC(),TimeTool.TIMESTAMP_FORMAT)
  183. +"获取历史数据异常:"+ex.getLocalizedMessage());
  184. }
  185. }
  186. //TODO 同步定制历史数据 暂定每小时去取一天的数据
  187. public static void checkDingzhiHistory(){
  188. try{
  189. if(!checkApplicationParam()){
  190. log.error("获取配置参数错误");
  191. return;
  192. }
  193. Map<String, String> headers = new HashMap<>();
  194. headers.put("Authorization", "Bearer "+dangyangToken);
  195. for (int i = 0; i <deviceType.size(); i++) {
  196. List<Map<String,Object>> totalList = new ArrayList<>();//当前类型设备列表总集
  197. //TODO 外层循环是要查一个类型的所有设备列表
  198. JSONObject itemType = deviceType.getJSONObject(i);
  199. Map<String,String> paramsTotal = new HashMap<>();
  200. paramsTotal.put("pageNo","1");
  201. paramsTotal.put("pageSize","1");
  202. paramsTotal.put("deviceType",itemType.getString("key"));
  203. JSONObject totalRes = JSONObject.parseObject(HttpUtil.sendGet(
  204. listUrl,paramsTotal,headers));
  205. if(totalRes!=null&&totalRes.getInteger("code")==0
  206. &&totalRes.getJSONObject("data")!=null
  207. &&!totalRes.getJSONObject("data")
  208. .getJSONArray("list").isEmpty()) {
  209. //TODO 优化 以分页方式查询所有,初始分页行数定为200查询速率较好
  210. int nTotals = totalRes.getJSONObject("data").getInteger("total");
  211. int pageNum = nTotals % 200 == 0 ? nTotals / 200 : (nTotals / 200) + 1;//总页数
  212. Integer limit = 200;
  213. if (pageNum <= 1) {
  214. limit = nTotals;//说明总数比第一页小
  215. }
  216. for (int k = 1; k <= pageNum; k++) {
  217. Map<String, String> paramsPage = new HashMap<>();
  218. paramsPage.put("pageNo", String.valueOf(k));
  219. paramsPage.put("pageSize", String.valueOf(limit));
  220. paramsPage.put("deviceType", itemType.getString("key"));
  221. JSONObject pageRes = JSONObject.parseObject(HttpUtil.sendGet(
  222. listUrl, paramsPage, headers));
  223. if (pageRes != null && pageRes.getInteger("code") == 0 &&pageRes.getJSONObject("data")!=null&& !pageRes.getJSONObject("data").getJSONArray("list").isEmpty()) {
  224. //TODO 将分页获取的列表数据添加至总集中
  225. totalList.addAll(JSON.parseObject(pageRes.getJSONObject("data").getJSONArray("list").toJSONString()
  226. , new TypeReference<List<Map<String, Object>>>() {
  227. }));
  228. } else {
  229. log.error(TimeTool.convertUTC2DateStr(TimeTool.getCurMsUTC(), TimeTool.TIMESTAMP_FORMAT)
  230. + "获取设备列表失败:" + itemType.getString("key") + ";" + (pageRes == null ? null : pageRes.toJSONString())
  231. + ";param:" + JSON.toJSONString(paramsPage));
  232. }
  233. }
  234. List<Map<String, Object>> nullFrequencyList = totalList.stream()
  235. .filter(map -> !map.containsKey("collectionFrequency") || map.get("collectionFrequency") == null)
  236. .collect(Collectors.toList());
  237. // 输出结果
  238. nullFrequencyList.forEach(System.out::println);
  239. //TODO 获取到当前类型的设备列表总集后,查询总集的历史数据,并添加到infulxdb
  240. // 根据 采集频率 collectionFrequency (秒)字段进行分组
  241. // 要根据采集频率取建立定时任务
  242. Map<Integer, List<Map<String, Object>>> groupedByFrequency = totalList.stream()
  243. .collect(Collectors.groupingBy(map -> {
  244. Object frequency = map.get("collectionFrequency");
  245. return (frequency == null) ? 0 : (Integer) frequency;
  246. }));
  247. //TODO 创建任务池
  248. ScheduledExecutorService scheduler = ThreadPoolTaskTool.createTaskScheduler(groupedByFrequency.keySet().size());
  249. for (Integer groupKey:groupedByFrequency.keySet()){
  250. String taskId = itemType.getString("key")+"_history_dingzhi"+"_"+groupKey;
  251. //TODO 任务时间间隔
  252. if (groupKey==0||groupKey<0){
  253. continue;
  254. }
  255. // if(itemType.getString("key").equals("FLOW_METER")) {//测试用
  256. ThreadDinzhiHistoryTask dinzhiHistoryTask= new ThreadDinzhiHistoryTask(taskId, groupKey
  257. , itemType.getString("key"), groupedByFrequency.get(groupKey));
  258. ThreadPoolTaskTool.scheduleDingzhiHistroyTask(scheduler, taskId, dinzhiHistoryTask, 0L
  259. , 30 * 60);//每半小时执行
  260. // }
  261. }
  262. }
  263. }
  264. }catch(Exception ex){
  265. ex.printStackTrace();
  266. log.error(TimeTool.convertUTC2DateStr(TimeTool.getCurMsUTC(),TimeTool.TIMESTAMP_FORMAT)
  267. +"获取定制历史数据异常:"+ex.getLocalizedMessage());
  268. }
  269. }
  270. private static long getInitialDelay() {
  271. Calendar now = Calendar.getInstance();
  272. Calendar nextRun = (Calendar) now.clone();
  273. // 设置为明天的0点
  274. nextRun.set(Calendar.HOUR_OF_DAY, 0);
  275. nextRun.set(Calendar.MINUTE, 0);
  276. nextRun.set(Calendar.SECOND, 0);
  277. nextRun.set(Calendar.MILLISECOND, 0);
  278. // 如果现在已经过了0点,设置为明天的0点
  279. if (now.after(nextRun)) {
  280. nextRun.add(Calendar.DAY_OF_MONTH, 1);
  281. }
  282. // 计算从现在到下一个0点的延迟时间(以秒为单位)
  283. return (nextRun.getTimeInMillis() - now.getTimeInMillis()) / 1000;
  284. }
  285. //TODO 获取实时数据
  286. /**
  287. * ①首先查询所有的设备列表
  288. * ②以列表数据为基准查询实时数据和历史数据
  289. * @param
  290. */
  291. public static void checkRealtimeData(){
  292. try{
  293. if(!checkApplicationParam()){
  294. log.error("获取配置参数错误");
  295. return;
  296. }
  297. Map<String, String> headers = new HashMap<>();
  298. headers.put("Authorization", "Bearer "+dangyangToken);
  299. for (int i = 0; i <deviceType.size(); i++) {
  300. List<Map<String,Object>> totalList = new ArrayList<>();//当前类型设备列表总集
  301. //TODO 外层循环是要查一个类型的所有设备列表
  302. JSONObject itemType = deviceType.getJSONObject(i);
  303. Map<String,String> paramsTotal = new HashMap<>();
  304. paramsTotal.put("pageNo","1");
  305. paramsTotal.put("pageSize","1");
  306. paramsTotal.put("deviceType",itemType.getString("key"));
  307. JSONObject totalRes = JSONObject.parseObject(HttpUtil.sendGet(
  308. listUrl,paramsTotal,headers));
  309. if(totalRes!=null&&totalRes.getInteger("code")==0&&totalRes.getJSONObject("data")!=null&&!totalRes.getJSONObject("data").getJSONArray("list").isEmpty()) {
  310. //TODO 优化 以分页方式查询所有,初始分页行数定为200查询速率较好
  311. int nTotals = totalRes.getJSONObject("data").getInteger("total");
  312. int pageNum = nTotals % 200 == 0 ? nTotals / 200 : (nTotals / 200) + 1;//总页数
  313. Integer limit = 200;
  314. if (pageNum <= 1) {
  315. limit = nTotals;//说明总数比第一页小
  316. }
  317. for (int k = 1; k <= pageNum; k++) {
  318. Map<String,String> paramsPage = new HashMap<>();
  319. paramsPage.put("pageNo",String.valueOf(k));
  320. paramsPage.put("pageSize",String.valueOf(limit));
  321. paramsPage.put("deviceType",itemType.getString("key"));
  322. JSONObject pageRes = JSONObject.parseObject(HttpUtil.sendGet(
  323. listUrl,paramsPage,headers));
  324. if(pageRes!=null&&pageRes.getInteger("code")==0&&!pageRes.getJSONObject("data").getJSONArray("list").isEmpty()){
  325. //TODO 将分页获取的列表数据添加至总集中
  326. totalList.addAll(JSON.parseObject(pageRes.getJSONObject("data").getJSONArray("list").toJSONString()
  327. , new TypeReference<List<Map<String, Object>>>(){}));
  328. }else{
  329. log.error(TimeTool.convertUTC2DateStr(TimeTool.getCurMsUTC(),TimeTool.TIMESTAMP_FORMAT)
  330. +"获取设备列表失败:"+itemType.getString("key")+";"+(pageRes==null?null:pageRes.toJSONString())
  331. +";param:"+ JSON.toJSONString(paramsPage));
  332. }
  333. }
  334. //TODO 放入定时线程执行设备数据备份
  335. Timer timer = new Timer();
  336. timer.schedule(new TimerTask() {
  337. @Override
  338. public void run() {
  339. createExcel(itemType.getString("key"), totalList);
  340. scheduleHourlyTask(timer,itemType.getString("key"), totalList);
  341. }
  342. }, 5000);
  343. //TODO 获取到当前类型的设备列表总集后,查询总集的实时数据,并添加到infulxdb
  344. // 根据 采集频率 collectionFrequency (秒)字段进行分组
  345. // 要根据采集频率取建立定时任务
  346. Map<Integer, List<Map<String, Object>>> groupedByFrequency = totalList.stream()
  347. .collect(Collectors.groupingBy(map -> {
  348. Object frequency = map.get("collectionFrequency");
  349. return (frequency == null) ? 0 : (Integer) frequency;
  350. }));
  351. //TODO 创建任务池
  352. ScheduledExecutorService scheduler = ThreadPoolTaskTool.createTaskScheduler(groupedByFrequency.keySet().size());
  353. for (Integer groupKey:groupedByFrequency.keySet()){
  354. String taskId = itemType.getString("key")+"_"+groupKey;
  355. //TODO 任务时间间隔
  356. if (groupKey==0||groupKey<0){
  357. continue;
  358. }
  359. ThreadTask threadTask = new ThreadTask(taskId,groupKey
  360. ,itemType.getString("key"),groupedByFrequency.get(groupKey));
  361. // if(itemType.getString("key").equals("ELEC_CTRL_VALVE")) {
  362. ThreadPoolTaskTool.scheduleSecTask(scheduler, taskId, threadTask, groupKey);
  363. // }
  364. }
  365. }else{
  366. log.error(TimeTool.convertUTC2DateStr(TimeTool.getCurMsUTC(),TimeTool.TIMESTAMP_FORMAT)
  367. +"获取设备列表总数失败:"+itemType.getString("key")+";"+(totalRes==null?null:totalRes.toJSONString())
  368. +";param:"+ JSON.toJSONString(paramsTotal));
  369. }
  370. }
  371. }catch(Exception ex){
  372. log.error(TimeTool.convertUTC2DateStr(TimeTool.getCurMsUTC(),TimeTool.TIMESTAMP_FORMAT)
  373. +"获取实时数据异常:"+ex.getLocalizedMessage());
  374. }
  375. }
  376. //TODO 每小时更新设备列表信息excel
  377. private static void scheduleHourlyTask(Timer timer,String key,List<Map<String,Object>> totalList) {
  378. // 创建一个每小时执行的任务
  379. TimerTask hourlyTask = new TimerTask() {
  380. @Override
  381. public void run() {
  382. createExcel(key, totalList);
  383. }
  384. };
  385. // 设置任务每小时执行一次
  386. long delay = 0; // 不延迟,立即开始
  387. long period = 3600000; // 每小时执行一次(3600000毫秒 = 1小时)
  388. timer.scheduleAtFixedRate(hourlyTask, delay, period);
  389. }
  390. public static void createExcel(String deviceType,List<Map<String,Object>> totalList){
  391. // 创建一个新的工作簿
  392. Workbook workbook = new XSSFWorkbook();
  393. // 创建一个新的工作表
  394. Sheet sheet = workbook.createSheet(deviceType);
  395. //创建行头
  396. Row headerRow = sheet.createRow(0);
  397. Cell cell = headerRow.createCell(0);
  398. cell.setCellValue("设备类型");
  399. Cell cell1 = headerRow.createCell(1);
  400. cell1.setCellValue("设备编号");
  401. Cell cell2 = headerRow.createCell(2);
  402. cell2.setCellValue("设备名称");
  403. Cell cell3 = headerRow.createCell(3);
  404. cell3.setCellValue("水厂名称");
  405. Cell cell4 = headerRow.createCell(4);
  406. cell4.setCellValue("是否启动");
  407. Cell cell5 = headerRow.createCell(5);
  408. cell5.setCellValue("经度");
  409. Cell cell6 = headerRow.createCell(6);
  410. cell6.setCellValue("纬度");
  411. Cell cell7 = headerRow.createCell(7);
  412. cell7.setCellValue("采集频率/秒");
  413. int k = 1;
  414. for (Map<String,Object> map:totalList) {
  415. Row row = sheet.createRow((k));
  416. //创建行内容
  417. Cell cellData = row.createCell(0);
  418. cellData.setCellValue(String.valueOf(map.get("deviceType")));
  419. Cell cellData1 = row.createCell(1);
  420. cellData1.setCellValue(String.valueOf(map.get("deviceCode")));
  421. Cell cellData2 = row.createCell(2);
  422. cellData2.setCellValue(String.valueOf(map.get("deviceName")));
  423. Cell cellData3 = row.createCell(3);
  424. cellData3.setCellValue(String.valueOf(map.get("waterworks")));
  425. Cell cellData4 = row.createCell(4);
  426. cellData4.setCellValue(String.valueOf(map.get("enableFlag")));
  427. Cell cellData5 = row.createCell(5);
  428. cellData5.setCellValue(String.valueOf(map.get("longitude")));
  429. Cell cellData6 = row.createCell(6);
  430. cellData6.setCellValue(String.valueOf(map.get("latitude")));
  431. Cell cellData7 = row.createCell(7);
  432. cellData7.setCellValue(String.valueOf(map.get("collectionFrequency")));
  433. //// 填充数据
  434. // Object[][] data = {
  435. // {1, "John Doe", 30},
  436. // {2, "Jane Smith", 25},
  437. // {3, "Mike Brown", 35}
  438. // };
  439. // 自动调整列宽
  440. for (int h = 0; h < map.keySet().size(); h++) {
  441. sheet.autoSizeColumn(h);
  442. }
  443. k++;
  444. }
  445. // 将工作簿写入文件
  446. try (FileOutputStream fileOut = new FileOutputStream("./"+deviceType+".xlsx")) {
  447. workbook.write(fileOut);
  448. } catch (IOException e) {
  449. e.printStackTrace();
  450. }
  451. // 关闭工作簿
  452. try {
  453. workbook.close();
  454. } catch (IOException e) {
  455. e.printStackTrace();
  456. }
  457. System.out.println("Excel file generated successfully!");
  458. }
  459. }