最新要闻
- 天天即时看!微软签署第四份《使命召唤》十年协议:索尼仍不愿妥协
- 【天天聚看点】男孩长蛀牙爸爸用电钻钻牙止痛 被网友疯狂指责:太危险了
- 全球讯息:20.98万元起 2023款比亚迪唐DM-i上市:全系升级铝合金悬架
- 热点聚焦:冲击百万销量!比亚迪汉DM-i、DM-p补贴10000元现金
- 当前关注:双拖布+超大吸力!小米米家扫拖机器人3S发售:千元旗舰
- 世界视点!特斯拉一体化压铸工艺被质疑增加修车成本 一个小碰撞可能要修11万
- 精彩看点:追上Intel AMD锐龙7000处理器终于用上192GB内存:频率满血
- 环球看热讯:315全景观察:深情主播“连哄带骗” 爸妈的钱就没了
- 最新:无解了!微软将推出基于GPT-4的Office 365服务 实用性拉满
- 【焦点热闻】北京通州区汽车消费券活动时间是什么时候?
- 【世界播资讯】重庆龙凤胎熊猫宝宝取名“渝可”“渝爱”
- 速看:《小美人鱼》剧照还原动画经典场景:就是肤色不太对
- 头条焦点:中国制造!索尼第四代降噪豆XM5佩戴/音质/快充全面升级:AirPods Pro2劲敌
- 老人墓中藏13万现金全部霉变 专业能手全力抢救:官方科普纸钞如何保管
- 海底捞部分门店取消免费美甲:只能付费购买穿戴甲
- 今热点:五菱电动“吉姆尼” 宝骏悦也续航里程公布:能跑303公里
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
新动态:设计一款可扩展和基于windows系统的一键处理表格小工具思路
原创总结/朱季谦
(资料图片)
设计一款可扩展和基于windows系统的一键处理表格小工具思路
日常开发当中,业务人员经常会遇到一些重复性整理表格的事情,这时候,就可以通过一些方式进行自动化程序处理,提高工作(摸鱼)效率。
例如,业务人员有这样需要,日常需要手工整理以下原始xlsx表格数据,这些数据格式都是固定死,他们需要去除【手机号】这一列,然后在第一行增加一个表头标题【审计结果表】,同时需要将【日期】格式统一整理成yyyy-mm-dd格式的,最后需要在日期列前面增加一列【是否合格】,统一设置值为1。
整理后的表格如下:
注意,真实需求会比以上需求更加复杂,这里只是以一个比较简单的需求展开演示,来设计一个可一键傻瓜式自动化整理日常表格的工具。
工具的开发环境如下:
Java,Bat,需要依赖处理表格的poi的maven依赖。
一、创建一个maven工程,pom.xml依赖如下
4.0.0 org.example auto-put-file 1.0-SNAPSHOT 3.1.0 3.8.1 3.1.2 2.8.2 2.5.2 3.1.2 org.projectlombok lombok 1.18.2 org.apache.commons commons-lang3 3.2.1 org.apache.poi poi 4.1.2 org.apache.poi poi-ooxml-schemas 4.1.2 org.apache.poi poi-scratchpad 4.1.2 org.apache.poi poi-ooxml 4.1.2 fr.opensagres.xdocreport xdocreport 2.0.2 org.apache.poi ooxml-schemas 1.4 maven-clean-plugin ${maven-clean-plugin.version} maven-deploy-plugin ${maven-deploy-plugin.version} maven-install-plugin ${maven-install-plugin.version} maven-jar-plugin ${maven-jar-plugin.version} org.apache.maven.plugins maven-compiler-plugin ${maven-compiler-plugin.version} UTF-8 1.8 org.apache.maven.plugins maven-assembly-plugin 3.1.1 com.put.AutoExcel jar-with-dependencies make-assembly package single
注意下,
我在项目里依赖的4.1.2版本的org.apache.poi依赖包,最开始使用的是4.1.0版本的,但发现里面有一个很大的bug,就是使用XSSFSheet中处理指定行数据下移的方法sheet.shiftRows(0,sheet.getLastRowNum(),1,true,false)时,会发现指定下移位置之后的数据,都被删除完了,导致下移后的表格都成了一片空白。后来,我改成了4.1.2版本,才没有这个问题,但是,注意了,4.1.2版本依旧存在一个bug,那便是将第二列数据通过sheet.shiftColumns(1,sheet.getRow(0).getLastCellNum(),-1)左移覆盖掉第一列时,会出现以下异常:
Exception in thread "Thread-0" java.lang.IndexOutOfBoundsExceptionat org.apache.xmlbeans.impl.store.Xobj.removeElement(Xobj.java:2206)at org.apache.xmlbeans.impl.store.Xobj.remove_element(Xobj.java:2236)at org.openxmlformats.schemas.spreadsheetml.x2006.main.impl.CTRowImpl.removeC(Unknown Source)at org.apache.poi.xssf.usermodel.XSSFRow.fixupCTCells(XSSFRow.java:612)at org.apache.poi.xssf.usermodel.XSSFRow.onDocumentWrite(XSSFRow.java:582)at org.apache.poi.xssf.usermodel.XSSFSheet.write(XSSFSheet.java:3640)at org.apache.poi.xssf.usermodel.XSSFSheet.commit(XSSFSheet.java:3585)at org.apache.poi.ooxml.POIXMLDocumentPart.onSave(POIXMLDocumentPart.java:490)at org.apache.poi.ooxml.POIXMLDocumentPart.onSave(POIXMLDocumentPart.java:495)at org.apache.poi.ooxml.POIXMLDocument.write(POIXMLDocument.java:236)at com.put.service.impl.ConToImageServiceImpl.export(ConToImageServiceImpl.java:64)at com.put.AutoExcel.lambda$main$0(AutoExcel.java:26)at java.lang.Thread.run(Thread.java:745)
查看一些资料得知,即使到了5.x版本,该bug一直没有完全修复,只能通过先删除第一列后,再将第二列之后的数据往左移一列的方式,曲线解决这个反向移动问题。
二、基于Java SPI设计一套可便于后期扩展的接口实现
我在工程里使用到了Java SPI的服务发现机制,便于后期如果有需要进行工具处理新功能扩展,只需要增加一个实现类,放到com.put.service.DisposeService文件目录里,这样,后期就不需要改动原有工具的代码了。
1、先创建一个接口DisposeService:
package com.put.service;/** * TODO * * @author zhujiqian * @date 2023/3/16 09:38 **/public interface DisposeService { public void export(String sourceFile, String sourceFileName);}
这里的sourceFile是包括文件后缀的字符串名,例如:“测试表格文件.xlsx”,用来读取文件内容。
sourceFileName是没有的文件后缀的字符串名,例如:“测试表格文件”,用来创建用于存放已经整理的文件的目录。
2、创建一个实现类DisposeServiceImpl:
package com.put.service.impl;import com.put.service.DisposeService;import org.apache.poi.ss.usermodel.Cell;import org.apache.poi.ss.usermodel.CellType;import org.apache.poi.ss.usermodel.Row;import org.apache.poi.xssf.usermodel.XSSFCell;import org.apache.poi.xssf.usermodel.XSSFRow;import org.apache.poi.xssf.usermodel.XSSFSheet;import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import static com.put.utils.DateUtil.timeFormat;/** * TODO * * @author zhujiqian * @date 2023/3/16 16:40 **/public class DisposeServiceImpl implements DisposeService { @Override public void export(String sourceFile,String sourceFileName) { System.out.println("开始整理"+sourceFileName+"文件"); try { FileInputStream file = new FileInputStream(sourceFile); XSSFWorkbook workbook = new XSSFWorkbook(file); //处理第一个sheet,若需要处理多个sheet,可以自行扩展 XSSFSheet sheet = workbook.getSheetAt(0); //移除表格第一列 removeCell(sheet,0); //移除表格第一列后,接着将原先第二列的数据往左边移动,即变成了第一列 sheet.shiftColumns(1,sheet.getRow(0).getLastCellNum(),-1); //表格最后一列往右移动一格 sheet.shiftColumns(sheet.getRow(0).getLastCellNum()-1,sheet.getRow(0).getLastCellNum(),1); //在倒数第二列地方新增一个表头标题 sheet.getRow(0).createCell(sheet.getRow(0).getLastCellNum() - 2).setCellValue("是否合格"); for(int i = 1; i<= sheet.getLastRowNum(); i++){ if(sheet.getRow(i) == null){ continue; } //单元格为空,则继续同一列的下一个单元格 if(sheet.getRow(i).getCell(sheet.getRow(i).getLastCellNum()-1) == null ){ continue; } //调整最右边的申请时间数据 int cellNum = sheet.getRow(i).getLastCellNum(); XSSFCell cell = sheet.getRow(i).getCell(cellNum- 1); cell.setCellType(CellType.STRING); cell.setCellValue(timeFormat(cell.toString())); //对倒数第二列标题为【是否合格】的列从第二行开始赋值为1 sheet.getRow(i).createCell(cellNum - 2).setCellValue(1); } //数据下移一行,空出第一行,设置新表头标题 sheet.shiftRows(0,sheet.getLastRowNum(),1,true,false); XSSFRow rows = sheet.createRow(0); rows.createCell(0).setCellValue("审计结果表"); FileOutputStream outFile =new FileOutputStream(System.getProperty("user.dir")+"//整理结果//"+sourceFileName+"//"+"处理完的表格.xlsx"); //写入到新文件里 workbook.write(outFile); file.close(); outFile.flush(); outFile.close(); System.out.println("整理完成"); } catch (FileNotFoundException e) { throw new RuntimeException(e); } catch (IOException e) { throw new RuntimeException(e); } } public static void removeCell(XSSFSheet sheet, int index){ for (Row row : sheet) { Cell cell = row.getCell(index); if (cell != null) { row.removeCell(cell); } } }}
这个方法主要分成以下几个步骤:
1、读取源文件内容,创建一个可读取表格的XSSFWorkbook对象,并通过workbook.getSheetAt(0)获取第一个sheet表格;
FileInputStream file = new FileInputStream(sourceFile);XSSFWorkbook workbook = new XSSFWorkbook(file);//处理第一个sheet,若需要处理多个sheet,可以自行扩展XSSFSheet sheet = workbook.getSheetAt(0);
2、删除第一列数据,然后将第二列开始到最后一列的数据往左移动一列,即原本的第二列变成第一列,第三列变成第二列,依次移动;
//移除表格第一列removeCell(sheet,0);//移除表格第一列后,接着将原先第二列的数据往左边移动,即变成了第一列sheet.shiftColumns(1,sheet.getRow(0).getLastCellNum(),-1);
removeCell(sheet,0)代码如下:
public static void removeCell(XSSFSheet sheet, int index){ for (Row row : sheet) { Cell cell = row.getCell(index); if (cell != null) { row.removeCell(cell); } }}
注意一点,前面有提到,直接使用sheet.shiftColumns(1,sheet.getRow(0).getLastCellNum(),-1)对第二列数据往左移动会报错,故而需要先删除第一列,再作迁移。
3、表格最后一列往右移动一格,然后在倒数第二列新增一个表头标题【是否合格】;
//表格最后一列往右移动一格sheet.shiftColumns(sheet.getRow(0).getLastCellNum()-1,sheet.getRow(0).getLastCellNum(),1);//在倒数第二列地方新增一个表头标题sheet.getRow(0).createCell(sheet.getRow(0).getLastCellNum() - 2).setCellValue("是否合格");
4、调整最右边的申请时间数据,统一改成“yyyy-mm-dd”格式,同时对倒数第二列标题为【是否合格】的列从第二行开始赋值为1;
for(int i = 1; i<= sheet.getLastRowNum(); i++){ if(sheet.getRow(i) == null){ continue; } //单元格为空,则继续同一列的下一个单元格 if(sheet.getRow(i).getCell(sheet.getRow(i).getLastCellNum()-1) == null ){ continue; } //调整最右边的申请时间数据 int cellNum = sheet.getRow(i).getLastCellNum(); XSSFCell cell = sheet.getRow(i).getCell(cellNum- 1); cell.setCellType(CellType.STRING); cell.setCellValue(timeFormat(cell.toString())); //对倒数第二列标题为【是否合格】的列从第二行开始赋值为1 sheet.getRow(i).createCell(cellNum - 2).setCellValue(1);}
5、所有数据下移一行,空出第一行设置新表头标题;
//数据下移一行,空出第一行,设置新表头标题sheet.shiftRows(0,sheet.getLastRowNum(),1,true,false);XSSFRow rows = sheet.createRow(0);rows.createCell(0).setCellValue("审计结果表");
7、写入到指定目录的新文件,关闭读取;
FileOutputStream outFile =new FileOutputStream(System.getProperty("user.dir")+"//整理结果//"+sourceFileName+"//"+"处理完的表格.xlsx");//写入到新文件里workbook.write(outFile);file.close();outFile.flush();outFile.close();System.out.println("整理完成");
其中,处理时间的方法代码如下,可支持对yyyy/mm/dd hh:mm:ss、yyyy/m/d h:mm:ss、yyyy/m/dd h:mm:ss、yyyymmdd、yyyy/mm/dd、yyyy/m/d、yyyy/m/dd、excel格式这些格式统一处理成“yyyy-mm-dd”:
public static String timeFormat(String date) { if ("".equals(date) || date == null) return "时间为空"; if (date.length() < 5) return "时间格式错误"; if (date.charAt(4) == "-") return date; String dateFormat = ""; switch (date.length()){ case 19: case 10: dateFormat = date.substring(0, 4) + "-" + date.substring(5, 7) + "-" + date.substring(8, 10); break; case 9: if (date.charAt(4) != "/" )break; case 17: dateFormat = date.substring(0, 4) + "-" + date.charAt(5) + "-" + date.substring(7, 9); break; case 8: if (date.charAt(4) != "/" ){ dateFormat = date.substring(0, 4) + "-" + date.substring(4, 6) + "-" + date.substring(6); break; } case 16: dateFormat = date.substring(0, 4) + "-" + date.charAt(5) + "-" + date.charAt(7); break; case 5: return numberToDate(date); default: return "时间格式错误"; } return dateFormat; }public static String numberToDate(String number){ Calendar calendar = new GregorianCalendar(1900,0,-1); Date date = DateUtils.addDays(calendar.getTime(),Integer.parseInt(number)); //对日期格式化操作 return new SimpleDateFormat("yyyy-MM-dd").format(date); }
因为是使用到Java SPI机制,故而需要在resource目录下创建一个META_INF.services目录,目录下创建一个与接口路径同名的文件:com.put.service.DisposeService。该文件里存放需要调用的DisposeService接口的实现类,然后就可以自动实现接口实现类的自动调用处理了。同理,后期若不需要调用某个实现类的方法了,只需要将该文件里的指定实现类路径去掉即可。
com.put.service.impl.DisposeServiceImpl
三、最后,新增一个main启动
public class AutoExcel { public static void main(String[] argv) { start(); } public static void start(){ //获取Java项目所在目录 File file = new File(System.getProperty("user.dir")); for (File f : file.listFiles()){ if (!f.isDirectory() && f.getName().contains(".xlsx")){ String sourceFile = f.getName(); String sourceFileName = sourceFile.substring(0,sourceFile.lastIndexOf(".")); if (StringUtils.isAnyBlank(sourceFile,sourceFileName))return; //创建文件目录 createDirectory(sourceFileName); //基于SPI机制自动调用实现类来实现文件处理 execute(sourceFile,sourceFileName); } } } public static void createDirectory(String sourceName){ File file = new File(System.getProperty("user.dir") + "//整理结果//" + sourceName); if (!file.exists()){ file.mkdirs(); } } public static void execute(String sourceFile, String sourceName){ ServiceLoader serviceLoader = ServiceLoader.load(DisposeService.class); Iterator serviceIterator = serviceLoader.iterator(); while (serviceIterator.hasNext()){ DisposeService service = serviceIterator.next(); if (service == null)return; new Thread(()->{ service.export(sourceFile,sourceName); }).start(); } }}
基于以上代码来梳理说明一下流程:
1、获取Java项目所在的文件路径,然后获取该路径的.xlsx表格文件名,若是存在多个.xlsx表格文件,可以同时批量处理。
File file = new File(System.getProperty("user.dir"));for (File f : file.listFiles()){ if (!f.isDirectory() && f.getName().contains(".xlsx")){ String sourceFile = f.getName(); String sourceFileName = sourceFile.substring(0,sourceFile.lastIndexOf(".")); if (StringUtils.isAnyBlank(sourceFile,sourceFileName))return; ...... }}
2、创建处理好的表格统一存放目录,路径名为,当前目录//整理结果//文件名同名文件夹//
public static void createDirectory(String sourceName){ File file = new File(System.getProperty("user.dir") + "//整理结果//" + sourceName); if (!file.exists()){ file.mkdirs(); }}
例如,处理的文件名为“测试表格文件.xlsx”,那么创建的目录结构效果如下:
3、基于Java SPI机制,读取获取接口对应的com.put.service.DisposeService文件内容,然后反射得到文件里指定的实现类,循环执行各个实现类的方法:
public static void execute(String sourceFile, String sourceName){ ServiceLoader serviceLoader = ServiceLoader.load(DisposeService.class); Iterator serviceIterator = serviceLoader.iterator(); while (serviceIterator.hasNext()){ DisposeService service = serviceIterator.next(); if (service == null)return; new Thread(()->{ service.export(sourceFile,sourceName); }).start(); }}
该方法里我用了多线程并发处理,因为各个文件的处理无任何依赖,若是大批量处理时,串行执行实在太慢,但多线程处理同时也会存在一个问题是,若大批量表格文件中每个文件数据量都很大的话,电脑内存太小的话,可能会出现内存溢出问题。
三、maven项目打成一个jar,然后编写一个可在windows运行的bat脚本。
拷贝最后一个auto-put-file-1.0-SNAPSHOT-jar-with-dependencies.jar到随意一个目录里,然后编写一个名字为start.bat脚本:
@echo offjava -jar auto-put-file-1.0-SNAPSHOT-jar-with-dependencies.jar
将start.bat和auto-put-file-1.0-SNAPSHOT-jar-with-dependencies.jar放同一个目录里,然后将需要处理的Excel文件放到该目录下,点击start.bat即可运行。
关键词:
新动态:设计一款可扩展和基于windows系统的一键处理表格小工具思路
天天即时看!微软签署第四份《使命召唤》十年协议:索尼仍不愿妥协
【天天聚看点】男孩长蛀牙爸爸用电钻钻牙止痛 被网友疯狂指责:太危险了
全球讯息:20.98万元起 2023款比亚迪唐DM-i上市:全系升级铝合金悬架
热点聚焦:冲击百万销量!比亚迪汉DM-i、DM-p补贴10000元现金
世界观速讯丨点积、内积、外积、叉积、张量积——概念区分
day05-Lombok、SpringInitializer
【世界聚看点】国家推出稳定2023年大豆生产一揽子支持政策
当前关注:双拖布+超大吸力!小米米家扫拖机器人3S发售:千元旗舰
世界视点!特斯拉一体化压铸工艺被质疑增加修车成本 一个小碰撞可能要修11万
精彩看点:追上Intel AMD锐龙7000处理器终于用上192GB内存:频率满血
环球看热讯:315全景观察:深情主播“连哄带骗” 爸妈的钱就没了
最新:无解了!微软将推出基于GPT-4的Office 365服务 实用性拉满
【焦点热闻】北京通州区汽车消费券活动时间是什么时候?
Redis监控
sed文本处理工具常见用法
每日看点!Prometheus 监控系统1
Java中的NIO
环球快报:带你全方面了解字节 A/B 实验的文化与工具
世界新资讯:【金融街发布】交易商协会发布企业资产证券化基础性制度
【世界播资讯】重庆龙凤胎熊猫宝宝取名“渝可”“渝爱”
速看:《小美人鱼》剧照还原动画经典场景:就是肤色不太对
头条焦点:中国制造!索尼第四代降噪豆XM5佩戴/音质/快充全面升级:AirPods Pro2劲敌
老人墓中藏13万现金全部霉变 专业能手全力抢救:官方科普纸钞如何保管
海底捞部分门店取消免费美甲:只能付费购买穿戴甲
视讯!SQLMap 源码阅读
今日观点!abc285G
环球精选!JVM -Xss
【高端访谈·城市力量】“双碳”背景下农商银行如何“点绿”成金?——访秦农银行党委书记、董事长李彬
今热点:五菱电动“吉姆尼” 宝骏悦也续航里程公布:能跑303公里
董明珠要玩大的?格力成立房地产新公司 投资数亿元
东方甄选称被骗了 虾品供应商发声:不认可甩锅行为
热点在线丨百度文心一言申请页被挤爆:预约1小时涌入3万企业
环球快讯:现实版GTA!美劫匪偷直升机因操作失误当场坠毁:一地碎片
国宝大熊猫的视频_国宝大熊猫的故事
66.类型转换
快讯:【0基础学爬虫】爬虫基础之抓包工具的使用
天天热头条丨制作学生信息管理系统
文心一言正式对标GPT-4,是青铜还是王者?
全球播报:恒生指数16日收跌1.72% 互联网科技股集体走低
每日速看!铁匠用30年给猫和老鼠做铠甲:一套比一套帅!
戴尔推出了灵越14 ARM版:骁龙8cx Gen 2、16小时长续航
世界播报:卡布达归来!《铁甲小宝》高清修复版将至:已开通B站账号
两败俱伤:比亚迪海豹街头铲翻宝马X5
块级元素和行内元素
天天实时:SublimeREPL设置详解——实现代码传递(Eval in REPL)
天天观速讯丨JavaScript 实现异步任务循环顺序执行
自定义 Spring 通用日志注解
精彩看点:日债市场继续消化欧美银行风险扰动 收益率曲线陡峭化下移
即时焦点:【财经分析】债市利空反应钝化 后市操作存分歧
每日快报!【新华500】新华500指数(989001)16日跌1.29%
【环球时快讯】小伙爆改特斯拉Model 3:加装120寸轮毂、增加“逆天”功能
【新要闻】百度文心一言问答测试为视频演示 李彦宏:为保证效果提前录制
全球实时:深蓝SL03车主联合声明:长安雇水军打压车主 要求车辆终身质保加补偿
国内首款天玑9000旗舰平板!OPPO Pad 2官宣:下周发布
【世界时快讯】曾投资一亿美元:马斯克痛批OpenAI成为营利组织
冰墩墩钥匙扣(冰墩墩多少钱一只)
最新消息:76.qt qml-QianWindow开源炫酷界面框架(支持白色暗黑渐变自定义控件均以适配)
今热点:Markdown用法解析
世界微动态丨得物从0到1自研客服IM系统的技术实践之路
天天看热讯:性能优化搞得好,Tomcat少不了。| 博学谷狂野架构师
世界观天下!笔记本水冷改造记录
世界球精选!创维造车:主打座舱养生续命、碰撞测试0分!真是讽刺他妈给讽刺开门
环球即时:反转!国内油价明晚大概率下跌 预计下调0.07元/升
《暗黑4》本周末开测 世界BOSS刷新时间公布
天天关注:巴奴火锅下架富硒土豆!消费者可获赠500元储值卡:领取有条件
天天热推荐:百度发布文心一言AI模型:可实现文字、图片与视频智能生成
喝的人越来越少!星巴克向中国三四线城市进军:30多一杯咖啡县城青年能爱多久
麦芒11什么时候上市的?麦芒11手机参数配置
华为电视怎么投屏?华为电视怎么下载第三方软件?
孙海洋是湖北哪里人?
鲶鱼效应是什么意思?鲶鱼效应的经典案例是什么?
首店经济是什么意思?首店经济是谁提出的?
快报:权志龙演唱会门票多少钱2020_权志龙演唱会门票多少钱
环球讯息:用图技术搞定附近好友、时空交集等 7 个典型社交网络应用
GPT-4测评,大家先别急,图片输入还没来
全球时讯:C#使用ObjectPool提高StringBuilder性能
今头条!RTX 40笔记本新品翻车?别急 先升级NVIDIA新驱动再说
每日精选:官宣!《炉石传说》被移出杭州亚运会项目:职业选手难过
环球快消息!360发布年度手机安全报告:受骗男性占七成 女性三成
天天最资讯丨800V电气架构打造 全新起亚EV9发布:二三排可面对面乘坐
扣上的安全带会自动打开?本田在美国召回近45万辆汽车
【独家焦点】虹科案例|虹科Visokio商业智能平台在疫后帮酒店业打好翻身仗!
环球今热点:python 二分法查找
环球实时:面试问题-密码
Fortran语言在线代码运行编译工具推荐
Scrapy中的response对象的属性及方法,附加mate属性的使用方法
每日短讯:强冷空气来袭!河南三门峡3月下雪:厚厚一层一夜回冬
环球要闻:爱立信CEO:印度是全球推出5G速度最快的国家之一
上映25周年纪念:3D重制版《泰坦尼克号》国内定档
真凉了!暴雪网易闹掰 《炉石传说》或被移出杭州亚运会项目
世界快看:B站投资 网红爆款:理然男士沐浴露29.9元狂促
更改 ESX 或 ESXi 主机的主机名称
每日快讯!作业DNS服务配置
NOI 2008 志愿者招募 题解 (神奇费用流)
NutUI-React 京东移动端组件库 2月份上新!欢迎使用!
传递“坚持”背后的感人力量
环球新资讯:恒生中国发布2022年ESG报告 持续提升绿色金融产品与服务质量
日本央行削减购债引发政策转向猜测 超长端日债收益率显著回升
天天精选!中银香港完成5亿绿色人民币逆回购交易