package common;
import me.alad.common.AladdinLogger;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.*;
import java.lang.reflect.Field;
import java.util.*;
/**
* Created with IntelliJ IDEA.
* User: user
* Date: 14-7-18
* Time: 上午9:33
* To change this template use File | Settings | File Templates.
*/
/**
* 处理实体生成excel工具类
* 使用规范
* 1.如果headMap,不指定行高,列宽都默认值,实体每个属性都输出
* 2,如果指定了列的排序比如("name$sort",0),那么headMap中的其他实体的属性需要全部自定排序,并且不能序号重复,不然可能造成空列的情况
*
*/
public class ExcelUtil {
private static final AladdinLogger log = AladdinLogger.getLogger(ExcelUtil.class);
/**
* 转换集合成excel文件
*
* @param fileName 转换成excel的文件名
* @param list 需要转换的类的集合
* @param headMap 表头map,表头字段map,key对应list的实体的属性,value对应excel中显示的列名,传入为null 表示实体属性全部输出
* headMap.put("excel_column$Width",20); //默认列宽
* headMap.put("excel_row$Height",20*20); 默认行高
* 显示:headMap.put("name","名字")excel中显示名字这列
* 排序:headMap.put("name$Sort",0); 0 排第一列 如果不指定,按照属性默认排序
* 某列的宽度 headMap.put("name$Width",20*256); 默认20字符
*
*/
public static void exportExcelFromList(String fileName, List list, Map headMap,HttpServletResponse response) {
try {
//数据为空提示
if (list == null || list.size() == 0) {
response.setHeader("Content-type", "text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
OutputStream os = response.getOutputStream();
OutputStreamWriter writer = new OutputStreamWriter(os,"utf-8");
writer.write("<script>");
writer.write("alert('数据为空,生成excel失败!');window.history.go(-1);");
writer.write("</script>");
writer.flush();
writer.close();
os.close();
return ;
}
HSSFWorkbook hwb = new HSSFWorkbook();
int countRow = list.size();//总行数
int countSheet = 1;//总工作表
int sheetCountRow = countRow;//每个工作表显示的行数
int sheetMaxCount=65000; //每个工作表最大行数
if (countRow > sheetMaxCount) {
countSheet = countRow % sheetMaxCount == 0 ? countRow / sheetMaxCount : countRow / sheetMaxCount + 1;
sheetCountRow = sheetMaxCount;
}
if (countSheet > 256) {
return;
}
CellStyle headStyle = setHeaderCellStyle(hwb);
CellStyle style = setRowCellStyle( hwb);//设置默认样式
for (int i = 0; i < countSheet; i++) {
Sheet sheet = hwb.createSheet("sheet" + (i + 1));
int defaultColumnWidth =20;
if(headMap!=null){
defaultColumnWidth =headMap.get("excel_column$Width") == null ? defaultColumnWidth : Integer.valueOf(headMap.get("excel_column$Width").toString());
}
sheet.setDefaultColumnWidth(defaultColumnWidth);
Short defaultHeight =(short) (20*20);
if(headMap!=null){
defaultHeight =headMap.get("excel_row$Height")==null?defaultHeight:Short.valueOf(headMap.get("excel_row$Height").toString());
}
sheet.setDefaultRowHeight(defaultHeight);
Row firstRow = sheet.createRow(0); // 下标为0的行开始
List<Field> fields =getDeclaredFields(list.get(0));
int countHead = 0; //表头
for (Field item : fields) {
String name = item.getName(); // 属性名
Integer sort=countHead;
Cell cell =null;
if(headMap ==null || headMap.isEmpty()){ //遍历全部属性
cell = firstRow.createCell(sort);
sheet.autoSizeColumn(sort); //自适应
cell.setCellStyle(headStyle);
cell.setCellValue(name);
countHead++;
}else{
if(headMap.get(name) != null){
if (headMap.get(name+"$Sort") != null) { //改变列名
sort= Integer.valueOf(headMap.get(name+"$Sort").toString());
}
if(headMap.get(name+"$Width")!=null ) {
sheet.setColumnWidth(sort,Integer.valueOf(headMap.get(name+"$Width").toString()));
}else{
//自适应
sheet.autoSizeColumn(sort);
}
cell = firstRow.createCell(sort);
cell.setCellStyle(headStyle);
cell.setCellValue(headMap.get(name).toString());
countHead++;
}
}
}
for (int j = 0; j < sheetCountRow; j++) {
int index = i * sheetMaxCount + j;//list集合下表
if (index > countRow - 1) {//list已经全部循环取出来了,结束整个循环
break;
}
// 创建一行
Row row = sheet.createRow(j + 1);
int count = 0;
for (Field item : fields) {
String name = item.getName(); // 属性名
item.setAccessible(true);
Cell cell =null;
int sort = count;
if(headMap == null || headMap.isEmpty()){
cell =row.createCell(sort);
cell.setCellStyle(style);
setCellTypeValue(cell,item,list.get(index));
count++;
}else{
if( headMap.get(name) != null){
sort =headMap.get(name+"$Sort")==null ?count : Integer.valueOf(headMap.get(name+"$Sort").toString()); //填充类中需要填充的字段的值
cell =row.createCell(sort);
cell.setCellStyle(style);
setCellTypeValue(cell,item,list.get(index));
count++;
}
}
}
}
}
list = null; //清空list释放内存
OutputStream os = response.getOutputStream();
// 这个是弹出下载对话框的关键代码
response.setHeader("Content-disposition", "attachment;filename=" + ((null == fileName) || ("".equals(fileName.trim()))? (new Date().getTime() + "") : new String(fileName.trim().getBytes("gb2312"),"ISO8859-1")) + ".xls");
// 将工作簿进行输出
hwb.write(os);
os.flush(); // 关闭输出流
os.close();
} catch (Exception e) {
log.error("导出excel出错:"+e.getMessage());
}
}
/**
* 个单元格设置类型,值
* @param cell 单元格
* @param item 反射属性类
* @param entity 集合中的实体
*/
public static void setCellTypeValue(Cell cell,Field item,Object entity) {
//Boolean
String typeName =item.getGenericType().toString();
try{
if(typeName.equals("class java.lang.Boolean") || typeName.equals("boolean")){ //后面是它的基本类型
cell.setCellType(HSSFCell.CELL_TYPE_BOOLEAN);
if(item.get(entity)!=null){
cell.setCellValue((Boolean) item.get(entity));
}
return;
}
// Double
if(typeName.equals("class java.lang.Double") || typeName.equals("double")) {
cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
if(item.get(entity)!=null){
cell.setCellValue((Double)item.get(entity));
}
return;
}
if( typeName.equals("class java.lang.Integer") || typeName.equals("int")){
cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
if(item.get(entity)!=null){
cell.setCellValue((Integer)item.get(entity));
}
return;
}
if(typeName.equals("class java.lang.Short") || typeName.equals("short")){
cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
if(item.get(entity)!=null){
cell.setCellValue((Short)item.get(entity));
}
return;
}
if(typeName.equals("class java.lang.Float") || typeName.equals("float")){
cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
if(item.get(entity)!=null){
cell.setCellValue((Float)item.get(entity));
}
return;
}
if(typeName.equals("class java.lang.Long") || typeName.equals("long")){
cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
if(item.get(entity)!=null){
cell.setCellValue((Long)item.get(entity));
}
return;
}
//String 其他类型
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
if(item.get(entity)!=null){
cell.setCellValue((String) item.get(entity));
}
}catch (Exception e){
log.error("类型转换出错"+e.getMessage());
}
}
/**
* 获取属性集合,循环向上转型, 获取对象的属性,包括父类的
* @param object : 对象
* @return 属性的集合
*/
public static List<Field> getDeclaredFields(Object object){
List<Field> fields = new ArrayList<Field>();
Class<?> clazz = object.getClass() ;
for(; clazz != Object.class ; clazz = clazz.getSuperclass()) {
try {
fields.addAll(Arrays.asList(clazz.getDeclaredFields()));
} catch (Exception e) {
//这里甚么都不要做!并且这里的异常必须这样写,不能抛出去。
//如果这里的异常打印或者往外抛,则就不会执行clazz = clazz.getSuperclass(),最后就不会进入到父类中了
log.error("获取父类的属性出错"+e.getMessage());
}
}
return fields;
}
/**
* 设置表头的单元格样式
* @param hwb
*
*/
public static CellStyle setHeaderCellStyle(HSSFWorkbook hwb){
CellStyle style =hwb.createCellStyle();
Font font=hwb.createFont();
font.setFontHeightInPoints((short)12);
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); //字体增粗
//把字体应用到当前的样式
style.setFont(font);
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
return style;
}
/**
* 设置单元格样式
* @param hwb
*/
public static CellStyle setRowCellStyle(HSSFWorkbook hwb){
CellStyle style =hwb.createCellStyle();
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
return style;
}
// public static void main(String[] arg){
// CompanyOverValue overValue = new CompanyOverValue();
// overValue.setLicenseImages("xxxx");
// overValue.setRegistNumber("dfadfa");
// overValue.setPhone("1234566545");
// overValue.setAddress("你好啊。");
// List<CompanyOverValue> list = new ArrayList<CompanyOverValue>();
// list.add(overValue);
// Map showHead = new HashMap();
// showHead.put("phone","电话");
// showHead.put("address","地址");
// showHead.put("registNumber","合同号");
// showHead.put("licenseImages","营业执照");
//
// /*
// 不指定排序就是默认类中属性的排序
// showHead.put("excel_head$Height",20); //表头一列的高度
// showHead.put("excel_row$Height",20); //指定excel每行高度
// showHead.put("phone$Sort",0); //指定列名排序 如果指定了其中一列其他的都要自己指定排序
// showHead.put("address$Sort",1); //指定列名排序 如果指定了其中一列其他的都要自己指定排序
// showHead.put("registNumber$Sort",2); //指定列名排序 如果指定了其中一列其他的都要自己指定排序
// showHead.put("licenseImages$Sort",3); //指定列名排序 如果指定了其中一列其他的都要自己指定排序
// showHead.put("licenseImages$Width",200); //置顶这列的宽度
// */
// HttpServletResponse response =null; //自己从controller中拿到
// ExcelUtil.exportExcelFromList("今天测试",list,showHead,response);
// }
}
分享到:
相关推荐
java Excel相关处理 工具类 java Excel相关处理 工具类java Excel相关处理 工具类 java Excel相关处理 工具类java Excel相关处理 工具类 java Excel相关处理 工具类java Excel相关处理 工具类 java Excel相关处理 ...
Excel文件通常被广泛用于数据存储、报告生成和数据分析等领域,因此,一个强大的Excel处理工具类是十分必要的。 `ExcelUtils`工具类的核心功能可能包括以下几个方面: 1. **读取Excel文件**:通过Apache POI库或...
10. **数据流处理**:除了处理本地文件,工具类也可能支持从网络流或内存中读写Excel,便于在Web应用中处理Excel数据。 通过使用这样的"Excel POI 工具类",开发人员可以避免重复编写相同的代码,提高代码的可维护...
在IT行业中,Excel导出工具类是经常被用于数据处理和报表生成的模块。这个工具类通常是为了简化从应用程序中批量导出数据到Excel文件的过程,使得开发者可以更高效地处理大量的结构化信息。以下是对"Excel导出工具类...
本篇文章将深入探讨“C#通用Excel导入导出工具类”的实现原理及应用,主要涉及的技术点包括反射、特性以及如何创建一个高效的Excel导入导出解决方案。 首先,我们要理解反射在C#中的作用。反射是一种强大的机制,它...
总结来说,这款Excel读写工具类为非MFC环境提供了便利的数据处理手段,简化了Excel操作的复杂度,提高了开发效率。通过深入理解和应用这个工具,开发者可以更好地进行数据的导入导出,实现更高效的数据管理。
Java编写的Excel万能工具类是一种高效处理Excel数据的实用程序,它可以帮助开发者轻松地读取、写入和操作Excel文件。在这个工具类中,通常会包含一系列静态方法,用于处理各种Excel相关的任务,比如打开文件、读取...
这个工具类主要是为了简化编程过程中处理Excel文件的工作,尤其是考虑到数据类型的多样性,使得开发者能够快速、高效地实现Excel文件的导出功能。下面我们将深入探讨Excel导出工具类的相关知识点。 首先,我们要...
- 在Excel处理方面,POI 提供了 HSSF(Horrible Spreadsheet Format)和 XSSF(XML Spreadsheet Format)两个API,分别用于读写旧版的 `.xls` 文件和较新的 `.xlsx` 文件。 - POI 提供了 Sheet、Row、Cell 等类,...
"Excel创建工具类"是用于简化Excel文件操作的一种方法,它允许开发者通过编程方式快速生成和修改Excel工作簿。本篇将详细介绍如何创建这样一个工具类,以及如何利用Apache POI库(版本3.12)来实现。 Apache POI是...
java使用POI导出 Excel+图片工具类 ,里面含有poi jar包,只调用接口即可直接保存Excel。使用的时候需先把数据封装,具体包装需根据实际导出数据进行处理。文件demo中只提供包装格式。
在IT行业中,Excel工具类是常见的一种实用程序,特别是在数据处理和分析的场景下。SpringBoot框架结合Excel工具类,可以方便地实现从数据库中获取数据并导出为Excel文件,便于用户查看、分析或者进一步处理。这个...
Java操作Excel工具类是开发过程中常见的一种需求,尤其是在数据导入导出、数据分析或者报表生成的场景下。在Java中,我们可以使用多种库来处理Excel文件,例如Apache POI、JExcelAPI、OpenCSV等。本篇文章将重点介绍...
概述:Java poi导入导出EXCEL工具类(兼容各版本) 一、功能说明 允许同时导入或导出多个sheet,同一sheet可同时存在多个数据块,按数据块划分处理数据。 二、配置文件示例及详细说明 1、导入xml配置示例如下(见...
java操作excel的工具类,有处理excel的方法。 好资源大家一起分享。如果急需用,但是有下载积分的话,关注我,留言我,就OK了。 希望大家关注的我的CSDN。 我的昵称:今升·小博 地址:...
总之,"java导出excel文档通用工具类"是Java开发中的一个实用组件,它封装了Excel文件生成的复杂性,使得开发者可以专注于数据处理和业务逻辑,而不是底层的文件操作。通过学习和理解这个工具类的工作原理,我们可以...
要兼容不同版本的Excel,工具类需要处理HSSFWorkbook和XSSFWorkbook。可以通过检查文件扩展名或MIME类型来确定使用哪种类型的工作簿。 6. **注意事项** - 关闭资源:读写完成后,记得关闭输入/输出流和工作簿对象...
本项目提供了一个名为"excel生成图表工具类"的Java类库,帮助开发者通过编程方式自动化创建Excel图表,包括柱状图、折线图和饼状图。以下将详细解析这个工具类库的主要知识点: 1. **Java编程基础**:首先,你需要...
1. ExcelAssiant.exe:这是主程序文件,包含了整个Excel处理工具的执行代码。 2. ICSharpCode.SharpZipLib.dll:这是一个开源的.NET库,用于处理压缩和解压缩操作,可能在这个工具中用于读取或保存压缩的Excel文件。...