当前位置: 首页 > news >正文

EasyExcel 通过模板 导入、导出、下载模板

EasyExcel 通过模板 导入、导出、下载模板

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
import java.io.Serializable;/*** @author ext.libo15* @title: 导入员工花名册*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@HeadRowHeight(value = 40)
public class StudentExcel implements Serializable {private static final long serialVersionUID = -5144055068797033748L;/*** 姓名*/@ExcelProperty(value = "姓名", index = 0)@ColumnWidth(value = 20)@NotBlank(message="姓名不能为空")private String name;/*** 性别 1:男 :2女*/@ExcelProperty(value = "性别\r1:男 :2女", index = 1)@ColumnWidth(value = 20)@NotBlank(message="性别不能为空")private String gender;/*** 出生日期*/@ExcelProperty(value = "出生日期", index = 2)@ColumnWidth(value = 20)@NotBlank(message="出生日期不能为空")@DateTimeStr(format ="yyyy-MM-dd", message = "出生日期格式错误,正确格式为:yyyy-MM-dd")private String birthday;/*** 年龄*/@ExcelProperty(value = "年龄", index = 3)@ColumnWidth(value = 20)@NotBlank(message="年龄不能为空")private String age;/*** 身份证号码*/@ExcelProperty(value = "身份证号码", index = 4)@ColumnWidth(value = 20)@NotBlank(message="身份证号码不能为空")@Pattern(regexp = "^\\d{15}$|^\\d{17}[0-9Xx]$",message = "身份证格式不正确!")//长度18,0-9private String cardNo;/*** 联系电话*/@ExcelProperty(value = "联系电话", index = 5)@ColumnWidth(value = 20)@NotBlank(message="联系电话不能为空")@Pattern(regexp = "^[1][3,4,5,7,8][0-9]{9}$",message = "联系电话格式不正确!")//长度11private String telephone;/*** 是否已婚 1:是  2:否*/@ExcelProperty(value = "是否已婚", index = 6)@ColumnWidth(value = 20)@NotBlank(message="是否已婚不能为空")private String marryStatus;/*** 银行卡号*/@ExcelProperty(value = "银行卡号", index = 8)@ColumnWidth(value = 20)@NotBlank(message="银行卡号不能为空")@Pattern(regexp = "^([1-9]{1})(\\d{14}|\\d{18})$",message = "银行卡号格式不正确!")//长度11private String bankCardNo;

Student 对象(你的业务对象,就是数据库对应的对象)

public class Student implements Serializable {private static final long serialVersionUID = -5144055068797033748L;/*** 姓名*/private String name;/*** 性别 1:男 :2女*/private int gender;/*** 出生日期*/private Date birthday;/*** 年龄*/private int age;/*** 身份证号码*/private String cardNo;/*** 联系电话*/private String telephone;/*** 是否已婚 1:是  2:否*/private int marryStatus;/*** 银行卡号*/private String bankCardNo;/*** 时间*/private Date dimissionDate;

Controller 代码:

    /*** 导入*/@RequestMapping(value="/import")public void importExcel(HttpServletRequest request, HttpServletResponse response,@RequestBody MultipartFile file) throws Exception {staffManageService.importExcel(file);}/*** 导出*/@RequestMapping(value="/export",method = RequestMethod.POST)public void batchExport(HttpServletResponse response) throws ParseException {staffManageService.export(response,staffRosterVo);}/*** 下载模板** @param* @return* @throws Exception* @author ext.libo15*/@GetMapping(value="/download")public void download(HttpServletRequest request, HttpServletResponse response) throws FileNotFoundException {FileUtil.downloadExcel(request,response);}
}

2.下载模板
这里其实 Controller + FileUtil 工具类,下载模板的操作已经做好了。工具类我放最下面了

**

3.导入
**

    /*** 导入* @param file*/@Overridepublic void importExcel(MultipartFile file) throws Exception {List<Student> ExcelList = null;String validate = "";//校验文件大小 100Mboolean size = FileUtil.checkFileSize(file.getSize(), 100, "M");if(size == false){//文件过大啦,只能100M}//excel读取数据staffExcelList = EasyExcel.read(new BufferedInputStream(file.getInputStream())).head(StaffDataExcel.class).sheet().doReadSync();if (ExcelList.size() > 1000) {//最多导入1000条哦}// excel数据校验validate = ValidatorUtils.beanValidate(ExcelList);if(!validate.equals("success")){//参数异常提示  如:姓名不能为空哦~}//把Excel数据转换成你对应的对象集合ListList<Student> studentList = ExcelUtil.excelListConvertList(ExcelList);//拿到数据后就可以 入库操作啦 -----我自己的入库就不给你们写了StudentService.importExcel(studentList );}

4.导出

    /*** 导出* @param response* @param staffRosterVo* @return* @throws ParseException*/@Overridepublic void export(HttpServletResponse response) throws ParseException {String fileName = "导出的文件名称";String sheetName = "导出的 sheetName ";List<Student> list = studentService.findList();List<StaffDataExportExcel> studentExcelList = ExcelUtil.listConvertexcelList(list );try {ExcelUtil.writeExcel(response, studentExcelList , fileName, sheetName, StaffDataExportExcel.class);} catch (Exception e) {e.printStackTrace();}}

5.工具类 FileUtil :

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;public class FileUtil {/*** 判断文件大小** @param len*            文件长度* @param size*            限制大小* @param unit*            限制单位(B,K,M,G)* @return*/public static boolean checkFileSize(Long len, int size, String unit) {
//        long len = file.length();double fileSize = 0;if ("B".equals(unit.toUpperCase())) {fileSize = (double) len;} else if ("K".equals(unit.toUpperCase())) {fileSize = (double) len / 1024;} else if ("M".equals(unit.toUpperCase())) {fileSize = (double) len / 1048576;} else if ("G".equals(unit.toUpperCase())) {fileSize = (double) len / 1073741824;}if (fileSize > size) {return false;}return true;}public static void downLoadFile(String filePath, String fileName, HttpServletResponse response) {try (InputStream inStream = new FileInputStream(filePath);OutputStream os = response.getOutputStream()) {response.setHeader("Content-Disposition", "attachment; fileName=" + URLEncoder.encode(fileName, "UTF-8"));response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("utf-8");byte[] buff = new byte[100];int len;while ((len = inStream.read(buff)) > 0) {os.write(buff, 0, len);}os.flush();} catch (Exception e) {e.Exception ();}}//下载模板public static void downloadExcel(HttpServletRequest request, HttpServletResponse response){//方法一:直接下载路径下的文件模板(这种方式貌似在SpringCloud和Springboot中,打包成JAR包时,无法读取到指定路径下面的文件,不知道记错没,你们可以自己尝试下!!!)try {//文件名称String fileName = "importStaffRoster.xlsx";//设置要下载的文件的名称response.setHeader("Content-disposition", "attachment;fileName=" + fileName);//通知客服文件的MIME类型response.setContentType("application/vnd.ms-excel;charset=UTF-8");//获取文件的路径String filePath = FileUtil.class.getResource("/template/" + fileName).getPath();FileInputStream input = new FileInputStream(filePath);OutputStream out = response.getOutputStream();byte[] b = new byte[2048];int len;while ((len = input.read(b)) != -1) {out.write(b, 0, len);}//修正 Excel在“xxx.xlsx”中发现不可读取的内容。是否恢复此工作薄的内容?如果信任此工作簿的来源,请点击"是"response.setHeader("Content-Length", String.valueOf(input.getChannel().size()));input.close();} catch (Exception ex) {ex.printStackTrace();}}}

6.工具类 ValidatorUtils (导入的时候参数校验)

import cn.hutool.core.lang.Assert;
import org.apache.commons.lang3.ObjectUtils;import javax.validation.ConstraintViolation;
import javax.validation.Valid;
import javax.validation.Validation;
import javax.validation.Validator;
import java.util.*;public class ValidatorUtils {private static final Validator validator = Validation.buildDefaultValidatorFactory().getValidator();public static String beanValidate(@Valid Object obj) throws IllegalArgumentException {if (obj instanceof Collection) {ValidCollection<Object> validCollection = new ValidCollection<>();validCollection.setList((Collection) obj);return validate(validCollection);} else {return validate(obj);}}public static String validate(@Valid Object obj) {try {Map<String, String> validatedMsg = new HashMap<>();Set<ConstraintViolation<Object>> constraintViolations = validator.validate(obj);String validate = "";String message = "";for (ConstraintViolation<Object> c : constraintViolations) {validate = c.getPropertyPath().toString();validate = validate.substring(5,6);int unm = Integer.valueOf(validate) +1;validatedMsg.put( "表格第"+unm+"条 ", c.getMessage());}Assert.isTrue(ObjectUtils.isEmpty(constraintViolations), validatedMsg.toString());} catch (IllegalArgumentException e) {e.printStackTrace();return e.getMessage();}return "success";}private static class ValidCollection<T> {@Validprivate Collection<T> list;public Collection<T> getList() {return list;}public void setList(Collection<T> list) {this.list = list;}}
}

工具类

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import org.apache.poi.ss.usermodel.HorizontalAlignment;import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;public class ExcelUtil {/*** 导出* @param response* @param data* @param fileName* @param sheetName* @param clazz* @throws Exception*/public static void writeExcel(HttpServletResponse response, List<? extends Object> data, String fileName, String sheetName, Class clazz) throws Exception {//表头样式WriteCellStyle headWriteCellStyle = new WriteCellStyle();//设置表头居中对齐headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);//内容样式WriteCellStyle contentWriteCellStyle = new WriteCellStyle();//设置内容靠左对齐contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.LEFT);HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);EasyExcel.write(getOutputStream(fileName, response), clazz).excelType(ExcelTypeEnum.XLSX).sheet(sheetName).registerWriteHandler(horizontalCellStyleStrategy).doWrite(data);}private static OutputStream getOutputStream(String fileName, HttpServletResponse response) throws Exception {fileName = URLEncoder.encode(fileName, "UTF-8");response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf8");response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");return response.getOutputStream();}/** Excel转换实体类对象*/public static List<Student> excelListConvertList(List<StudentExcel> studentExcelList) throws ParseException {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");List<Student> list = new ArrayList<>();for (StudentExcel s : studentExcelList) {Student student = Student.builder().name(staffDataExcel.getname()).age(staffDataExcel.age()).city(staffDataExcel.getCity()).sex(staffDataExcel.getsex().equals("男")?1:2).birthday(sdf.parse(staffDataExcel.getBirthday())).build();list.add(student);}return list ;}/**  导出的List集合 转换 Excel*/public static List<StudentExportExcel> listConvertexcelList(List<Student> student) throws ParseException {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");List<StudentExcel> list= new ArrayList<>();for (Student s : student) {StudentExcel excel = StudentExcel.builder().name(staffDataExcel.getname()).age(staffDataExcel.age()).city(staffDataExcel.getCity()).sex(staffDataExcel.getsex().equals("男")?1:2).birthday(sdf.parse(staffDataExcel.getBirthday())).build();.build();list.add(excel);}return list;}}

7.校验日期注解


import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = CheckDateTimeCaseValidator.class)
public @interface DateTimeStr {String message() default "{javax.validation.constraints.DateTimeStr.message}";String format() default "yyyy-MM-dd";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};
}

相关文章:

EasyExcel 通过模板 导入、导出、下载模板

EasyExcel 通过模板 导入、导出、下载模板 import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor;import javax.validation.constraints.NotBlank; import javax.validation.constraints.Pattern; import java.io.…...

SAP ABAP通过代码解锁SM12中被锁定目标<转载>(RFC: ENQUEUE_READ和 ENQUE_DELETE)

原文链接&#xff1a;https://blog.csdn.net/sinat_38119716/article/details/121406275 备注 RFC:ENQUEUE_READ 读取的是SM12的数据 RFC:ENQUEUE_READ2 读取的是SMENQ的数据 SM12 和 SMENQ 的数据其实是一样的&#xff0c;只是一个是旧的TCODE 一个是新的 解锁用的都是RFC: …...

跳跃表原理及实现

一、跳表数据结构 跳表是有序表的一种&#xff0c;其底层是通过链表实现的。链表的特点是插入删除效率高&#xff0c;但是查找节点效率很低&#xff0c;最坏的时间复杂度是O(N)&#xff0c;那么跳表就是解决这一痛点而生的。 为了提高查询效率&#xff0c;我们可以给链表加上索…...

详解Vue3中的鼠标事件mousemove、mouseover和mouseout

本文主要介绍Vue3中的常见鼠标事件mousemove、mouseover和mouseout。 目录 一、mousemove——鼠标移动事件二、mouseover——鼠标移入事件三、mouseout——鼠标移出事件 下面是Vue 3中常用的鼠标事件mousemove、mouseover和mouseout的详解。 一、mousemove——鼠标移动事件 鼠…...

Java:socket编程

目录 1、主程序 2、socket任务类 3、jdbc任务类 4、tomcat-jdbc连接池 5、jar包依赖 1、主程序 创建2个线程池&#xff0c;一个用于管理socket连接&#xff0c;一个用来管理jdbc连接。 package socket;import java.io.IOException; import java.net.ServerSocket; import…...

哨兵1号回波数据(L0级)FDBAQ压缩算法详解

本专栏目录: 全球SAR卫星大盘点与回波数据处理专栏目录-CSDN博客 1. 全球SAR卫星回波数据压缩算法统计 各国的SAR卫星的压缩算法按照时间轴排列如下: 可以看出传统的分块BAQ压缩算法(上图粉色)仍然是主流,哨兵1号其实也有传统的BAQ压缩模式。 本文介绍哨兵1号用的FDBAQ算…...

盾构机数据可视化监控平台 | 图扑数字孪生

2002 年,中国 863 计划把盾构机列为国家关键技术&#xff0c;以国家力量为主导&#xff0c;集中力量进行盾构机专项研究。在 2008 年&#xff0c;中国成功研制出属于自己的国产盾构机——中国中铁一号&#xff0c;同时还打通了天津地铁 1500m 的隧道。此举更彻底地打破了国内盾…...

计算机网络课程设计-企业网三层架构

&#xff08;单人版&#xff09; 摘 要 本篇报告主要解决了为一家名为西宫的公司网络搭建问题&#xff0c;该网络采用企业网三层架构对完了过进行设计。首先使用以太网中继&#xff0c;主要使用VLAN划分的技术来划定不同部门。使用MSTP对每个组配置生成树&#xff0c;防止交换机…...

Docker上传镜像到Harbor

上传镜像到Harbor 给镜像打上标签 语法 docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/] docker tag eureka:v1 127.0.0.1:85/tensquare/eureka:v1推送镜像 docker push 127.0.0.12:85/tensquare/eureka:v1如果出现以下错误&#xff0c;是因为Docker没有把Har…...

mfc100u.dll文件丢失了要怎么解决?修复mfc100u.dll详细指南

mfc100u.dll文件丢失了要怎么解决?首先让我们扒一扒什么是 mfc100u.dll。这玩意儿是 Microsoft Visual Studio 2010 的一部分&#xff0c;它就像一款程序生活中不可或缺的零件&#xff0c;没了它&#xff0c;程序肯定跑不起来。想想看&#xff0c;没有一个重要的零件&#xff…...

【ArcGIS微课1000例】0084:甘肃积石山地震震中100km范围内历史灾害点分布图(2005-2020)

甘肃积石山地震震中100km范围内历史灾害点分布图(2005-2020)。 文章目录 一、成果预览二、实验数据三、符号化四、地图整饰一、成果预览 本实验最终效果图如下所示: 二、实验数据 以下数据可以从本专栏配套的实验数据包中0084.rar中获取。 1. 历史灾害数据。为2005-2020时…...

java SSM拖拉机售后管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM拖拉机售后管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源 代码和数据库&#xff0c;系统主要…...

侯捷C++ 2.0 新特性

关键字 nullptr and std::nullptr_t auto 一致性初始化&#xff1a;Uniform Initialization 11之前&#xff0c;初始化方法包括&#xff1a;小括号、大括号、赋值号&#xff0c;这让人困惑。基于这个原因&#xff0c;给他来个统一&#xff0c;即&#xff0c;任何初始化都能够…...

计算机网络——基础知识汇总(八)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…...

DIA数皆智能客户体验管理CEM获伊利“健康+AI”生态创新大奖

DIA数皆智能客户体验管理CEM获伊利“健康AI”生态创新大奖 数皆智能再获殊荣&#xff01; 北京&#xff0c;2023年12月26日 — 在全球瞩目的伊利集团“健康AI”生态创新大赛中&#xff0c;上海数皆智能技术有限公司大放异彩&#xff0c;其创新领先的“智能化客户体验管理CEM&a…...

linux 休眠唤醒中设备、总线、用户进程、内核线程调试分析流程

一、suspending consoles打印 代码位置&#xff1a;Kernel/power/suspend.c 函数调用流程&#xff1a;devices_and_enter(suspend_state_t state) --> suspend_console(); void suspend_console(void) { if (!console_suspend_enabled) 注释这一行&#xff0c;可以看到…...

k8s陈述式资源管理(命令行)

1、资源管理 &#xff08;1&#xff09;陈述式资源管理&#xff08;常用——查、增&#xff09; 使用kubectl工具进行命令行管理 ①特点&#xff1a;对资源的增删查比较方便&#xff0c;对改不友好 ②优点&#xff1a;90%以上的场景都可以满足 ③缺点&#xff1a;命令冗长…...

五、HTML 标题

在 HTML 文档中&#xff0c;标题很重要。 一、HTML 标题 标题&#xff08;Heading&#xff09;是通过 <h1> - <h6> 标签进行定义的。<h1> 定义最大的标题。 <h6> 定义最小的标题。 <h1>这是一个标题。</h1> <h2>这是一个标题。&l…...

三菱MR-JE伺服脉冲轴应用参数设置

三菱MR-JE伺服在脉冲轴控制上的应用&#xff0c;常用参数设置如下&#xff1a; 1、常用参数 未完......

通信原理课设(gec6818) 006:网络编程

目录 1、概念 2、通信 3、通信基本流程 TCP: UDP: 4、函数 I 创建套接字 II 绑定地址 III 字节序转换 IV 地址转换 V 监听 VI accept VII connect VIII 从套接字接收信息 IX 从套接字发送消息 X 关闭套接字 5、网络配置 1、确保你的网卡里面有两个虚拟网卡&a…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...