Microsoft Office:是由微软公司开发的一套办公软件套装。常用组件有Word、Excel、PowerPoint等。
POI也用于操作Excel(电子表格)
一个excel文件就是一个工作簿Workbook
一个工作簿中可创建多张工作表Sheet
一个工作表中包含多个单元格Cell(单元格由列[Column]和行[Row]组成)
由图观之:
1、实现工具+技术
2、主要对象介绍
3、操作步骤
4、代码展示
1、实现工具+技术
实现工具:eclipse(写代码)、Navicat(创建数据库和表)
技术:poi技术、IO流技术
2、poi中主要对象所对应的excel对象
poi对象 | excel对象 |
SXSSFWorkbook/ HSSFWorkbook | excel 工作簿workbook |
HSSFSheet / Sheet | excel 工作表sheet |
HSSFRow / Row | excel 行 row |
Cell | excel 单元格 |
POI核心类
1.工作簿(是创建或维护Excel工作簿的所有类的超接口)
HSSFWorkbook : 这个类有读取和.xls 格式和写入Microsoft Excel文件的方法。
XSSFWorkbook : 这个类有读写Microsoft Excel和OpenOffice的XML文件的格式.xls或.xlsx的方法。
3、操作步骤
1、在eclipse中创建项目,导入poi.jar包
2、在MySQL数据库中创建报告表(report),添加数据
3、项目结构
4、代码展示:
DBHelper.java
package com.china.report.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class DBHelper {
private static String driver="com.mysql.cj.jdbc.Driver";
private static String url="jdbc:mysql://localhost:3306/lxy?useUnicode=true&characterEncoding=UTF-8";
//注册静态驱动类
static {
try {
Class.forName(driver);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 连接数据库
* @return
*/
public static Connection getCon() {
//声明Connection对象
Connection con = null;
try {
con = DriverManager.getConnection(url, "root", "1234");
} catch (Exception e) {
e.printStackTrace();
}
return con;
}
/**
* 关闭连接
* @param con Connection对象
* @param ps PreparedStatement对象
* @param rs ResultSet对象
*/
public static void closeDB(Connection con,PreparedStatement ps,ResultSet rs) {
try {
//判断con、ps、rs不为空
if(con!=null) {
con.close();
}
if(ps!=null) {
ps.close();
}
if(rs!=null) {
rs.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
useUnicode=true&characterEncoding=UTF-8 作用是:指定字符的编码、解码格式。
数据库在存放项目数据的时候会先用UTF-8格式将数据解码成字节码,然后再将解码后的字节码重新使用GBK编码存放到数据库中。
ReportDao.java
package com.china.report.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import com.china.report.entity.Report;
import com.china.report.util.DBHelper;
public class ReportDao {
private Connection con = null;
private PreparedStatement ps = null;
private ResultSet rs = null;
/**
* 模糊查询
* @param col 字段名
* @param str 关键字
* @return
*/
public ArrayList LikeId(String col,String str){
//声明对象
ArrayList rlist = new ArrayList<>();
try {
//连接数据库
con = DBHelper.getCon();
ps = con.prepareStatement("select * from report where "+col+" like '%"+str+"%' ");
//执行sql语句
rs = ps.executeQuery();
//处理结果集
while(rs.next()) {
//实例化对象
Report re = new Report(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getString(5), rs.getString(6));
//将对象添加到集合中
rlist.add(re);
}
} catch (Exception e) {
//异常信息
e.printStackTrace();
}finally {
//关闭连接
DBHelper.closeDB(con, ps, rs);
}
//返回集合
return rlist;
}
/**
* 查询所有
* @return
*/
public ArrayList getAll(){
//声明对象
ArrayList rlist = new ArrayList<>();
try {
//连接数据库
con = DBHelper.getCon();
ps = con.prepareStatement("select * from report");
//执行sql语句
rs = ps.executeQuery();
//处理结果集
while(rs.next()) {
//实例化对象
Report re = new Report(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getString(5), rs.getString(6));
//将对象添加到集合中
rlist.add(re);
}
} catch (Exception e) {
//异常信息
e.printStackTrace();
}finally {
//关闭连接
DBHelper.closeDB(con, ps, rs);
}
//返回集合
return rlist;
}
/**
* 查询单个
* @param rid 要查询的编号
* @return
*/
public Report getId(int rid) {
Report r = null;
try {
//连接数据库
con = DBHelper.getCon();
ps = con.prepareStatement("select * from report where rid="+rid);
//执行sql语句
rs = ps.executeQuery();
if(rs.next()) {
r = new Report(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getString(5), rs.getString(6));
}
} catch (Exception e) {
e.printStackTrace();
}finally {
DBHelper.closeDB(con, ps, rs);
}
return r;
}
/**
* 添加
* @param r 要添加的对象
* @return
*/
public int add(Report r) {
int i = 0;
try {
//连接数据库
con = DBHelper.getCon();
ps = con.prepareStatement("insert into report(rname,rsex,rjzym,result,raddress) values(?,?,?,?,?)");
//给占位符赋值
ps.setString(1, r.getRname());
ps.setString(2, r.getRsex());
ps.setString(3, r.getRjzym());
ps.setString(4, r.getResult());
ps.setString(5, r.getRaddress());
//执行sql语
i = ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally {
DBHelper.closeDB(con, ps, null);
}
//返回受影响行数
return i;
}
//测试
public static void main(String[] args) {
ReportDao rd = new ReportDao();
System.out.println(rd.getAll());
}
}
Import.java [导入]
package com.china.report.main;
import java.io.File;
import java.io.FileInputStream;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import com.china.report.dao.ReportDao;
import com.china.report.entity.Report;
/**
* 导入
* @author gss
*
*/
public class Import {
public static void main(String[] args) throws Exception {
//拿到对应xls文件
File file = new File("E://Report//核酸检测报告.xls");
//转换成文件流
FileInputStream fis = new FileInputStream(file);
//根据路径获取这个操作xls的实例 创建一个工作簿HSSFWorkbook
HSSFWorkbook wb = new HSSFWorkbook(fis);
//根据页面index 获取sheet页
HSSFSheet sheet = wb.getSheetAt(0);
//声明行数据,对应exel的行
HSSFRow row = null;
//实例化一个检测报告对象dao
ReportDao rd = new ReportDao();
//循环sesheet页中数据从第二行开始,第一行是标题
//System.out.println(sheet.getPhysicalNumberOfRows());
//getPhysicalNumberOfRows()获取的是物理行数,也就是不包括那些空行(隔行)的情况
for(int i = 1;i
Export.java [导出]
package com.china.report.main;
import java.io.FileOutputStream;
import java.util.ArrayList;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import com.china.report.dao.ReportDao;
import com.china.report.entity.Report;
public class Export {
public static void main(String[] args) {
//实例化一个dao类对象
ReportDao rd = new ReportDao();
//查询所有
ArrayList rlist = rd.getAll();
//标题
String[] title = {"编号","姓名","性别","接种疫苗","结果","地址"};
//创建一个SXSSFWorkbook工作簿 读取.xls 格式
//自定义内存中数据的数量
SXSSFWorkbook wb = new SXSSFWorkbook(10);
//将SXSSFWorkbook工作簿添加到表
Sheet sheet = wb.createSheet();
//创建行, 0:代表第一个单元格
Row row = sheet.createRow(0);
//给单元格设置样式,添加到工作簿的样式表中
CellStyle cellStyle = wb.createCellStyle();
//创建一个新字体,并添加到工作簿的字体表中
Font font = wb.createFont();
//设置字体大小
font.setFontHeightInPoints((short) 12);
//设置字体加粗
font.setBold(true);
//给字体设置样式
cellStyle.setFont(font);
//设置单元格背景颜色
cellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
//设置单元格填充样式(使用纯色背景颜色填充)
cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
//填充表头数据
for(int i = 0;i
效果图:
数据库导出的信息
导入到数据库的信息