1、创建SpringBoot项目
2、在resources创建application.yml
server:
port: 8080
spring:
application:
name: excel_demos
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false
username: root
password: root
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: on
3、在pom.xml导入依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>excel_demos</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>excel_demos</name>
<description>excel_demos</description>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<!-- lombok插件 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<!-- <optional>true</optional>-->
<version>1.18.20</version>
</dependency>
<!-- Hutool工具类 -->
<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.3</version>
</dependency>
<!-- guava -->
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.1-jre</version>
</dependency>
<!--swagger3 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
<!--mysql驱动依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--MyBatisPlus起步依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.2</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.2</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.11.2</version>
<scope>runtime</scope>
</dependency>
<!-- jsoup -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.10.3</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<image>
<builder>paketobuildpacks/builder-jammy-base:latest</builder>
</image>
</configuration>
</plugin>
</plugins>
</build>
</project>
4、MYSQL创建一个表
CREATE TABLE `party_member` (
`id` int NOT NULL AUTO_INCREMENT,
`party_id` varchar(20) DEFAULT NULL,
`username` varchar(20) DEFAULT NULL,
`gender` varchar(10) DEFAULT NULL,
`phone_number` varchar(11) DEFAULT NULL,
`remark` varchar(31) DEFAULT NULL,
`create_time` datetime DEFAULT NULL,
`update_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
5、创建entity跟表对应PartyMember类
/**
* 信息表
* @author MyPC
* @TableName party_member
*/
@Data
@ApiModel(value = "信息表")
@NoArgsConstructor
@AllArgsConstructor
@TableName("party_member")
public class PartyMember implements Serializable {
/**
* 序号
*/
@TableId(type = IdType.AUTO,value = "party_id")
@ApiModelProperty(value = "序号")
@Alias("序号")
private Long partyId;
/**
* 姓名
*/
@ApiModelProperty(value = "姓名")
@Alias("姓名")
private String username;
/**
* 性别
*/
@ApiModelProperty(value = "性别")
@Alias("性别")
private String gender;
/**
* 联系方式
*/
@ApiModelProperty(value = "联系方式")
@TableField(value = "phone_number")
@Alias("联系方式")
private String phoneNumber;
/**
* 备注
*/
@ApiModelProperty(value = "备注")
@Alias("备注")
private String remark;
/**
* 创建时间
*/
@ApiModelProperty(value = "创建时间")
@Alias("创建时间")
@TableField(value = "create_time",fill = FieldFill.INSERT)
private Date createTime;
/**
* 修改时间
*/
@ApiModelProperty(value = "修改时间")
@Alias("修改时间")
@TableField(value = "update_time",fill = FieldFill.UPDATE)
private Date updateTime;
private static final long serialVersionUID = 1L;
}
6、创建mapper文件中PartyMemberMapper
public interface PartyMemberMapper extends BaseMapper<PartyMember> {
}
7、在resources创建mapper文件中的PartyMemberMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.excel_demos.mapper.PartyMemberMapper">
<resultMap id="BaseResultMap" type="com.example.excel_demos.Entity.PartyMember">
<result property="partyId" column="partyId" jdbcType="BIGINT"/>
<result property="username" column="username" jdbcType="VARCHAR"/>
<result property="gender" column="gender" jdbcType="VARCHAR"/>
<result property="phoneNumber" column="phone_number" jdbcType="VARCHAR"/>
<result property="remark" column="remark" jdbcType="VARCHAR"/>
</resultMap>
<sql id="Base_Column_List">
partyId,username,gender,phone_number,
remark
</sql>
</mapper>
8、创建service文件PartyMemberService接口
public interface PartyMemberService extends IService<PartyMember> {
//封装上传excel方法
JsonRsp readFile(MultipartFile file);
}
9、创建impl文件PartyMemberServiceImpl类
@Service
public class PartyMemberServiceImpl extends ServiceImpl<PartyMemberMapper, PartyMember> implements PartyMemberService {
@Autowired
private PartyMemberMapper partyMemberMapper;
@Override
@Transactional
public JsonRsp readFile(MultipartFile file) {
// 文件名
String name = file.getOriginalFilename();
boolean b;
System.out.println("name = " + name);
if (name.endsWith(".xls")) {
b = true;
} else if (name.endsWith(".xlsx")) {
b = false;
} else if (name.endsWith(".jpg") || name.endsWith(".png")) {
return JsonRsp.error("这是图片");
} else {
return JsonRsp.error("不是excel文件");
}
List<PartyMember> partyMemberList = null;
try {
System.out.println("file.getInputStream() = " + file.getInputStream());
partyMemberList = PartyParty.getDataFromExcel(b, file.getInputStream());
System.out.println("partyMemberList = " + partyMemberList);
if (partyMemberList.isEmpty()) {
return JsonRsp.error("导入一张错误的excel表");
}
for (PartyMember partyMember : partyMemberList) {
partyMember.setPartyId(null);
System.out.println("partyMember = " + partyMember);
partyMemberMapper.insert(partyMember);
}
return JsonRsp.success("文件添加完成!");
} catch (IOException e) {
return JsonRsp.error(e.getMessage());
}
}
}
10、创建controller文件ExcelController类
@Api(tags = "信息控制器")
@RestController
@RequestMapping("/web/party")
public class ExcelController {
@Autowired
private PartyMemberService partyMemberService;
@ApiOperation("查询列表")
@GetMapping(value = "/page")
public JsonRsp page(@RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "10") Integer pageSize) {
Page<PartyMember> objectPage = new Page<>(page, pageSize);
return JsonRsp.success(partyMemberService.page(objectPage, null));
}
@ApiOperation("上传表")
@PostMapping(value = "/upload")
public JsonRsp readFile(@RequestParam(value = "file") MultipartFile file) {
return partyMemberService.readFile(file);
}
@ApiOperation("导出表")
@GetMapping("/exportPartyMemberToExcel")
public void exportPartyMemberToExcel1(@RequestParam(required = false) String username,
@RequestParam(required = false) String gender,
HttpServletResponse response) throws IOException {
ExcelWriter writer = ExcelUtil.getWriter(true);
List<PartyMember> list = new ArrayList<>();
//根据条件批量导出数据表,不传条件则全部导出
QueryWrapper<PartyMember> objectQueryWrapper = new QueryWrapper<>();
objectQueryWrapper.like(StrUtil.isNotBlank(username), "username", username);
objectQueryWrapper.like(StrUtil.isNotBlank(gender), "gender", gender);
list = partyMemberService.list(objectQueryWrapper);
// 设置响应头
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("用户信息表", "UTF-8") + ".xlsx");
writer.write(list, true);
ServletOutputStream outputStream = response.getOutputStream();
writer.flush(outputStream, true);
outputStream.flush();
outputStream.close();
}
@ApiOperation("编码搜索(模糊搜索)")
@GetMapping("/selectEncoding")
public JsonRsp selectEncoding(
@RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "10") Integer pageSize,
@ApiParam(value = "用户名", required = false) @RequestParam(value = "username", required = false) String username) {
Page<PartyMember> todoPage = new Page<>(page, pageSize);
QueryWrapper<PartyMember> wrapper = new QueryWrapper<>();
wrapper.like(StringUtils.isNotBlank(username),"username", username);
return JsonRsp.success(partyMemberService.page(todoPage,wrapper));
}
}
11、创建component文件MyMetaObjectHandler类,填充创建时间、更新数据时间
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
/**
* 插入时的填充策略
*
* @param metaObject
*/
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createTime", new Date(), metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
}
/**
* 更新时的填充策略
*
* @param metaObject
*/
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime", new Date(), metaObject);
}
}
12、创建common文件PartyParty类,Excel工具类 从excel中读取数据
/**
* Excel工具类
*/
public class PartyParty {
/**
* 从excel中读取数据
*
* @param xls true xls文件,false xlsx文件
* @param inputStream 文件输入流
* @return 数据封装到对象
*/
public static List<PartyMember> getDataFromExcel(boolean xls, InputStream inputStream) {
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
Workbook workbook = null;
List<PartyMember> partyMemberList = new ArrayList<>();
try {
if (xls) {
workbook = new HSSFWorkbook(inputStream);
} else {
workbook = new XSSFWorkbook(inputStream);
}
// 得到一个工作表
Sheet sheet = workbook.getSheetAt(0);
// 得到表头
Row rowHead = sheet.getRow(0);
// 判断表头是否正确
if (rowHead.getPhysicalNumberOfCells() < 1) {
throw new Exception("表头错误");
}
// 获取数据
for (int i = 2; i <= sheet.getLastRowNum(); i++) {
// 获取第i行
Row row = sheet.getRow(i);
System.out.println("row = " + row);
}
String username = row.getCell(2).getStringCellValue();
String gender = row.getCell(3).getStringCellValue();
String specialClass = row.getCell(17).getStringCellValue();
Cell cell2 = row.getCell(4);
String phoneNumber = "";
if (cell2.getCellType() == CellType.STRING) {
phoneNumber = cell2.getStringCellValue();
} else if (cell2.getCellType() == CellType.NUMERIC) {
// 处理数值类型数据,例如将数值转换为字符串
phoneNumber = String.valueOf((long) cell2.getNumericCellValue());
}
String remark = row.getCell(5).getStringCellValue();
partyMemberList.add(new PartyMember
(null , username, gender, phoneNumber, remark, null, null));
}
} catch (Exception e) {
e.printStackTrace();
}
return partyMemberList;
}
}
最后是搭建Swagger接口文档
创建config文件Swagger3Config类
@Configuration
@EnableOpenApi
public class Swagger3Config {
@Value("${swagger.enable: true}")
private boolean swaggerEnable;
private String version = "1.0";
@Bean
public Docket defaultApi() {
return new Docket(DocumentationType.OAS_30)
.groupName("admin")
.apiInfo(defaultApiInfo())
.enable(swaggerEnable)
// .securitySchemes(Arrays.asList(tokenScheme()))
// .securityContexts(Arrays.asList(tokenContext()))
.select()
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
.paths(PathSelectors.any())
.build();
}
private ApiInfo defaultApiInfo() {
return new ApiInfoBuilder()
.title("新秀社区Web接口文档")
.description("新秀社区接口文档")
//服务条款网址
.version(version)
.build();
}
// private HttpAuthenticationScheme tokenScheme() {
// return HttpAuthenticationScheme.JWT_BEARER_BUILDER.name("Authorization").build();
// }
private SecurityContext tokenContext() {
return SecurityContext.builder()
.securityReferences(Arrays.asList(SecurityReference.builder()
.scopes(new AuthorizationScope[0])
.reference("Authorization")
.build()))
.operationSelector(o -> o.requestMappingPattern().matches("/.*"))
.build();
}
}
结果