poi技术实现数据的导入与导出

前言:

POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。

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/ HSSFWorkbookexcel 工作簿workbook
HSSFSheet / Sheetexcel 工作表sheet
HSSFRow / Rowexcel 行 row
Cellexcel 单元格

 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<Report> LikeId(String col,String str){
		//声明对象
		ArrayList<Report> 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<Report> getAll(){
		//声明对象
		ArrayList<Report> 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<sheet.getPhysicalNumberOfRows();i++) {
			//获取每一行的数据
			row = sheet.getRow(i);
			Report rep = new Report();
			//从第一个单元格中获取 姓名的值
			rep.setRname(row.getCell(0).getStringCellValue());
			//从第二个单元格中获取 性别的值
			rep.setRsex(row.getCell(1).getStringCellValue());
			//从第三个单元格中获取 接种疫苗的值
			rep.setRjzym(row.getCell(2).getStringCellValue());
			//从第四个单元格中获取 结果的值
			rep.setResult(row.getCell(3).getStringCellValue());
			//从第五个单元格中获取 地址的值
			rep.setRaddress(row.getCell(4).getStringCellValue());
			//调用添加方法
			rd.add(rep);
		}
		System.out.println("导入成功");
	}
}

 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<Report> 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<title.length;i++) {
			//创建新单元格
			Cell cell = row.createCell(i);
			//放入 标题单元格的数值
			cell.setCellValue(title[i]);
			//为单元格设置样式
			cell.setCellStyle(cellStyle);
			//设置列的宽度
			sheet.setColumnWidth(i, 200*50);
		}
		//填充数据库表数据
		for(int j = 0;j<rlist.size();j++) {
			//创建行
			Row r = sheet.createRow(j+1);
			Report rep = rlist.get(j);
			
			//获取 编号的数值(第一个单元格)
			Cell cell = r.createCell(0);
			cell.setCellValue(rep.getRid());
			//获取 名字的数值
			Cell cell2 = r.createCell(1);
			cell2.setCellValue(rep.getRname());
			//获取 性别的数值
			Cell cell3 = r.createCell(2);
			cell3.setCellValue(rep.getRsex());
			//获取 接种疫苗的数值
			Cell cell4 = r.createCell(3);
			cell4.setCellValue(rep.getRjzym());
			//获取 结果的数值
			Cell cell5 = r.createCell(4);
			cell5.setCellValue(rep.getResult());
			//获取 地址的数值
			Cell cell6 = r.createCell(5);
			cell6.setCellValue(rep.getRaddress());
		}
		//设置输出路径
		String filename = "E://Report//核酸检测信息.xls";
		try {
			// 输出到硬盘,所以要用到IO流,输出到fileName指定的路径上
			FileOutputStream fos = new FileOutputStream(filename);
			wb.write(fos);//写出
			wb.close();//关闭
			System.out.println("导出成功");
		} catch (Exception e) {
			//异常信息
			e.printStackTrace();
		}
	}
}

效果图: 

数据库导出的信息

导入到数据库的信息

​​​​​​​

  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值