package com.jianwu.util.excel;

import com.google.common.collect.Lists;
import com.jianwu.exception.MobileException;
import com.jianwu.util.excel.annotation.ExcelAttribute;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Cell;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import java.io.*;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List; /**
* poi工具类
* Created by tookbra on 2016/3/30.
*/
public class PoiUtil<T> {
private static final Logger logger = LoggerFactory.getLogger(PoiUtil.class);
// private static final String templatePath = "excel/template.txt";
private static String templatePath = "excel/template.txt"; Class<T> clazz; public PoiUtil(Class<T> clazz) {
this.clazz = clazz;
} public PoiUtil(Class<T> clazz, String templatePath) {
this.clazz = clazz;
this.templatePath = templatePath;
} public static List excelList = null; static {
if(excelList == null)
excelList = read(templatePath);
} /**
* 配置文件的读取
*
* @param fileName
* 文件名称
* @return List 文件内容存放code,name格式
*/
public static List read(String fileName) {
File file = new File(PoiUtil.class.getClassLoader().getResource(PoiUtil.templatePath).getFile());
List list = Lists.newArrayList();
if (file != null) {
if (file.exists()) {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
String str = null;
while ((str=br.readLine())!=null) {
list.add(str);
}
}
catch (Exception e) {
logger.error("读取excel文本错误:{}", e.getMessage());
}
}
else {
logger.error("读取excel文本错误,文件不存在");
System.out.println(fileName + "not exits");
}
}
return list;
} public static String subText(String str,String field) {
try{
if (str == null || str.length() == 0 || field == null || field.length() == 0)
return str;
for(int i = 0;i<str.length();i++){
if(field.indexOf(str.charAt(i)) != -1){
return str.substring(0,i);
}
}
}catch(Exception ex){
logger.error("分割截取字符串时发生错误:{}", ex.getMessage());
}
return str;
} /**
* 获取单元格内值
* @param cell 单元格
* @return
*/
public static String getCellValue(Cell cell) {
Object obj = "";
switch (cell.getCellType()) {
case Cell.CELL_TYPE_STRING :
obj = cell.getStringCellValue();
break;
case Cell.CELL_TYPE_NUMERIC :
obj = cell.getNumericCellValue();
break;
case Cell.CELL_TYPE_ERROR :
obj = cell.getErrorCellValue();
break;
case Cell.CELL_TYPE_FORMULA :
obj = cell.getCellFormula();
break;
case Cell.CELL_TYPE_BOOLEAN :
obj = cell.getBooleanCellValue();
break;
case Cell.CELL_TYPE_BLANK:
break;
}
return String.valueOf(obj).trim();
} public HSSFWorkbook exportExcel(List<T> list) throws IOException, IllegalAccessException {
// excel中每个sheet中最多有65536行
int sheetSize = 65536; HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet();
int listSize = 0;
if (list != null && list.size() >= 0) {
listSize = list.size();
}
int endNo = Math.min(1 + sheetSize, listSize);
HSSFRow row;
// 得到所有定义字段
Field[] allFields = clazz.getDeclaredFields();
List<Field> fields = new ArrayList<Field>();
// 得到所有field并存放到一个list中
for (Field field : allFields) {
if (field.isAnnotationPresent(ExcelAttribute.class)) {
fields.add(field);
}
}
HSSFCell cell;// 产生单元格
row = sheet.createRow(0);// 产生一行
// 写入各个字段的列头名称
for (int i = 0; i < fields.size(); i++) {
Field field = fields.get(i);
ExcelAttribute attr = field
.getAnnotation(ExcelAttribute.class);
int col = getExcelCol(attr.column());// 获得列号
cell = row.createCell(col);// 创建列
cell.setCellType(HSSFCell.CELL_TYPE_STRING);// 设置列中写入内容为String类型
cell.setCellValue(attr.value());// 写入列名
} logger.info("导出{}条数据", endNo);
for (int i = 0; i < endNo; i++) {
row = sheet.createRow(i + 1);
// 得到导出对象.
T vo = (T) list.get(i);
for (int j = 0; j < fields.size(); j++) {
Field field = fields.get(j);// 获得field.
field.setAccessible(true);// 设置实体类私有属性可访问
ExcelAttribute attr = field.getAnnotation(ExcelAttribute.class);
if (attr.isExport()) {
cell = row.createCell(getExcelCol(attr.column()));// 创建cell
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
cell.setCellValue(field.get(vo) == null ? ""
: String.valueOf(field.get(vo)));// 如果数据存在就填入,不存在填入空格.
//sheet.autoSizeColumn(j);//自动列宽
}
}
}
return wb;
} /**
*
* @param templatePath
* @param sheetName
* @param list
* @throws IOException
* @throws IllegalAccessException
*/
public HSSFWorkbook exportExcel(String templatePath, String sheetName, List<T> list)
throws IOException, IllegalAccessException {
// excel中每个sheet中最多有65536行
int sheetSize = 65536;
File file = new File(this.getClass().getClassLoader().getResource(templatePath).getFile());
if(!file.exists()){
System.out.println("模板文件:" + templatePath + "不存在!");
throw new MobileException("","");
}
POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(file));
HSSFWorkbook wb = new HSSFWorkbook(fs);
HSSFSheet sheet = wb.getSheet(sheetName);
int listSize = 0;
if (list != null && list.size() >= 0) {
listSize = list.size();
}
int endNo = Math.min(2 + sheetSize, listSize);
HSSFRow row;
// 得到所有定义字段
Field[] allFields = clazz.getDeclaredFields();
List<Field> fields = new ArrayList<Field>();
// 得到所有field并存放到一个list中
for (Field field : allFields) {
if (field.isAnnotationPresent(ExcelAttribute.class)) {
fields.add(field);
}
}
HSSFCell cell;// 产生单元格
logger.info("导出{}条数据", endNo);
for (int i = 0; i < endNo; i++) {
row = sheet.createRow(i + 2);
// 得到导出对象.
T vo = (T) list.get(i);
for (int j = 0; j < fields.size(); j++) {
Field field = fields.get(j);// 获得field.
field.setAccessible(true);// 设置实体类私有属性可访问
ExcelAttribute attr = field.getAnnotation(ExcelAttribute.class);
if (attr.isExport()) {
cell = row.createCell(getExcelCol(attr.column()));// 创建cell
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
cell.setCellValue(field.get(vo) == null ? ""
: String.valueOf(field.get(vo)));// 如果数据存在就填入,不存在填入空格.
}
}
}
return wb;
} /**
* 将EXCEL中A,B,C,D,E列映射成0,1,2,3
*
* @param col
*/
public static int getExcelCol(String col) {
col = col.toUpperCase();
// 从-1开始计算,字母重1开始运算。这种总数下来算数正好相同。
int count = -1;
char[] cs = col.toCharArray();
for (int i = 0; i < cs.length; i++) {
count += (cs[i] - 64) * Math.pow(26, cs.length - 1 - i);
}
return count;
} }

excel导出工具类的更多相关文章

  1. 基于jdk1.7实现的excel导出工具类

    通用excel导出工具类,基于泛型.反射.hashmap 以及基于泛型.反射.bean两种方式 import java.io.*;import java.lang.reflect.Field;impo ...

  2. Java 通过Xml导出Excel文件,Java Excel 导出工具类,Java导出Excel工具类

    Java 通过Xml导出Excel文件,Java Excel 导出工具类,Java导出Excel工具类 ============================== ©Copyright 蕃薯耀 20 ...

  3. EXCEL导出工具类及调用

    一.Excel导出工具类代码 package com.qiyuan.util; import java.io.OutputStream; import java.io.UnsupportedEncod ...

  4. 自己写的java excel导出工具类

    最近项目要用到excel导出功能,之前也写过类似的代码.因为这次项目中多次用到excel导出.这次长了记性整理了一下 分享给大伙 欢迎一起讨论 生成excel的主工具类: public class E ...

  5. 一个很好的通用 excel 导出工具类

    此类用主要 jxl +注解+流 实现扩展性很强,jxl性能会比poi好一点,值得我们学习. package oa.common.utils; import java.io.OutputStream; ...

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

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

  7. Java基础学习总结(49)——Excel导入导出工具类

    在项目的pom文件中引入 <dependency> <groupId>net.sourceforge.jexcelapi</groupId> <artifac ...

  8. 使用Apache poi来编写导出excel的工具类

    在JavaWeb开发的需求中,我们会经常看到导出excel的功能需求,然后java并没有提供操作office文档的功能,这个时候我们就需要使用额外的组件来帮助我们完成这项功能了. 很高兴Apache基 ...

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

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

随机推荐

  1. unity3d的三种平面坐标系

    unity3d有如下三种平面坐标系: 1.屏幕坐标系 2.视口坐标系viewport 3.GUI坐标系

  2. 自制MVC框架的插件与拦截器基础

    上篇谈到我自己写的MVC框架,接下来讲讲插件及拦截器! 在处理一些通用的逻辑最好把它封装一个插件或者拦截器,以便日后可以直接拿过来直接使用.在我的框架中可以通过继承以下抽象类来实现插件或者拦截器. 1 ...

  3. PHP时间戳和日期相互转换(文字有问题)

    在php中我们要把时间戳转换日期可以直接使用date函数来实现,如果要把日期转换成时间戳可以使用strtotime()函数实现,下面我来给大家举例说明. 1.php中时间转换函数 strtotime ...

  4. Windows7 64位安装最新版本号MySQLserver

    Windows7 64位安装最新版本号MySQLserver 最近,一直在研究MySQL数据库.常常改动配置文件.导致MySQL数据库无法使用.不得不重复重装MySQL数据库.下面是在Windows7 ...

  5. node多项目同时运行,nginx端口监听转发

    在服务器端安装pm2 npm install npm2 -g --save 之后再项目目录下运行 pm2 start app.js 在查看进程,是否已经启动 pm2 list 多个项目,我们只要监听端 ...

  6. iOS崩溃解决记录

    Terminating app due to uncaught exception 'CALayerInvalidGeometry', reason: 'CALayer position contai ...

  7. SAM I AM UVA - 11419 最小点集覆盖 要输出具体覆盖的行和列。

    /** 题目:SAM I AM UVA - 11419 链接:https://vjudge.net/problem/UVA-11419 题意:给定n*n的矩阵,'X'表示障碍物,'.'表示空格;你有一 ...

  8. [转]JVM内存溢出的几种方式比较

    转载自:https://github.com/pzxwhc/MineKnowContainer/issues/25 包括: 1. 栈溢出(StackOverflowError) 2. 堆溢出(OutO ...

  9. Mtx——Mobile Tutorial Series (LibGDX & MTX)

    http://moribitotechx.blogspot.co.uk/p/tutorial-series-libgdx-mtx.html —————————————————————————————— ...

  10. JXTA 2: 具有高性能、海量伸缩性的 P2P 网络

    这是来自developerWorks的一篇文章,地址是 https://www.ibm.com/developerworks/cn/java/j-jxta2/ ———————————————————— ...