java使用 POI读写excel文档

在这里插入图片描述

一. 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. 优劣势

  1. JXL:消耗小,图片和图形支持有限
  2. 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 获得单元格中的值
  1. 新建Maven项目javapoi,并在pom.xml文件中添加上文提到的依赖。
    在这里插入图片描述
  2. 本地准备要读取的表格文件hello.xlsx
    在这里插入图片描述
  3. 编写代码
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.环境准备

  1. 项目结构预览
    在这里插入图片描述
  2. 创建数据库及表
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;
  1. 在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>
  1. 创建实体类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;
}

  1. 创建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 {
    
    
}

  1. 创建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 {
    
    
}

  1. 创建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();
			}
		}
	}
}

  1. 在resource目录下创建连接数据库的配置文件druid.properties
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///javapoi
username=root
password=wsl123
# 初始化连接数量
initialSize=5
maxActive=10
maxWait=3000
  1. 创建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("输入有误,请重新输入!");
		}
	}
}

  1. 在本地创建准备要录入数据库的文件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);

四. 总结

猜你喜欢

转载自blog.csdn.net/qq_37955704/article/details/104886930