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);

四. 总结

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java使用POI库可以实现对Excel文件的读取操作。具体的步骤如下: 1. 引用POI库。在Java项目中引入POI相关的jar包。 2. 创建文件输入流。使用FileInputStream类创建一个输入流对象,并指定要读取的Excel文件路径。 3. 创建工作簿对象。使用HSSFWorkbook类创建一个工作簿对象,将输入流作为参数传入。 4. 获取工作表。使用getSheetAt方法获取指定的工作表,可以通过工作表的索引或名称进行获取。 5. 获取行。使用getRow方法获取指定行的对象,行号作为参数传递给该方法。 6. 获取单元格。使用getCell方法获取指定单元格的对象,行号和列号作为参数传递给该方法。 7. 获取单元格的值。使用getStringCellValue方法获取单元格的值,将其赋给一个字符串变量。 8. 输出结果。使用System.out.println方法将获取到的数据打印出来。 需要注意的是,在读取Excel文件时可能会出现FileNotFoundException和IOException异常,需要进行异常处理。同时,在读取完成后,需要关闭输入流。 下面是一个示例代码,用于演示Java使用POI读取Excel文件: ```java import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; public class ExcelReader { public static void poiRead() { FileInputStream xlsStream = null; try { // 创建文件输入流 xlsStream = new FileInputStream(new File("C:\\Users\\itour\\Desktop\\poiTest.xls")); // 创建工作簿对象 HSSFWorkbook hssfWorkbook = new HSSFWorkbook(xlsStream); // 获取工作表 HSSFSheet sheetAt = hssfWorkbook.getSheetAt(0); // 获取行 HSSFRow row = sheetAt.getRow(0); // 获取单元格 HSSFCell cell = row.getCell(0); // 获取单元格的值 String cellValue = cell.getStringCellValue(); System.out.println("获取到的数据是:" + cellValue); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (xlsStream != null) { try { xlsStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } } ``` 以上代码演示了如何使用POI库读取Excel文件中第一个工作表的第一个单元格的值。你可以根据自己的需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值