博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java通过poi包导入Excel
阅读量:5224 次
发布时间:2019-06-14

本文共 4967 字,大约阅读时间需要 16 分钟。

  使用Apache POI包导入Excel时是需要根据行和列取到对应的值,因此取值时需要知道该列所对应的值应存放到对象的那个字段中去,表格出现变动就会变的比较麻烦,因此此处使用自定义注解的方式,在对象中标明该属性所对应的表头,从程序中遍历表头找到与之对应的单元格,方便数据的导入。

所需的jar包:(用了一下工具类,因此多导入了两个包)

org.apache.poi
poi
3.17
org.apache.poi
poi-ooxml
3.17
commons-beanutils
commons-beanutils
1.9.2
org.apache.commons
commons-lang3
3.2.1

  自定义注解:

@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.FIELD ,ElementType.TYPE})public @interface ExcelIn {    /**     * 导入sheet名称     * @return     */    String sheetName() default "";    /**     * 字段对应的表头名称     * @return     */    String title() default "";}

  接收导入数据的实体:

@ExcelIn(sheetName = "用户信息")public class UserInfo {    private String id;    @ExcelIn(title = "姓名")    private String name;    @ExcelIn(title = "年龄")    private Integer age;    @ExcelIn(title = "出生日期")    private Date birthday;}

  导入Excel数据:

public class ExcelReader
{ private static BeanUtilsBean beanUtilsBean = new BeanUtilsBean(); static { beanUtilsBean.getConvertUtils().register(new org.apache.commons.beanutils.converters.DateConverter(null), java.util.Date.class); } /** * 表头名字和对应所在第几列的下标,用于根据title取到对应的值 */ private final Map
title_to_index = new HashMap<>(); /** * 所有带有ExcelIn注解的字段 */ private final List
fields = new ArrayList<>(); /** * 统计表格的行和列数量用来遍历表格 */ private int firstCellNum = 0; private int lastCellNum = 0; private int firstRowNum = 0; private int lastRowNum = 0; private String sheetName ; private HSSFSheet sheet ; public List
read(InputStream in , Class clazz) throws Exception { gatherAnnotationFields(clazz); configSheet(in); configHeader(); List rList= null; try { rList = readContent(clazz); } catch (IllegalAccessException e) { throw new Exception(e); } catch (InstantiationException e) { throw new Exception(e); } catch (InvocationTargetException e) { throw new Exception(e); } return rList ; } private List readContent(Class clazz) throws IllegalAccessException, InstantiationException, InvocationTargetException { Object o = null ; HSSFRow row = null ; List
rsList = new ArrayList<>(); Object value = null ; for(int i = (firstRowNum+1);i<=lastRowNum;i++){ o = clazz.newInstance(); row = sheet.getRow(i); HSSFCell cell = null ; for (Field field : fields) { //根据注解中的title,取到表格中该列所对应的的值 Integer column=title_to_index.get(field.getAnnotation(ExcelIn.class).title()); if(column==null){ continue; } cell = row.getCell(column); value = getCellValue(cell) ; if(null != value && StringUtils.isNotBlank(value.toString())) { beanUtilsBean.setProperty(o, field.getName(), value); } } rsList.add(o); } return rsList ; } private void configSheet(InputStream in) throws Exception { //HSSFWorkbook:只能创建97-03版本的Excel,即:以xls结尾的Excel // 想要导入xlsx结尾的Excel,用XSSFWorkbook try(HSSFWorkbook wb = new HSSFWorkbook(in)){ getSheetByName(wb); } catch (FileNotFoundException e) { throw new Exception(e); } catch (IOException e) { throw new Exception(e); } } /** * 根据sheet获取对应的行列值,和表头对应的列值映射 */ private void configHeader(){ this.firstRowNum = sheet.getFirstRowNum() ; this.lastRowNum = sheet.getLastRowNum() ; //第一行为表头,拿到表头对应的列值 HSSFRow row = sheet.getRow(firstRowNum); this.firstCellNum = row.getFirstCellNum(); this.lastCellNum = row.getLastCellNum(); for (int i = firstCellNum;i

  测试导入结果:

@RunWith(SpringRunner.class)@SpringBootTestpublic class Test {    @org.junit.Test    public void t(){        try{            File file = new File("d:/abc.xls");            ExcelReader
reader = new ExcelReader<>(); InputStream is = new FileInputStream(file); List
list = reader.read(is,UserInfo.class); if (CollectionUtils.isNotEmpty(list)) { for (UserInfo u : list) { System.out.println("姓名:" + u.getName() + " ,年龄:" + u.getAge() + " ,出身日期:" + u.getBirthday()); } } }catch (Exception e){ e.printStackTrace(); } }}

  导入的Excel数据:(Excel的sheet名称为接收实体对象的sheetName)

  结果展示:

转载于:https://www.cnblogs.com/xiao-OvO-/p/11012989.html

你可能感兴趣的文章
session token两种登陆方式
查看>>
IntelliJ IDEA 12集成Tomcat 运行Web项目
查看>>
android smack MultiUserChat.getHostedRooms( NullPointerException)
查看>>
实用的VMware虚拟机使用技巧十一例
查看>>
监控工具之---Prometheus 安装详解(三)
查看>>
不错的MVC文章
查看>>
网络管理相关函数
查看>>
IOS Google语音识别更新啦!!!
查看>>
20190422 T-SQL 触发器
查看>>
[置顶] Linux终端中使用上一命令减少键盘输入
查看>>
poj1422_有向图最小路径覆盖数
查看>>
BootScrap
查看>>
[大牛翻译系列]Hadoop(16)MapReduce 性能调优:优化数据序列化
查看>>
WEB_点击一百万次
查看>>
CodeForces - 878A Short Program(位运算)
查看>>
路冉的JavaScript学习笔记-2015年1月23日
查看>>
Mysql出现(10061)错误提示的暴力解决办法
查看>>
2018-2019-2 网络对抗技术 20165202 Exp3 免杀原理与实践
查看>>
NPM慢怎么办 - nrm切换资源镜像
查看>>
Swift - UIView的常用属性和常用方法总结
查看>>