依赖的jar包:

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
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.ss.usermodel.WorkbookFactory;
/*** * 基于POI的读写Excel文件的工具类* @author 彭锋* @2018年5月13日 下午4:00:11*/
public final class ExcelUtils {private static <T>Field[] getFields(Class<T> clazz,String[] fieldNames) {Field[] fs = new Field[fieldNames.length];Field[] fields = clazz.getDeclaredFields();for (int i = 0; i < fieldNames.length; i++) {O:for (Field field : fields) {field.setAccessible(true);if(field.getName().equals(fieldNames[i])) {fs[i] = field;break O;}}}System.out.println(Arrays.toString(fs));return fs;}private static <T>String[][] getDatas(String[] titles,List<T> beans,String[] fieldNames) throws Exception{List<String[]> datas = new ArrayList<>();if(titles != null && titles.length > 0) {datas.add(titles);}//根据List集合中的JavaBean对象的类型,和参数fieldNames,获取要写出的字段数组;Field[] fs = getFields(beans.get(0).getClass(),fieldNames);for (T t : beans) {String[] data = new String[fs.length];for (int i = 0; i < fs.length; i++) {if(fs[i] != null) {Object obj = fs[i].get(t);String value = obj == null ? "" : obj.toString();data[i] = value;}}datas.add(data);}return datas.toArray(new String[datas.size()][]);}/*** 将指定的二维字符串数组中的数据,写出到指定的Excel文件中* @param datas:保存了要写出的数据的二维数组;* @param output:关联到要输出的Excel文件的输出流* @throws IOException* @throws FileNotFoundException*/public static void writeToExcel(String[][] datas, OutputStream output) throws IOException, FileNotFoundException {// 创建一个Workbook对象;Workbook book = new HSSFWorkbook();// 通过workbook对象,创建一个工作表(sheet对象)Sheet sheet = book.createSheet();for (int i = 0; i < datas.length; i++) {// 通过工作表创建行Row row = sheet.createRow(i);for (int j = 0; j < datas[i].length; j++) {// 通过行创建单元格Cell cell = row.createCell(j);cell.setCellType(CellType.STRING);// 为单元格设置内容
                cell.setCellValue(datas[i][j]);}}book.write(output);book.close();}/*** 将指定集合中的所有JavaBean数据,写出到关联指定Excel文件的输出流中;* @param titles:输出的Excel文件的标题行的内容* @param fieldNames:一行中的各个列对应的JavaBean中的字段* @param beans:要输出的所有JavaBean对象* @param output:关联到指定Excel文件的输出流* @throws Exception*/public static <T>void writeToExcel(String[] titles,String[] fieldNames,List<T> beans,OutputStream output) throws Exception {String[][] datas = getDatas(titles, beans, fieldNames);writeToExcel(datas, output);}/*** 从指定的Excel的输入流中读取数据,写到指定类型的bean对象的List集合中;* @param input:关联到某个Excel文件的输入流* @param clazz:要封装一行数据的JavaBean的类型* @param fieldNames:一行数据中的列按顺序和JavaBean中对应的字段* @return* @throws Exception*/public static <T> List<T> readExcel(InputStream input, Class<T> clazz,String[] fieldNames) throws Exception {List<T> list = new ArrayList<>();Field[] fs = getFields(clazz,fieldNames);// 创建一个Workbook对象Workbook book = WorkbookFactory.create(input);// 通过Workbook对象,获取里面的工作表(sheet对象)Sheet sheet = book.getSheetAt(0);// 获取工作表中的行for (int i = 1; i <= sheet.getLastRowNum(); i++) {// 通过行号获取行Row row = sheet.getRow(i);T t = clazz.newInstance();// 遍历获取一行中的所有单元格for (int j = 0; j < fs.length; j++) {if(fs[j] != null) {Cell cell = row.getCell(j);cell.setCellType(CellType.STRING);setCellValue(fs[j],t,cell);}}list.add(t);}return list;}private static void setCellValue(Field field,Object bean,Cell cell) throws Exception {String str = cell.toString();Class clazz = field.getType();if(clazz == byte.class) {field.set(bean, Byte.parseByte(str));}else if(clazz == short.class) {field.set(bean, Short.parseShort(str));}else if(clazz == int.class) {field.set(bean, Integer.parseInt(str));}else if(clazz == long.class) {field.set(bean, Long.parseLong(str));}else if(clazz == double.class) {field.set(bean, Double.parseDouble(str));}else if(clazz == float.class) {field.set(bean, Float.parseFloat(str));}else if(clazz == boolean.class) {field.set(bean, Boolean.parseBoolean(str));}else {field.set(bean, str);}}
}

转载于:https://www.cnblogs.com/pf1988/p/9146105.html

基于POI的读写Excel文件的工具类相关推荐

  1. 一个基于POI的通用excel导入导出工具类的简单实现及使用方法

    前言: 最近PM来了一个需求,简单来说就是在录入数据时一条一条插入到系统显得非常麻烦,让我实现一个直接通过excel导入的方法一次性录入所有数据.网上关于excel导入导出的例子很多,但大多相互借鉴. ...

  2. 基于POI框架操作Excel文件

    前言 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能.POI的结构如下: HSSF - 提供读写Mi ...

  3. 通用Excel文件导出工具类

    1:Excel格式 2:ExcelUtil.java import java.io.ByteArrayOutputStream; import java.io.IOException; import ...

  4. java读写excel文件poi_Java利用POI读写Excel文件工具类

    本文实例为大家分享了Java读写Excel文件工具类的具体代码,供大家参考,具体内容如下 package com.test.app.utils; import java.io.File; import ...

  5. Alibaba开源工具EasyExcel读写Excel文件

    前言 工作中使用 excel 表格处理数据是很常见的操作,经常会使用 excel 文件来导入数据或者导出数据,是不是脑海中已经思考有哪些处理excel框架? 小编之前呢就知道Java 解析.生成 Ex ...

  6. Java操作Excel之POI:java读写excel文件以及打印设置

    Java操作Excel之POI:java读写excel文件以及打印设置 POI的jar包下载地址:http://poi.apache.org/download.html 注意:项目中导入poi 4.0 ...

  7. 使用poi读写excel文件

    使用poi读写excel文件 Posted on 2011 年 03 月 16 日 by 苍之涛 今天一个同学需要处理一个excel文件,于是我便在网上搜了一下方法,顺便自己研究一下.刚刚参考网上资料 ...

  8. C++读写EXCEL文件方式比较 .

    C++读取Excel的XLS文件的方法有很多,但是也许就是因为方法太多,大家在选择的时候会很疑惑. 由于前两天要做导表工具,比较了常用的方法,总结一下写个短文, 1.OLE的方式 这个大约是最常用的方 ...

  9. 【开发随机】JAVA+POI+自定义注解+反射构建自定义工具类实现快捷简便的Excel模板化导出(附demo代码)

    220907更新 项目UAT期间,用户反映了一个问题,数据量稍大的情况下,会出现"从某一行开始,往下所有行设置的字体和字体大小不生效"的BUG. 经过排查,发现原因是:POI的XS ...

最新文章

  1. bootstrap 引用注意事项
  2. python多线程并发编程技术_同步线程 - Python并发编程教程™
  3. Hadoop配置机架感知(python脚本)
  4. java 8 方法引用(method references)
  5. leetcode 112路径总和
  6. Juypter 代码自动补全
  7. Python基础语法和数据类型最全总结
  8. linux计划任务30秒,Linux 计划任务(at batch crontab anacron)
  9. debugger怎么用_谷歌开发者工具,这些技巧你用过么?
  10. Node.js+Express商业开发中的安全性考虑
  11. 从孙子算经到中国剩余定理
  12. HDU3017:Lucas定理及详解
  13. vue-awesome-swiper使用自动轮播和循环轮播不生效(loop和autoplay)
  14. 【转】Java 5种字符串拼接方式性能比较。
  15. VsCode中文乱码问题
  16. 进入浏览器下载文件,状态栏不显示下载图标
  17. c语言中各个符号的含义总结,C语言中的符号总结
  18. 拳皇世界6月13服务器维护,拳皇世界2月8日例行维护 数据互通公告[图]
  19. Halcon提取中心线
  20. Windows常用快捷键及结束explorer.exe出现蓝屏的办法

热门文章

  1. 决定将本博客技术知识从VS.Net转型SuperMap产品动态与开发
  2. LINUX 如何实现多线程进行cp复制
  3. android 开发 命名规范
  4. 随笔:web服务器中建立一个小的个人站点
  5. 二叉树表达规定形式的代数表达式并计算表达式结果(无明显缺陷版本)
  6. 提高电脑开机速度的一些基本操作
  7. 大牛推荐的30本经典编程书籍,从Python到前端全系列。
  8. 全国计算机一级计算机基础及WPS考试题型,计算机一级考试科目有哪些?Wps和ms考试的题目一样吗?...
  9. Redis删除副本节点
  10. RocketMQ的架构