目录结构
- 一. Poi介绍
- 1. 简介
- 2. 使用前提
- 3. 优劣势
- 4. Poi包结构
- 二. poi入门案例
- 1.从 Excel 文件读取数据
- 2.向 Excel 文件写入数据
- 三. 实战训练
- 0.环境准备
- 1. 读取excel 数据到数据库
- 2. 将数据库中文件写入到excel
- 3. 增加样式
- 四. 总结
一. Poi介绍
1. 简介
- 是由 Apache公司提供的。
- Java编写的免费开源的跨平台Java API
- 提供API给Java程序对Micrisoft Office格式档案读和写的功能
2. 使用前提
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
3. 优劣势
- JXL:消耗小,图片和图形支持有限
- POI: 功能更加完善
4. Poi包结构
HSSF —— 读写Microsoft Excel XLS
XSSF —— 读写Microsoft Excel OOXML XLSX
HWPF —— 读写Microsoft Word DOC
HSLF —— 提供读写Microsoft PowerPoint
二. poi入门案例
1.从 Excel 文件读取数据
步骤:
- 创建工作簿
- 获取工作簿
- 1.3 遍历工作表获得行对象
- 1.4 遍历行对象获取单元格对象
- 1.5 获得单元格中的值
- 新建Maven项目javapoi,并在pom.xml文件中添加上文提到的依赖。
- 本地准备要读取的表格文件hello.xlsx
- 编写代码
package com.lzcu.read;
import org.apache.poi.ss.usermodel.Cell;
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.IOException;
public class Demo1 {
public static void main(String[] args) throws IOException {
//1.获取工作簿
XSSFWorkbook workbook = new XSSFWorkbook("C:\\Users\\admin\\Desktop\\开发\\javapoi\\hello.xlsx");
//2.获取工作表
XSSFSheet sheet = workbook.getSheetAt(0);
//3.获取数据
/*
//3.1 获取行
for (Row row : sheet) {
//3。2.获取列
for (Cell cell : row) {
//获取单元格内容
String value = cell.getStringCellValue();
System.out.println(value);
}
}
*/
//开始索引0 结束索引
for (int i = 0; i <= sheet.getLastRowNum(); i++) {
XSSFRow row = sheet.getRow(i);
if (row!=null){
for (int j = 0; j <= row.getLastCellNum(); j++) {
XSSFCell cell = row.getCell(j);
if (cell!=null){
String stringCellValue = cell.getStringCellValue();
System.out.println(stringCellValue);
}
}
}
}
//4.释放资源
workbook.close();
}
}
2.向 Excel 文件写入数据
步骤:
- 创建一个excel文件
- 创建一个工作表
- 创建行
- 创建单元格赋值
- 通过输出流将对象下载到磁盘
package com.lzcu.write;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class demo2 {
public static void main(String[] args) throws IOException {
//1.创建工作簿
XSSFWorkbook workbook = new XSSFWorkbook();
//2.创建工作表
XSSFSheet sheet = workbook.createSheet("工作表1");
//3.创建行
XSSFRow row = sheet.createRow(0);
//创建单元格
row.createCell(0).setCellValue("中国");
row.createCell(1).setCellValue("甘肃省");
row.createCell(2).setCellValue("兰州市");
row.createCell(3).setCellValue("安宁区");
row.createCell(4).setCellValue("培黎广场");
row.createCell(5).setCellValue("欢迎您!");
XSSFRow row1 = sheet.createRow(1);
//创建单元格
row1.createCell(0).setCellValue("中国");
row1.createCell(1).setCellValue("甘肃省");
row1.createCell(2).setCellValue("兰州市");
row1.createCell(3).setCellValue("安宁区");
row1.createCell(4).setCellValue("培黎广场");
row1.createCell(5).setCellValue("欢迎您!");
//输出流
FileOutputStream outputStream = new FileOutputStream("C:\\Users\\admin\\Desktop\\开发\\javapoi\\write.xlsx");
workbook.write(outputStream);
outputStream.flush();
//释放资源
outputStream.close();
workbook.close();
System.out.println("数据写入成功!");
}
}
验证结果:
三. 实战训练
0.环境准备
- 项目结构预览
- 创建数据库及表
CREATE DATABASE javapoi;
USE javapoi;
CREATE TABLE `user`(
`id` VARCHAR(14) NOT NULL PRIMARY KEY,
`name` VARCHAR(30) DEFAULT NULL,
`password` VARCHAR(30) DEFAULT NULL
)ENGINE=INNODB DEFAULT CHARSET=utf8;
- 在pom.xml文件中加入以下依赖
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.21</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
</dependency>
- 创建实体类User
package com.lzcu.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private String id;
private String name;
private String password;
}
- 创建dao及其实现类
- 创建UserDao接口:
package com.lzcu.dao;
public interface UserDao {
}
- 创建UserDaoImpl实现类
package com.lzcu.dao.impl;
import com.lzcu.dao.UserDao;
public class UserDaoImpl implements UserDao {
}
- 创建Service层及其实现类
- 创建UserService接口
package com.lzcu.service;
public interface UserService {
}
- 创建UserServiceImpl实现类
package com.lzcu.service.impl;
import com.lzcu.service.UserService;
public class UserServiceImpl implements UserService {
}
- 创建JDBCUtils工具类JDBCUtils
package com.lzcu.utils;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;
/**
* Druid连接池的工具类
*
* 1. 定义一个类 JDBCUtils
* 2. 提供静态代码块加载配置文件,初始化连接池对象
* 3. 提供方法
* (1). 获取连接方法:通过数据库连接池获取连接
* (2). 释放资源
* (3). 获取连接池的方法
*/
public class JDBCUtils {
// 1.定义成员变量DataSource
private static DataSource ds;
static {
try {
// 2.加载配置文件
Properties pro = new Properties();
pro.load( JDBCUtils.class.getClassLoader().getResourceAsStream( "druid.properties" ) );
// 3.获取DataSource
ds= DruidDataSourceFactory.createDataSource( pro );
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取连接池方法
*/
public static DataSource getDataSource(){
return ds;
}
/**
* 获取连接
*/
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
/**
* 释放资源
*/
public static void close(Statement stat, Connection conn){
close(null,stat,conn);
}
public static void close(ResultSet rs, Statement stat, Connection conn) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stat != null) {
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
- 在resource目录下创建连接数据库的配置文件druid.properties
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///javapoi
username=root
password=wsl123
# 初始化连接数量
initialSize=5
maxActive=10
maxWait=3000
- 创建show.java,模拟用户和后台交互
package com.lzcu.web;
import java.util.Scanner;
public class show {
public static void main(String[] args) {
//通过键盘录入scanner来模拟用户和后台交互
Scanner sc = new Scanner(System.in);
System.out.println("请输入您要选择的功能:" +
"1:导入 2:导出");
int i = sc.nextInt();
if (i==1){
/*导入*/
//1.1 读取excel表中的数据
//1.2 将数据写入到数据库中
}else if (i==2){
/*导出*/
//2.1 读取数据库中的数据
//2.2 将数据写入到excel表格中
}else {
System.out.println("输入有误,请重新输入!");
}
}
}
- 在本地创建准备要录入数据库的文件user.xlsx
1. 读取excel 数据到数据库
- 完善show.java
package com.lzcu.web;
import com.lzcu.pojo.User;
import com.lzcu.service.UserService;
import com.lzcu.service.impl.UserServiceImpl;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class show {
public static void main(String[] args) throws IOException {
//通过键盘录入scanner来模拟用户和后台交互
Scanner sc = new Scanner(System.in);
System.out.println("请输入您要选择的功能:" +
"1:导入 2:导出");
int i = sc.nextInt();
if (i==1){
/*导入*/
//1.1 读取excel表中的数据
System.out.println("请输入您要读取的文件位置(不包含空格)");
String path = sc.next();
List<User> users = read(path);
System.out.println(users);
//1.2 将数据写入到数据库中
UserService userService = new UserServiceImpl();
userService.save(users);
System.out.println("数据已存入数据库中!");
}else if (i==2){
/*导出*/
//2.1 读取数据库中的数据
//2.2 将数据写入到excel表格中
}else {
System.out.println("输入有误,请重新输入!");
}
}
public static List<User> read(String path) throws IOException {
List<User> userList = new ArrayList<User>();
//1.获取工作簿
XSSFWorkbook workbook = new XSSFWorkbook(path);
//2.获取工作表
XSSFSheet sheet = workbook.getSheetAt(0);
for (int i = 1; i < sheet.getLastRowNum(); i++) {
XSSFRow row = sheet.getRow(i);
if (row!=null){
List<String> list = new ArrayList<String>();
for (Cell cell : row) {
if (cell!=null){
cell.setCellType(Cell.CELL_TYPE_STRING);
String value = cell.getStringCellValue(); //读取数据
if (value!=null&&!value.equals("")){
list.add(value);
}
}
}
if (list.size()>0){
User user = new User(list.get(0), list.get(1), list.get(2));
userList.add(user);
}
}
}
return userList;
}
}
- 在UserService接口中添加方法
void save(List<User> users);
- 在UserServiceImpl中重写方法
package com.lzcu.service.impl;
import com.lzcu.dao.UserDao;
import com.lzcu.dao.impl.UserDaoImpl;
import com.lzcu.pojo.User;
import com.lzcu.service.UserService;
import java.util.List;
public class UserServiceImpl implements UserService {
private UserDao userDao = new UserDaoImpl();
public void save(List<User> users) {
for (User user : users) {
userDao.save(user);
}
}
}
- 在UserDao接口中添加方法
void save(User user);
- 在UserDaoImpl中重写方法
package com.lzcu.dao.impl;
import com.lzcu.dao.UserDao;
import com.lzcu.pojo.User;
import com.lzcu.utils.JDBCUtils;
import org.springframework.jdbc.core.JdbcTemplate;
public class UserDaoImpl implements UserDao {
JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
public void save(User user) {
String sql = "insert into user values(?,?,?)";
jdbcTemplate.update(sql,user.getId(),user.getName(),user.getPassword());
}
}
注意:我们在此用了JdbcTemplate模板,所以在使用前应在pom.xml文件中添加相关依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
- 运行测试:
- 在mysql数据库中实际查询验证
2. 将数据库中文件写入到excel
- 完善show.java
package com.lzcu.web;
import com.lzcu.pojo.User;
import com.lzcu.service.UserService;
import com.lzcu.service.impl.UserServiceImpl;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class show {
public static void main(String[] args) throws IOException {
UserService userService = new UserServiceImpl();
//通过键盘录入scanner来模拟用户和后台交互
Scanner sc = new Scanner(System.in);
System.out.println("请输入您要选择的功能:" +
"1:导入 2:导出");
int i = sc.nextInt();
if (i==1){
/*导入*/
//1.1 读取excel表中的数据
System.out.println("请输入您要读取的文件位置(不包含空格)");
String path = sc.next();
List<User> users = read(path);
System.out.println(users);
//1.2 将数据写入到数据库中
userService.save(users);
System.out.println("数据已存入数据库中!");
}else if (i==2){
/*导出*/
//2.1 读取数据库中的数据
List<User> userList = userService.findAll();
System.out.println(userList);
//2.2 将数据写入到excel表格中
System.out.println("请输入要写入的文件位置:");
String path = sc.next();
write(userList,path);
System.out.println("写入成功!");
}else {
System.out.println("输入有误,请重新输入!");
}
}
public static void write(List<User> userList,String path) throws IOException {
//1.创建一个工作簿
XSSFWorkbook workbook = new XSSFWorkbook();
//2.创建工作表
XSSFSheet sheet = workbook.createSheet("用户表");
//3.创建行
XSSFRow row = sheet.createRow(0);
row.createCell(0).setCellValue("学号");
row.createCell(1).setCellValue("姓名");
row.createCell(2).setCellValue("密码");
for (int i = 0; i < userList.size() ; i++) {
XSSFRow row1 = sheet.createRow(i+1);
row1.createCell(0).setCellValue(userList.get(i).getId());
row1.createCell(1).setCellValue(userList.get(i).getName());
row1.createCell(2).setCellValue(userList.get(i).getPassword());
}
FileOutputStream fileOutputStream = new FileOutputStream(path);
workbook.write(fileOutputStream);
fileOutputStream.flush();
fileOutputStream.close();
workbook.close();
}
public static List<User> read(String path) throws IOException {
List<User> userList = new ArrayList<User>();
//1.获取工作簿
XSSFWorkbook workbook = new XSSFWorkbook(path);
//2.获取工作表
XSSFSheet sheet = workbook.getSheetAt(0);
for (int i = 1; i < sheet.getLastRowNum(); i++) {
XSSFRow row = sheet.getRow(i);
if (row!=null){
List<String> list = new ArrayList<String>();
for (Cell cell : row) {
if (cell!=null){
cell.setCellType(Cell.CELL_TYPE_STRING);
String value = cell.getStringCellValue(); //读取数据
if (value!=null&&!value.equals("")){
list.add(value);
}
}
}
if (list.size()>0){
User user = new User(list.get(0), list.get(1), list.get(2));
userList.add(user);
}
}
}
return userList;
}
}
- 在UserService中添加方法
List<User> findAll();
- 在UserServiceImpl中重写此方法
package com.lzcu.service.impl;
import com.lzcu.dao.UserDao;
import com.lzcu.dao.impl.UserDaoImpl;
import com.lzcu.pojo.User;
import com.lzcu.service.UserService;
import java.util.List;
public class UserServiceImpl implements UserService {
private UserDao userDao = new UserDaoImpl();
public void save(List<User> users) {
for (User user : users) {
userDao.save(user);
}
}
public List<User> findAll() {
return userDao.findAll();
}
}
- 在UserDao接口中添加方法:
List<User> findAll();
- 在UserDaoImpl中重写此方法
package com.lzcu.dao.impl;
import com.lzcu.dao.UserDao;
import com.lzcu.pojo.User;
import com.lzcu.utils.JDBCUtils;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import java.util.List;
public class UserDaoImpl implements UserDao {
JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
public void save(User user) {
String sql = "insert into user values(?,?,?)";
jdbcTemplate.update(sql,user.getId(),user.getName(),user.getPassword());
}
public List<User> findAll() {
String sql = "select * from user";
return jdbcTemplate.query(sql,new BeanPropertyRowMapper<User>(User.class));
}
}
- 运行测试,查看结果
- 查看写入的文件
3. 增加样式
//设置单元格格式
HSSFFont titlefont = workbook.createFont();
titlefont.setFontName("黑体");
titlefont.setFontHeightInPoints((short) 20);//设置字体大小
titlefont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//粗体显示
HSSFCellStyle titleStyle = workbook.createCellStyle();
//setStyle单元格居中
titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中
titleStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
titleStyle.setFont(titlefont);
cell=row.createCell(0);
cell.setCellValue(title[0]);
cell.setCellStyle(titleStyle);