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

前言:

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

Microsoft Office:是由微软公司开发的一套办公软件套装。常用组件有Word、Excel、PowerPoint等。

POI也用于操作Excel(电子表格)

一个excel文件就是一个工作簿Workbook

一个工作簿中可创建多张工作表Sheet

一个工作表中包含多个单元格Cell(单元格由列[Column]行[Row]组成)

由图观之:

poi技术实现数据的导入与导出_第1张图片

目录:

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包

poi技术实现数据的导入与导出_第2张图片

 2、在MySQL数据库中创建报告表(report),添加数据

poi技术实现数据的导入与导出_第3张图片​​​​​​​

3、项目结构

poi技术实现数据的导入与导出_第4张图片


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

效果图: 

数据库导出的信息

poi技术实现数据的导入与导出_第5张图片

导入到数据库的信息

poi技术实现数据的导入与导出_第6张图片​​​​​​​

你可能感兴趣的:(poi,microsoft)