前言:
1、使用poi技术将数据库中t_student的数据读取并导出到excel中
2、创建一个新的excel文件,并添加数据通过poi方式读取excel数据文件并写入到数据库表t_student中;
一、在MySQL创建表
首先在MySQL创建学生表(t_student):
表的字段为:编号sid,姓名sname,年龄sage,性别ssex;
如图所示(表设计):编号为主键自增
二、导入jar包
导入我们需要的六个jar包:
如图所示:
三、连接MySQL数据库
连接数据的DBHelper类:
源代码如下:
package com.zking.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class DBHelper {
//MySQL数据库驱动
private static final String driver = "com.mysql.cj.jdbc.Driver";
//数据库连接地址 sys:数据库库名
private static final String url = "jdbc:mysql://localhost:3306/sys?useUnicode=true&characterEncoding=UTF-8";
/**
* 注册驱动类
*/
static {
try {
Class.forName(driver);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 连接数据库
* root 数据库用户名
* 1234 数据库密码
* @return
*/
public static Connection getCon() {
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 {
if(con!=null) {
con.close();
}
if(ps!=null) {
ps.close();
}
if(rs!=null) {
rs.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 测试
* @param args
*/
public static void main(String[] args) {
System.out.println(DBHelper.getCon());
}
}
测试代码如下图则表示连接成功:
四、实体类与dao方法
entity实体类(Student):
package com.zking.entity;
public class Student {
private Integer sid;
private String sname;
private int sage;
private String ssex;
public Student() {
super();
}
public Student(String sname, int sage, String ssex) {
super();
this.sname = sname;
this.sage = sage;
this.ssex = ssex;
}
public Student(int sid, String sname, int sage, String ssex) {
super();
this.sid = sid;
this.sname = sname;
this.sage = sage;
this.ssex = ssex;
}
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public int getSage() {
return sage;
}
public void setSage(int sage) {
this.sage = sage;
}
public String getSsex() {
return ssex;
}
public void setSsex(String ssex) {
this.ssex = ssex;
}
@Override
public String toString() {
return "Student [sid=" + sid + ", sname=" + sname + ", sage=" + sage + ", ssex=" + ssex + "]";
}
}
dao方法(StudentDao)分别有添加方法和查询所有的方法:
package com.zking.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import com.zking.entity.Student;
import com.zking.util.DBHelper;
public class StudentDao {
/**
* 添加对象
* @param stu 要添加的学生对象
* @return 成功返回1,失败返回0
*/
public int addStu(Student stu) {
int i=0;
Connection con=null;
PreparedStatement ps=null;
try {
con=DBHelper.getCon();
ps=con.prepareStatement("insert into t_student(sname,sage,ssex) values (?,?,?)");
ps.setString(1, stu.getSname());
ps.setInt(2, stu.getSage());
ps.setString(3, stu.getSsex());
i=ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally {
DBHelper.CloseDB(con, ps, null);
}
return i;
}
/**
* 查询所有
* @return 返回ArrayList集合,失败返回null
*/
public ArrayList<Student> getByAll() {
ArrayList<Student> slist=new ArrayList<>();
Connection con=null;
PreparedStatement ps=null;
ResultSet rs=null;
try {
con=DBHelper.getCon();
ps=con.prepareStatement("select * from t_student");
rs=ps.executeQuery();
while(rs.next()) {
Student stu=new Student(rs.getInt(1), rs.getString(2), rs.getInt(3), rs.getString(4));
slist.add(stu);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
DBHelper.CloseDB(con, ps, rs);
}
return slist;
}
}
五、导出excel文件的工具类代码
原代码如下:
package com.zking.test;
import java.io.FileOutputStream;
import java.util.List;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import com.zking.dao.StudentDao;
import com.zking.entity.Student;
/**
* 数据库数据导出到xls表格
* @author zjjt
*
*/
public class Export {
public static void main(String[] args) {
//实例化dao对象
StudentDao stu=new StudentDao();
//用集合接收查询到的对象
List<Student> list=stu.getByAll();
//定义表头-第一行
String[] titles= {"编号","姓名","年龄","性别"};
//声明一个工作谱,设置长度为100行
Workbook wb=new SXSSFWorkbook(100);
//创建sheet页
Sheet sheet = wb.createSheet();
//从0开始定义每一行
Row row=sheet.createRow(0);
sheet.setColumnWidth(0, 30*256);//设置当前sheet页第一列宽度
//给单元格设置样式
CellStyle cellstyle=wb.createCellStyle();
Font font= wb.createFont();
//设置字体大小
font.setFontHeightInPoints((short)10);
// //设置字体加粗
font.setBold(true);
// //给字体设置样式
// cellstyle.setFont(font);
// //设置单元格背景颜色
// cellstyle.setFillBackgroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
// //设置单元格填充样式
// cellstyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
//for循环设置了表头,也就是名称,性别,年龄
for (int i = 0; i < titles.length; i++) {
//取到每一行的值由i控制
Cell cell= row.createCell(i);
cell.setCellValue(titles[i]);
cell.setCellStyle(cellstyle);
//设置列的宽度
sheet.setColumnWidth(i, 100*50);
}
//遍历数据集合
for (int j = 0; j < list.size(); j++) {
//for循环是从0开始的,但是0行在第一个for循环已经设置好了
Row rowDate=sheet.createRow(j+1);
//找到每一行的下标
Student stus=list.get(j);
//从第0行第一列开始赋值
Cell cell=rowDate.createCell(0);
cell.setCellValue(stus.getSid());
//第二列
Cell cell2=rowDate.createCell(1);
cell2.setCellValue(stus.getSname());
//第三列
Cell cell3=rowDate.createCell(2);
cell3.setCellValue(stus.getSage());
//第四列
Cell cell4=rowDate.createCell(3);
cell4.setCellValue(stus.getSsex());
}
//输出数据的集合
System.out.println("数据:"+list);
//定义导出文件的路径
String file="C:\\Users\\zjjt\\Desktop/导出.xls";
try {
//输出流
FileOutputStream fileoutputstream=new FileOutputStream(file);
//写出
wb.write(fileoutputstream);
//关闭
wb.close();
System.out.println("导出成功!!");
} catch (Exception e) {
//抛出异常
e.printStackTrace();
}
}
}
输出结果显示为:
六、导入到MySQL数据的工具类代码
源代码如下:
package com.zking.test;
import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import com.zking.dao.StudentDao;
import com.zking.entity.Student;
/**
* 把exel导入到数据库
* @author zjjt
*
*/
public class Import {
public static void main (String[] args) {
//创建Excel文件
// String [] title= {"编号","姓名","年龄","性别"};
File file=new File("C:\\Users\\zjjt\\Desktop/Student.xls");
// //判断文件是否存在
// if(file == null) {
// System.out.println("文件不存在!!!");
// }
try {
//文件转换成文件流形式
FileInputStream fis = new FileInputStream(file);
//获取exel操作示例
HSSFWorkbook hwb = new HSSFWorkbook(fis);
//根据页面index获取sheet页
HSSFSheet sheet=hwb.getSheetAt(0);
//封装成exel表格中获取集合方法
List<Student> slist = getStudentListByExel(sheet);
System.out.println("数据:"+slist);
//实例化dao类
StudentDao sd=new StudentDao();
//遍历集合添加进数据库
for (int i = 0; i < slist.size(); i++) {
//找到集合的每一个下标
Student stu=slist.get(i);
//调用添加方法
sd.addStu(stu);
}
System.out.println("添加数据库成功");
} catch (Exception e) {
//抛出异常
e.printStackTrace();
}
}
//封装
public static List<Student> getStudentListByExel(HSSFSheet sheet){
//实体类集合
List<Student> slist=new ArrayList<>();
HSSFRow row=null;
//获取每一行的数据
for (int i = 1; i <sheet.getPhysicalNumberOfRows() ; i++) {
//获取每一行的数据
row=sheet.getRow(i);
Student stu=new Student();
//把第一列转化为String类型
stu.setSname(row.getCell(0).getStringCellValue());
//把第二列转化为int类型
stu.setSage(Integer.valueOf((int)row.getCell(1).getNumericCellValue()));
//把第三列转化为String类型
stu.setSsex(row.getCell(2).getStringCellValue());
slist.add(stu);
}
return slist;
}
}
导入数据:
导入运行数据库结果显示(包含测试):