<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>1.1.1</version>
</dependency> <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
</dependency> <!-- jdbc -->
<dependency>
<groupId>commons-dbutils</groupId>
<artifactId>commons-dbutils</artifactId>
<version>1.7</version>
</dependency> <dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency> <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.40</version>
</dependency> </dependencies>

工具类

 package cn.tele.demo;

 import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource; /**
*
*@author Tele
*
*/ public class JdbcUtils {
private static ComboPooledDataSource dataSource = new ComboPooledDataSource(); public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
} public static DataSource getDS() {
return dataSource;
} // 关闭数据库连接
public static void close(ResultSet rs, Statement stat, Connection conn) {
try {
if (rs != null)
rs.close();
if (stat != null)
stat.close();
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
} } }

实体类(模型)

 package cn.tele.demo;

 import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.metadata.BaseRowModel; /**
*
*@author Tele
*
*/ public class Student extends BaseRowModel{
@ExcelProperty(value="学号",index=0)
private Integer id; @ExcelProperty(value= {"姓名","name","xxx","xxx"},index=1)
private String name; @ExcelProperty(value="指导老师",index=2)
private String teacher; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getTeacher() {
return teacher;
} public void setTeacher(String teacher) {
this.teacher = teacher;
} @Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", teacher=" + teacher + "]";
}
}

监听器

 package cn.tele.demo;

 import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List; import org.apache.commons.dbutils.QueryRunner; import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener; /**
*
*@author Tele
*
*/ public class ExcelListener extends AnalysisEventListener<Student>{ //自定义用于暂时存储data。
//可以通过实例获取该值
private List<Student> datas = new ArrayList<Student>(); //每解析一行调用一次invoke方法
public void invoke(Student object, AnalysisContext context) {
System.out.println("当前行:"+context.getCurrentRowNum());
System.out.println(object);
datas.add(object);//数据存储到list,供批量处理,或后续自己业务逻辑处理。
doSomething(datas);//根据自己业务做处理
} private void doSomething(List<Student> list) { } //解析结束后自动调用
public void doAfterAllAnalysed(AnalysisContext context) {
// datas.clear();//解析结束销毁不用的资源
//1、入库调用接口
QueryRunner runner = new QueryRunner(JdbcUtils.getDS());
String sql = "insert into student values(?,?,?)";
for(Student student:datas) {
try {
runner.update(sql, new Object[] {student.getId(),student.getName(),student.getTeacher()});
} catch (SQLException e) {
e.printStackTrace();
}
} System.out.println("数据更新完成");
try {
JdbcUtils.close(null,null,JdbcUtils.getConnection());
} catch (SQLException e) {
e.printStackTrace();
} }
public List<Student> getDatas() {
return datas;
}
public void setDatas(List<Student> datas) {
this.datas = datas;
} }

Demo

 package cn.tele.demo;

 import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.SQLException;
import java.util.List; import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.junit.Test; import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.metadata.Sheet;
import com.alibaba.excel.support.ExcelTypeEnum; /**
* 读取Excel
*
* @author Tele
*
*/ public class Demo { /**
* 读取excel并插入mysql中 sheet第一个参数为sheetNo代表sheet的编号,第二个参数表示从第几行开始读,最小是1, new
* Sheet(1,0,Student.class)发现无输出结果
*
* @throws FileNotFoundException
*/
@SuppressWarnings("deprecation")
@Test
public void readExcel() throws FileNotFoundException {
InputStream inputStream = new FileInputStream("d:/excelTest/test.xlsx");
try {
// 解析每行结果在listener中处理
ExcelListener listener = new ExcelListener(); ExcelReader excelReader = new ExcelReader(inputStream, ExcelTypeEnum.XLSX, null, listener);
excelReader.read(new Sheet(1, 1, Student.class));
} catch (Exception e) { } finally {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} /**
* 查询测试
*/
@Test
public void queryByGroup() {
QueryRunner runner = new QueryRunner(JdbcUtils.getDS());
String sql = "SELECT * from student group by teacher,id";
try {
List<Student> query = runner.query(sql, new BeanListHandler<Student>(Student.class));
for (Student student : query) {
System.out.println(student.getName() + "----" + student.getTeacher());
} } catch (SQLException e) {
e.printStackTrace();
}
} /**
* 将查询结果写出到excel中 在写excel的过程中,含有模型的写入,对于sheet的第二个参数是忽略的,全部从左侧第一行进行读写
*/
@Test
public void writeExcel() {
try {
OutputStream os = new FileOutputStream(new File("d:/excelTest/new.xlsx"));
ExcelWriter writer = new ExcelWriter(os, ExcelTypeEnum.XLSX, true); // 2代表sheetNo,不可以重复,如果两个sheet的sheetNo相同则输出时只会有一个sheet
Sheet sheet1 = new Sheet(1, 5, Student.class);
sheet1.setSheetName("第一个sheet"); Sheet sheet2 = new Sheet(2, 1, Student.class);
sheet2.setSheetName("第二个sheet"); QueryRunner runner = new QueryRunner(JdbcUtils.getDS());
String sql = "SELECT * from student group by teacher,id"; List<Student> result = runner.query(sql, new BeanListHandler<Student>(Student.class));
writer.write(result, sheet1);
// writer.write(result,sheet2); writer.finish();
System.out.println("数据已写出");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} } }

easyexcel 读写测试的更多相关文章

  1. MIG IP控制DDR3读写测试

    本文设计思想采用明德扬至简设计法.在高速信号处理场合下,很短时间内就要缓存大量的数据,这时片内存储资源已经远远不够了.DDR SDRAM因其极高的性价比几乎是每一款中高档FPGA开发板的首选外部存储芯 ...

  2. 回看《例说FPGA》---DDR2控制器集成与读写测试

    回看<例说FPGA> ---DDR2控制器集成与读写测试 1.DDR2 IP核的配置 需要弄清楚的选项主要有: PLL reference clock frequency Memory c ...

  3. 第36章 SDIO—SD卡读写测试

    第36章     SDIO—SD卡读写测试 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/f ...

  4. 第36章 SDIO—SD卡读写测试—零死角玩转STM32-F429系列

    第36章     SDIO—SD卡读写测试 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/f ...

  5. 【Linux】磁盘读写 测试

    一.如何查看当前磁盘的IO使用情况 使用命令:iotop Total DISK READ: 3.89 K/s | Total DISK WRITE: 0.00 B/s TID PRIO USER DI ...

  6. 属性文件读写测试 PropertiesFileTest

    属性文件对于程序的拓展提供了很大的方便,但是什么该怎么去读写,怎么样读写才会最优呢?这里我做了一个简单的测试, 一般而言主要的有三种配置文件,*.ini,*.properties,*.xml,如果有兴 ...

  7. Redis集群模式下的redis-py-cluster方式读写测试

    与MySQL主从复制,从节点可以分担部分读压力不一样,甚至可以增加slave或者slave的slave来分担读压力,Redis集群中的从节点,默认是不分担读请求的,从节点只作为主节点的备份,仅负责故障 ...

  8. 朗科32G TF卡的读写测试

    卡是这样的, 下面是实际测试的结果. 容量测试 SKS的USB2外置读卡器, X240内置读卡器加上SD卡套    UNITEK的USB3.0读卡器, 经过UNITEK的USB3.0 HUB 看来读4 ...

  9. Linux dd工具磁盘读写测试分析

    话说,Linux 自带的dd工具测试硬盘读写速度只能提供一个大概的测试结果,而且是连续IO 而不是随机IO ,理论上文件规模越大,测试结果越准确.理论上bs越大,所测得性能越高. 上句来自网上,是不是 ...

随机推荐

  1. 基于zookeeper实现的分布式锁

    基于zookeeper实现的分布式锁 2011-01-27 • 技术 • 7 条评论 • jiacheo •14,941 阅读 A distributed lock base on zookeeper ...

  2. 洛谷——P2515 [HAOI2010]软件安装

    https://www.luogu.org/problem/show?pid=2515#sub 题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中 ...

  3. OC内存管理总结,清晰明了!

    <span style="font-size:18px;">OC内存管理 一.基本原理 (一)为什么要进行内存管理. 由于移动设备的内存极其有限.所以每一个APP所占的 ...

  4. 魅族MX5和努比亚布拉格手机參数对照

    想买个Android手机锁定魅族MX5和努比亚布拉格.两个官网翻来翻去的非常难取舍,自己列了一个表对比了一下參数,本人喜欢薄一点的手机.有feel.參数对比表例如以下: 手机 魅族MX5 努比亚布拉格 ...

  5. socket长连接的维持

    长连接的维持,是要客户端程序,定时向服务端程序,发送一个维持连接包的.如果,长时间未发送维持连接包,服务端程序将断开连接. 客户端:通过持有Client对象,可以随时(使用sendObject方法)发 ...

  6. 网络IO

    1.前言 在网络编程中,阻塞.非阻塞.同步.异步经常被提到.unix网络编程第一卷第六章专门讨论五种不同的IO模型,Stevens讲的非常详细,我记得去年看第一遍时候,似懂非懂,没有深入理解.网上有详 ...

  7. Oracle10g中阻塞锁查询更简单

    http://blog.itpub.net/195110/viewspace-677572/ http://blog.sina.com.cn/s/blog_636415010100khcl.html

  8. [React Intl] Install and Configure the Entry Point of react-intl

    We’ll install react-intl, then add it to the mounting point of our React app. Then, we’ll use react- ...

  9. amazeui学习笔记--js插件(UI增强2)--按钮交互Button

    amazeui学习笔记--js插件(UI增强2)--按钮交互Button 一.总结 1.按钮loading状态: <button type="button" class=&q ...

  10. [Angular] Angular Global Keyboard Handling With EventManager

    If we want to add global event handler, we can use 'EventManager' from '@angular/platform-broswer'. ...