excel导出工具类
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导出工具类的更多相关文章
- 基于jdk1.7实现的excel导出工具类
通用excel导出工具类,基于泛型.反射.hashmap 以及基于泛型.反射.bean两种方式 import java.io.*;import java.lang.reflect.Field;impo ...
- Java 通过Xml导出Excel文件,Java Excel 导出工具类,Java导出Excel工具类
Java 通过Xml导出Excel文件,Java Excel 导出工具类,Java导出Excel工具类 ============================== ©Copyright 蕃薯耀 20 ...
- EXCEL导出工具类及调用
一.Excel导出工具类代码 package com.qiyuan.util; import java.io.OutputStream; import java.io.UnsupportedEncod ...
- 自己写的java excel导出工具类
最近项目要用到excel导出功能,之前也写过类似的代码.因为这次项目中多次用到excel导出.这次长了记性整理了一下 分享给大伙 欢迎一起讨论 生成excel的主工具类: public class E ...
- 一个很好的通用 excel 导出工具类
此类用主要 jxl +注解+流 实现扩展性很强,jxl性能会比poi好一点,值得我们学习. package oa.common.utils; import java.io.OutputStream; ...
- 一个基于POI的通用excel导入导出工具类的简单实现及使用方法
前言: 最近PM来了一个需求,简单来说就是在录入数据时一条一条插入到系统显得非常麻烦,让我实现一个直接通过excel导入的方法一次性录入所有数据.网上关于excel导入导出的例子很多,但大多相互借鉴. ...
- Java基础学习总结(49)——Excel导入导出工具类
在项目的pom文件中引入 <dependency> <groupId>net.sourceforge.jexcelapi</groupId> <artifac ...
- 使用Apache poi来编写导出excel的工具类
在JavaWeb开发的需求中,我们会经常看到导出excel的功能需求,然后java并没有提供操作office文档的功能,这个时候我们就需要使用额外的组件来帮助我们完成这项功能了. 很高兴Apache基 ...
- 通用Excel文件导出工具类
1:Excel格式 2:ExcelUtil.java import java.io.ByteArrayOutputStream; import java.io.IOException; import ...
随机推荐
- asp.net 完善注册登录+sqlite数据库
结合sqlite数据库,完善asp.net制作的web网页中的注册和登录操作. 1. Account-Register.aspx <%@ Page Title="" Lang ...
- js+css简单效果(幕布,跑马灯)
2.js普通的盒子,css的优先级 css的优先级 !important >>>>> style 行内样式 >>>>> #id选择器 # ...
- php实现IP地址和数字相互转换
echo $a=ip2long ("202.97.224.68");//地址转换成数字 系统自带的函数 注:这里面有一个要注意的地方,大概由于PHP无法正确判断转换完的数字类型,出 ...
- Bash中的括号(三)
1.两个小括号用来对整数进行算术运算和逻辑运算,比如. 例如给变量赋值: $ a=+; echo $a + $ (( b = + )); echo $b 1+1 只是一个字符串,而 b 就是一个算术表 ...
- PCIe学习笔记(15)--- TLP的ROUTING方式
PCIE是POINT TO POINT的,不像PCI,是SHARED-BUS,总线上的数据,是被所有EP DEV看到的. 这一点与USB2.0比较类似,是广播方式的(BROADCASTING) USB ...
- C# Lpt 并口热敏小票打印机打印位图
class LptControl { private string LptStr = "lpt1"; public LptControl(string l_LPT_Str) { L ...
- JS高程3:BOM-window对象
全局作用域 BOM的核心就是window对象,他是浏览器的一个实例. 它既是JS访问浏览器窗口的接口,又是ECMAScript中的global对象. 在全局作用域中,global对象,this对象,w ...
- ecmall程序结构图与数据库表分析
以下是ecmall的程序结构图,看了这张图,我们可以清楚的知道ecmall的程序结构. ECMALL数据库主要表如下所示: ecm_acategory:存放的是商城的文章分类.ecm_address: ...
- SockIOPool
1. SockIOPool – SockIO池化管理,为上层提供的接口是实例化函数[主要是指定memcached服务器地址,各个机器的权重]:根据key&hashCode获取SockIO-网络 ...
- 使用command对象添加删除查询记录
private void button1_Click(object sender, EventArgs e) { //实例化数据库连接对象 SqlConnection sqlcon = new Sql ...