2017-01-04 16:31:35 TRFlor 阅读数 3826
  • 基于SSM的POI导入导出Excel实战

    本课程将给大家分享如何基于SSM实现POI导入导出Excel,并讲解目前企业级JavaWeb应用mvc三层模式的开发流程,可让初学者或者职场萌新掌握如何基于SSM整合第三方框架并采用mvc三层开发模式实现自己的业务模块!

    1272 人正在学习 去看看 钟林森

1、需要的jar包,大批量导出,在poi3.8以后的包中才会有


2、poi的工具类



import java.util.ArrayList;
import java.util.List;

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.HSSFRichTextString;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.streaming.SXSSFCell;
import org.apache.poi.xssf.streaming.SXSSFRow;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFFont;


public class ExportUtil {

private SXSSFWorkbook wb = null;

private Sheet sheet = null;

private String sheetName;

private String[] headers;

private List<Object[]> dataList = new ArrayList<Object[]>();

public ExportUtil(SXSSFWorkbook wb, Sheet sheet) {
this.wb = wb;
this.sheet = sheet;
}

public ExportUtil(String sheetName, String[] headers, List<Object[]> dataList) {
this.dataList = dataList;
this.headers = headers;
this.sheetName = sheetName;
}

public void setRegionStyle(CellRangeAddress region, XSSFCellStyle cs) {
int toprowNum = region.getFirstRow();
for (int i = toprowNum; i <= region.getLastRow(); i++) {
SXSSFRow row = (SXSSFRow) sheet.getRow(i);

for (int j = region.getFirstColumn(); j <= region.getLastColumn(); j++) {
SXSSFCell cell = (SXSSFCell) row.getCell(j);
cell.setCellStyle(cs);
}
}
}

// 设置表头的单元格样式
public CellStyle getHeadStyle() {
// 创建单元格样式
CellStyle cellStyle = wb.createCellStyle();

// 设置单元格的背景颜色为淡蓝色
cellStyle.setFillForegroundColor(HSSFColor.PALE_BLUE.index);
// 设置填充字体的样式
cellStyle.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);

// 设置单元格居中对齐
cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);

// 设置单元格垂直居中对齐
cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);

// 创建单元格内容显示不下时自动换行
cellStyle.setWrapText(true);

// 设置单元格字体样式
XSSFFont font = (XSSFFont) wb.createFont();
font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);// 这是字体加粗
font.setFontName("宋体");// 设置字体的样式
font.setFontHeight(14);// 设置字体的大小
cellStyle.setFont(font);// 将字体填充到表格中去

// 设置单元格边框为细线条(上下左右)
cellStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);
cellStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN);
cellStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);
cellStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);

return cellStyle;

}

// 设置表体的单元格样式
public CellStyle getBodyStyle() {
// 创建单元格样式
CellStyle cellStyle = wb.createCellStyle();
// 设置单元格居中对齐
cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);
// 设置单元格居中对齐
cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
// 创建单元格内容不显示自动换行
cellStyle.setWrapText(true);
// 设置单元格字体样式
XSSFFont font = (XSSFFont) wb.createFont();
font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);// 这是字体加粗
font.setFontName("宋体");// 设置字体
font.setFontHeight(12);// 设置字体的大小
cellStyle.setFont(font);// 将字体添加到表格中去

// 设置单元格边框为细线条
cellStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);
cellStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN);
cellStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);
cellStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);

return cellStyle;

}

public Cell setHeadStyle(String[] titles) {
Cell cell = null;

CellStyle headStyle = getHeadStyle();

Row headRow = sheet.createRow(0);
// 构建表头
for (int i = 0; i < titles.length; i++) {
cell = headRow.createCell(i);
cell.setCellStyle(headStyle);
cell.setCellValue(titles[i]);
}
return cell;
}

/*
* 导出数据
*/
public SXSSFWorkbook export() throws Exception {
String nsheetName = new String(sheetName.getBytes("UTF-8"));
/*
* response.setCharacterEncoding("utf-8");
* response.setContentType("application/x-msdownload");
* response.setHeader("Content-disposition", "attachment; filename=" +
* sheetName + ".xlsx");// 组装附件名称和格式
*/
Integer rowaccess = 1000;// 内存中缓存记录行数,以免内存溢出

SXSSFWorkbook workbook = new SXSSFWorkbook(rowaccess);
try {

Sheet sheet = workbook.createSheet(nsheetName);

// 产生表格标题行
Row titleRow = sheet.createRow(0);
Cell cellTiltle = titleRow.createCell(0);
CellStyle columnTopStyle = this.getColumnTopStyle(workbook);// 获取列头样式对象

sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, (headers.length - 1)));
cellTiltle.setCellStyle(columnTopStyle);
cellTiltle.setCellValue(sheetName);

Cell cell = null;

CellStyle headStyle = this.getHeadStyle(workbook);

// 定义所需列数
int columnNum = headers.length;
Row headRow = sheet.createRow(2); // 在索引2的位置创建行(最顶端的行开始的第二行)

//表头
for (int n = 0; n < columnNum; n++) {
Cell cellRowName = headRow.createCell(n); // 创建列头对应个数的单元格
cellRowName.setCellType(HSSFCell.CELL_TYPE_STRING); // 设置列头单元格的数据类型
HSSFRichTextString text = new HSSFRichTextString(headers[n]);
cellRowName.setCellValue(headers[n]); // 设置列头单元格的值
cellRowName.setCellStyle(headStyle); // 设置列头单元格样式
}

CellStyle bodyStyle = this.getBodyStyle(workbook);

// 表体数据
for (int i = 0; i < dataList.size(); i++) {

Object[] obj = dataList.get(i);
Row row = sheet.createRow(i + 3);// 创建所需的行数

for (int j = 0; j < obj.length; j++) {

cell = row.createCell(j);
String str = String.valueOf(StringUtils.isBlank(obj[j]) ? "" : obj[j]);
cell.setCellValue(str); // 单元格的值
cell.setCellStyle(bodyStyle); // 单元格的样式
}
}


} catch (Exception e) {
e.printStackTrace();
}

return workbook;
}

// 设置表头的单元格样式
public CellStyle getHeadStyle(SXSSFWorkbook workbook) {
// 创建单元格样式
CellStyle cellStyle = workbook.createCellStyle();

// 设置单元格的背景颜色为淡蓝色
cellStyle.setFillForegroundColor(HSSFColor.PALE_BLUE.index);
// 设置填充字体的样式
cellStyle.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);

// 设置单元格居中对齐
cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);

// 设置单元格垂直居中对齐
cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);

// 创建单元格内容显示不下时自动换行
cellStyle.setWrapText(true);

// 设置单元格字体样式
XSSFFont font = (XSSFFont) workbook.createFont();
font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);// 这是字体加粗
font.setFontName("宋体");// 设置字体的样式
font.setFontHeight(12);// 设置字体的大小
cellStyle.setFont(font);// 将字体填充到表格中去

// 设置单元格边框为细线条(上下左右)
cellStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);
cellStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN);
cellStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);
cellStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);

return cellStyle;

}

// 设置表体的单元格样式
public CellStyle getBodyStyle(SXSSFWorkbook workbook) {
// 创建单元格样式
CellStyle cellStyle = workbook.createCellStyle();
// 设置单元格居中对齐
cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);
// 设置单元格居中对齐
cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
// 创建单元格内容不显示自动换行
cellStyle.setWrapText(true);
// 设置单元格字体样式
XSSFFont font = (XSSFFont) workbook.createFont();
font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);// 这是字体加粗
font.setFontName("宋体");// 设置字体
font.setFontHeight(10);// 设置字体的大小
cellStyle.setFont(font);// 将字体添加到表格中去

// 设置单元格边框为细线条
cellStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);
cellStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN);
cellStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);
cellStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);

return cellStyle;

}

public Cell setHeadStyle(String[] titles, SXSSFWorkbook workbook) {
Cell cell = null;

CellStyle headStyle = getHeadStyle(workbook);

Row headRow = sheet.createRow(0);
// 构建表头
for (int i = 0; i < titles.length; i++) {
cell = headRow.createCell(i);
cell.setCellStyle(headStyle);
cell.setCellValue(titles[i]);
}
return cell;
}

/*
* 列头单元格样式
*/
public CellStyle getColumnTopStyle(SXSSFWorkbook workbook) {

// 设置字体
Font font = workbook.createFont();
// 设置字体大小
font.setFontHeightInPoints((short) 18);
// 字体加粗
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
// 设置字体名字
font.setFontName("Courier New");
// 设置样式;
CellStyle style = workbook.createCellStyle();
// 设置底边框;
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
// 设置底边框颜色;
style.setBottomBorderColor(HSSFColor.BLACK.index);
// 设置左边框;
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
// 设置左边框颜色;
style.setLeftBorderColor(HSSFColor.BLACK.index);
// 设置右边框;
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
// 设置右边框颜色;
style.setRightBorderColor(HSSFColor.BLACK.index);
// 设置顶边框;
style.setBorderTop(HSSFCellStyle.BORDER_THIN);
// 设置顶边框颜色;
style.setTopBorderColor(HSSFColor.BLACK.index);
// 在样式用应用设置的字体;
style.setFont(font);
// 设置自动换行;
style.setWrapText(false);
// 设置水平对齐的样式为居中对齐;
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
// 设置垂直对齐的样式为居中对齐;
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);

return style;

}
}


3、封装数据

将需要导出的数据封装成一个List<Object[]>的集合

String[] headers是导出excel的头部

private List<Object[]> getListData(String sql,String[] headers) throws ParseException{
Object[] objs = null;
List<Object[]> dataList = new ArrayList<Object[]>();
List list = orderService.findOrderListBySQL(sql);//查询数据的方法
if(null != list && list.size() > 0){
for(int i = 0 ; i <list.size() ; i ++){
objs = new Object[headers.length];
Map map = (Map) list.get(i);
//将数据封装到List<Object[]>数组中
objs[0] = orderId;
objs[1] = payTime;

dataList.add(objs);
}
}

return dataList;
}


4、导出

OutputStream outputStream = response.getOutputStream();
List<Object[]> dataList = getListData(sql, titles);
String sheetName = new String((sdf.format(sdf.parse(cbeginpayTime)) + "订单管理报表").getBytes(),"UTF-8");


ExportUtil exportUtil = new ExportUtil(sheetName,titles,dataList);

//SXSSFWorkbook 大批量数据导出
SXSSFWorkbook workBook = exportUtil.export();
workBook.write(outputStream);
outputStream.flush();
outputStream.close();




2017-07-27 13:47:36 mingshen3 阅读数 1358
  • 基于SSM的POI导入导出Excel实战

    本课程将给大家分享如何基于SSM实现POI导入导出Excel,并讲解目前企业级JavaWeb应用mvc三层模式的开发流程,可让初学者或者职场萌新掌握如何基于SSM整合第三方框架并采用mvc三层开发模式实现自己的业务模块!

    1272 人正在学习 去看看 钟林森
通过传入实体类数组和指定导出列来即可,导出excel,读者可直接复制到项目直接使用,下面只是个简单的示例提供参考

一、导出excel工具类代码
  1. /**
  2. * 导出实体类
  3. * @param head 表头
  4. * @param exportColumn 导出字段
  5. * @param exportList 实体数组
  6. * @param clazz 实体类
  7. * @return
  8. * @throws Exception
  9. */
  10. public SXSSFWorkbook export(String[] head,String[] exportColumn,List exportList,Class clazz) throws Exception{
  11. XSSFWorkbook wb = new XSSFWorkbook ();
  12. SXSSFWorkbook swb=new SXSSFWorkbook(wb,1000);
  13. //swb.createSheet()
  14. //创建第一个sheet(页),命名为 new sheet
  15. SXSSFSheet sheet = null;
  16. sheet = (SXSSFSheet) swb.createSheet("myData");
  17. //创建head
  18. SXSSFRow heqadrow = sheet.createRow(0);
  19. int headlen = head.length;
  20. for(int i=0;i<headlen;i++) {
  21. heqadrow.createCell(i).setCellValue(head[i]);
  22. }
  23. //获取导出列
  24. List<String> columnNameList = new ArrayList<String>();
  25. if(exportColumn!=null&&exportColumn.length>0) {
  26. int columnNameLen = exportColumn.length;
  27. for(int i=0;i<columnNameLen;i++){
  28. columnNameList.add(exportColumn[i]);
  29. }
  30. } else {//通过反射获取所有列
  31. //暂未实现
  32. System.err.println("请指明导出列");
  33. }
  34. //导出列
  35. int exportListLen = exportList.size();
  36. List<Method> methodList = new ArrayList<Method>();
  37. int columnNameListLen = columnNameList.size();
  38. for(int i=0;i<columnNameListLen;i++){
  39. String methodName= "get".concat(captureName(columnNameList.get(i).toLowerCase()));
  40. Method method = clazz.getMethod(methodName);
  41. methodList.add(method);
  42. }
  43. for(int i=1;i<=exportListLen;i++){
  44. Object entity = exportList.get(i-1);
  45. SXSSFRow row = sheet.createRow(i);
  46. for(int j=0;j<columnNameListLen;j++) {
  47. Object value = methodList.get(j).invoke(entity);
  48. if(value!=null) {
  49. row.createCell(j).setCellValue(value.toString());
  50. }
  51. }
  52. }
  53. //写入文件
  54. /*FileOutputStream fos = new FileOutputStream("e:\\txt.xls");
  55. swb.write(fos);
  56. fos.flush();*/
  57. return swb;
  58. }
二、导出excel的controller下载部分
  1. SXSSFWorkbook wb = eu.export(head, exportColumn, easyJson.getRows(), TReportyszxqk.class);
  2. OutputStream output=response.getOutputStream(); //response为springMVC传入的httpservletResponse
  3. response.reset();
  4. response.setHeader("Content-disposition", "attachment; filename=details.xls");
  5. response.setContentType("application/msexcel");
  6. wb.write(output);
  7. output.close();
三、前端下载部分
1.html
  1. <form action="exportYszx" style="display:none" id="downForm" method="post">
  2. </form>
  1. <button id="btn_export"> 导出</button>
2.js
  1. $("#btn_export").click(function(){
  2. $("#downForm").empty();
  3. for(var key in searchData){
  4. var input = "<input name='"+key+"'value='"+searchData[key]+"'>";
  5. $("#downForm").append(input)
  6. }
  7. $("#downForm").submit();
  8. })


2018-11-13 20:40:46 qq_16855077 阅读数 110
  • 基于SSM的POI导入导出Excel实战

    本课程将给大家分享如何基于SSM实现POI导入导出Excel,并讲解目前企业级JavaWeb应用mvc三层模式的开发流程,可让初学者或者职场萌新掌握如何基于SSM整合第三方框架并采用mvc三层开发模式实现自己的业务模块!

    1272 人正在学习 去看看 钟林森

前提:

由于本人采取的是利用反射的方式,这样的好处,可以兼容,导出所有类型的数据,例如,订单,充值记录等等。

既然是公有的接口,肯定有一定的约束规范。

(1)导出的表头需要自己设置一个动态数组

(2) 头部的宽度需要自己设置,也可以自己写一个方法,根据字体的长度,形成一个头部的动态数组长度。

(3)返回的实体类,一定要遵循,跟头部一一对应的原则,例如:

导出的实体类,name要显示在excel的第一列,名字就得放在number这个字段的前面

1.pom.xml配置

<!-- poi -->
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi</artifactId>
			<version>3.8</version>
		</dependency>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml</artifactId>
			<version>3.8</version>
		</dependency>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-scratchpad</artifactId>
			<version>3.8</version>
		</dependency>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml-schemas</artifactId>
			<version>3.8</version>
		</dependency>

2.前端代码

2.1jsp页面代码

 <div class="float-r">
		<a class="red_btn_big addOrEditFoodCategory" type="add" onclick="list.exportReCharge()">+ 导出充值记录</a>
</div>

2.2 js代码

	/**
		 * 导出充值交易信息
		 */
		exportReCharge : function() {
			var methodOfPayment = $('#methodOfPayment option:selected').val();
			var paymentStatus = $('#paymentStatus option:selected').val();
			var serviceType = $('#serviceType option:selected').val();
			var startTime = $('#date0').val();
			var endTime = $('#date1').val();
			var keywords = $('#keywords').val();
			layer.confirm('确定导出充值数据吗?', {
				icon : 3,
				title : '提示'
			}, function(index) {
				window.location.href = "export?search=" + keywords
						+ "&channels=" + methodOfPayment + "&state="
						+ paymentStatus + "&serviceType=" + serviceType
						+ "&startTime=" + startTime + "&endTime=" + endTime;
				layer.close(index);
			});
		}

2.3后台controller代码

@RequestMapping("export")
	public void exportCharge(HttpServletRequest request, HttpServletResponse response, OrderExportVo exportVo) {
		Principal principal = getLoginAdminInfo();
		if (null == principal) {
			logger.info("--------------获取登录用户身份信息为空!");
			return;
		}
		HashMap<String, Object> conditionMap = new HashMap<>();

		try {
			boolean superAdmin = false; // 是否为超级管理员
			if(principal.getOperatorId() != null && StringUtils.isBlank(principal.getTreeIds())){// 非超级管理员
				superAdmin = true;
			} 

			PayOrderInfo payOrderInfo = new PayOrderInfo();
			payOrderInfo.setState(exportVo.getState());
			payOrderInfo.setServiceType(exportVo.getServiceType());
			payOrderInfo.setChannels(exportVo.getChannels());
			
			conditionMap.put("payOrderInfo", payOrderInfo);
			conditionMap.put("superAdmin", superAdmin);
			conditionMap.put("operatorId", principal.getOperatorId());
			conditionMap.put("adminId", principal.getTreeIds());
			conditionMap.put("search", exportVo.getSearch());
			conditionMap.put("startTime", exportVo.getStartTime());
			conditionMap.put("endTime", exportVo.getEndTime());
			Collection<OrderVo> dataset = payOrderInfoMapper.getPayOrderList(conditionMap);
			
			
			for (OrderVo orderVo : dataset) {
				String channelsName = "";
				if(orderVo.getChannels() != null){
					channelsName = ChannelsType.getType(orderVo.getChannels()).getDesc();
				}
				orderVo.setChannelsName(channelsName);
				orderVo.setStateName(OrderState.getType(orderVo.getState()).getDesc());
				String serviceTypeName="";
				if(orderVo.getServiceType() != null){
					serviceTypeName = ServiceType.getType(orderVo.getServiceType()).getDesc();
				}
				orderVo.setServiceTypeName(serviceTypeName);
			}
			
			ExportExcelUtils<OrderVo> excelUtils = new ExportExcelUtils<>();
			SXSSFWorkbook exportExcel = null;
			String[] headers = { "用户名","手机号","充值金额","退款金额", "余额", "充值平台", "订单号", "支付时间", "支付状态", "支付类型", "操作者" };
			int[] widths = {68,90,80,80,80,85,189,140,68,68,68};
			exportExcel = excelUtils.exportExcel("充值", headers,widths, dataset, response.getOutputStream());
			String currentDate = TimeUtils.getCurrentTimeStr("yyyyMMddHHmmss");
			excelUtils.createSXSSFWorkbook(exportExcel, response, "充值记录" + currentDate + ".xlsx");
		} catch (IOException e) {
			logger.info("导出充值交易记录失败!", e.getMessage());
		}
	}

2.4 excel辅助类

package com.parwa.web.util;

import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFPatriarch;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
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.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Drawing;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.IndexedColors;
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.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
 * 导出Excel工具 
 * @author wude
 *
 * @param <T>
 */
public class ExportExcelUtils<T> {
	private static final Logger logger = LoggerFactory.getLogger(ExportExcelUtils.class);

	public void exportExcel(String title, Collection<T> dataset, OutputStream out) {
		exportExcel(title, null, dataset, out, "yyyy-MM-dd HH:mm:ss");
	}
	
	public void exportExcel(String title, String[] headers, Collection<T> dataset, OutputStream out) {
		exportExcel(title, headers, dataset, out, "yyyy-MM-dd HH:mm:ss");
	}
	
	/**
	 * 生成excel
	 * @param title     sheet名称
	 * @param headers   表头
	 * @param width     宽
	 * @param dataset   当前list对象
	 * @param out 
	 * @return
	 */
	public SXSSFWorkbook exportExcel(String title, String[] headers,int[] width,Collection<T> dataset, OutputStream out) {
		SXSSFWorkbook exportExcel = exportBigDataExcel(title, headers,width,dataset, out, "yyyy-MM-dd HH:mm:ss");
		return exportExcel;
	}
	
	/**
	 * 创建excel文档
	 * @param wb
	 * @param response
	 * @param fileName   文件名称
	 * @throws IOException
	 */
    public  void createSXSSFWorkbook(Workbook wb,HttpServletResponse response,String fileName) throws IOException {
        ServletOutputStream out = null;
        try {
            // 设置响应头
            response.addHeader("Content-Disposition", "attachment;filename="
                    + new String(fileName.getBytes("GBK"), "ISO8859_1"));
            out = response.getOutputStream();
            wb.write(out);
        } catch (Exception e) {
        	logger.info("导出excel报错!",e.getMessage());
        } finally {
            if (out != null) {
                    out.close();
            }
        }
    }
	
	
	/**
	 * 利用了JAVA的反射机制,可以将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上
	 * @param title 表格标题名
	 * @param title 列宽度
	 * @param headers 表格属性列名数组
	 * @param dataset 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)
	 * @param out 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
	 * @param pattern 如果有时间数据,设定输出格式。默认为"yyy-MM-dd HH:mm:ss"
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public SXSSFWorkbook exportBigDataExcel(String title, String[] headers,int[] width,Collection<T> dataset, OutputStream out, String pattern) {
		/** 声明一个工作簿 **/
		SXSSFWorkbook workbook = new SXSSFWorkbook(100);   //100为内存缓存数据
		if (dataset == null || dataset.size() == 0) {
	            // 防止数据为空的情况下,excel无法打开
			workbook.createSheet();
	        return workbook;
	    }
		/** 声明一个表格 **/
		Sheet sheet = workbook.createSheet(title);
		/** 设置表格默认列宽度为15个字节 **/
		sheet.setDefaultColumnWidth((int) 16);
		sheet.autoSizeColumn(1);
		/** 生成样式,用于表格标题行 **/
		CellStyle style = workbook.createCellStyle();
		/** 设置样式 **/
		style.setFillForegroundColor(IndexedColors.LEMON_CHIFFON.index);
	    style.setFillPattern(CellStyle.SOLID_FOREGROUND);
	    style.setBorderBottom(CellStyle.BORDER_THIN);
	    style.setBorderLeft(CellStyle.BORDER_THIN);
	    style.setBorderRight(CellStyle.BORDER_THIN);
	    style.setBorderTop(CellStyle.BORDER_THIN);
	    style.setAlignment(CellStyle.ALIGN_CENTER);
	    /** 生成字体 **/
	    Font font = workbook.createFont();
	    font.setColor(IndexedColors.VIOLET.index);
	    font.setFontHeightInPoints((short) 13);
	    font.setBoldweight(Font.BOLDWEIGHT_BOLD);
	    /** 将字体应用到样式中 **/
	    style.setFont(font);
	    
	    /** 样式二,用于表格内容行 **/
	    CellStyle style2 = workbook.createCellStyle();
	    style2.setFillForegroundColor(IndexedColors.WHITE.index);
	    style2.setFillPattern(CellStyle.SOLID_FOREGROUND);
	    style2.setBorderBottom(CellStyle.BORDER_THIN);
	    style2.setBorderLeft(CellStyle.BORDER_THIN);
	    style2.setBorderRight(CellStyle.BORDER_THIN);
	    style2.setBorderTop(CellStyle.BORDER_THIN);
	    style2.setAlignment(CellStyle.ALIGN_CENTER); //水平布局:居中;
	    style2.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
      	/** 字体二 **/
	    Font font2 = workbook.createFont();
	    font.setFontHeightInPoints((short) 12);
	    font2.setBoldweight(Font.BOLDWEIGHT_NORMAL);
	    font2.setColor(IndexedColors.BLACK.index);
	    style2.setFont(font2);
	    /** 声明画图顶级管理器 **/
	    Drawing patriarch = sheet.createDrawingPatriarch();
	    
	    /** 设置表格标题行 **/
	    Row row = sheet.createRow(0);
	    for (int i = 0; i < headers.length; i++) {
	       Cell cell = row.createCell(i);
	       cell.setCellStyle(style);
	       XSSFRichTextString text = new XSSFRichTextString(headers[i]);
	       cell.setCellValue(text);
	       sheet.setColumnWidth(i, (int) (width[i] * 35.7));
	    }
	    
	    /** 以下是数据内容 **/
	    Iterator<T> it = dataset.iterator();
	    int index = 0;
	    while(it.hasNext() && it != null){
	    	index++;
	    	row = sheet.createRow(index);
	    	T t = (T) it.next();
	    	/** 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值 **/
	    	Field[] fields = t.getClass().getDeclaredFields();
	    	for(int i = 0;i < fields.length;i++){
	    		if(i == headers.length){
	    			break;
	    		}
	    		Cell cell = row.createCell(i);
	            
	            Field field = fields[i];
	            String fieldName = field.getName();
	            String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
	            
	            try {
	                Class tCls = t.getClass();
	                Method getMethod = tCls.getMethod(getMethodName, new Class[] {});
	                Object value = getMethod.invoke(t, new Object[] {});
	                /** 判断值的类型后进行强制类型转换 **/
	                String textValue = null;
	                if (value instanceof Boolean) {
	                	boolean bValue = (Boolean) value;
	                	textValue = "是";
	                	if (!bValue) {
	                		textValue ="否";
	                	}
	                } else if (value instanceof Date) {
	                	Date date = (Date) value;
	                	SimpleDateFormat sdf = new SimpleDateFormat(pattern);
	                    textValue = sdf.format(date);
	                } else if (value instanceof byte[]) {
	                	/** 有图片时,设置行高为60px **/
	                	row.setHeightInPoints(60);
	                	/** 设置图片所在列宽度为80px,注意这里单位的一个换算 **/
	                	sheet.setColumnWidth(i, (short) (35.7 * 80));
	                	byte[] bsValue = (byte[]) value;
	                	XSSFClientAnchor anchor = new XSSFClientAnchor(0, 0, 1023, 255, (short) 6, index, (short) 6, index);
	                 	anchor.setAnchorType(2);
	                	patriarch.createPicture(anchor, workbook.addPicture(bsValue, Workbook.PICTURE_TYPE_JPEG));
	                } else if(value instanceof Calendar){
	                	Calendar cale = Calendar.getInstance();  
	                	Date tasktime = cale.getTime();  
	                	SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	                	textValue = df.format(tasktime);
	                } else{
	                	/** 其它数据类型都当作字符串简单处理 **/
	                	if(value != null){
	                		textValue = value.toString();
	                	}
	                }
	                /** 如果不是图片数据,就利用正则表达式判断textValue是否全部由数字组成 **/
	                if(textValue!=null){
	                	Pattern p = Pattern.compile("^//d+(//.//d+)?$");  
	                	Matcher matcher = p.matcher(textValue);
	                	if(matcher.matches()){
	                		/** 是数字当作double处理 **/
	                		cell.setCellValue(Double.parseDouble(textValue));
	                   }else{
	                	   XSSFRichTextString richString = new XSSFRichTextString(textValue);
	                	   Font font3 = workbook.createFont();
	                	   font3.setColor(IndexedColors.BLACK.index);
	                	   richString.applyFont(font3);
	                	   cell.setCellValue(richString);
	                   }
	                }else{
	                	cell.setCellValue("");
	                }
	            } catch (Exception e) {
	            	e.printStackTrace();
	            	logger.info("导出excel报错!",e.getMessage());
	            } finally {
	                //清理资源
	            }
	            cell.setCellStyle(style2);
	    	}
	    }
		return workbook;
	}
	
	/**
	 * 利用了JAVA的反射机制,可以将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上
	 * @param title 表格标题名
	 * @param headers 表格属性列名数组
	 * @param dataset 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)
	 * @param out 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
	 * @param pattern 如果有时间数据,设定输出格式。默认为"yyy-MM-dd HH:mm:ss"
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public HSSFWorkbook exportExcel(String title, String[] headers, Collection<T> dataset, OutputStream out, String pattern) {
		/** 声明一个工作簿 **/
		HSSFWorkbook workbook = new HSSFWorkbook();
		/** 声明一个表格 **/
		HSSFSheet sheet = workbook.createSheet(title);
		/** 设置表格默认列宽度为15个字节 **/
		sheet.setDefaultColumnWidth((int) 16);
		sheet.autoSizeColumn(1);
		/** 生成样式,用于表格标题行 **/
		HSSFCellStyle style = workbook.createCellStyle();
		/** 设置样式 **/
		style.setFillForegroundColor(HSSFColor.LEMON_CHIFFON.index);
	    style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
	    style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
	    style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
	    style.setBorderRight(HSSFCellStyle.BORDER_THIN);
	    style.setBorderTop(HSSFCellStyle.BORDER_THIN);
	    style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
	    /** 生成字体 **/
	    HSSFFont font = workbook.createFont();
	    font.setColor(HSSFColor.VIOLET.index);
	    font.setFontHeightInPoints((short) 12);
	    font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
	    /** 将字体应用到样式中 **/
	    style.setFont(font);
	    
	    /** 样式二,用于表格内容行 **/
	    HSSFCellStyle style2 = workbook.createCellStyle();
	    style2.setFillForegroundColor(HSSFColor.WHITE.index);
	    style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
	    style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);
	    style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);
	    style2.setBorderRight(HSSFCellStyle.BORDER_THIN);
	    style2.setBorderTop(HSSFCellStyle.BORDER_THIN);
	    style2.setAlignment(HSSFCellStyle.ALIGN_LEFT);
	    style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
      	/** 字体二 **/
	    HSSFFont font2 = workbook.createFont();
	    font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
	    font2.setColor(HSSFColor.BLACK.index);
	    style2.setFont(font2);
	    /** 声明画图顶级管理器 **/
	    HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
	    
	    /** 设置表格标题行 **/
	    HSSFRow row = sheet.createRow(0);
	    for (int i = 0; i < headers.length; i++) {
	       HSSFCell cell = row.createCell(i);
	       cell.setCellStyle(style);
	       HSSFRichTextString text = new HSSFRichTextString(headers[i]);
	       cell.setCellValue(text);
	    }
	    
	    /** 以下是数据内容 **/
	    Iterator<T> it = dataset.iterator();
	    int index = 0;
	    while(it.hasNext() && it != null){
	    	index++;
	    	row = sheet.createRow(index);
	    	T t = (T) it.next();
	    	/** 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值 **/
	    	Field[] fields = t.getClass().getDeclaredFields();
	    	for(int i = 0;i < fields.length;i++){
	    		HSSFCell cell = row.createCell(i);
	            
	            Field field = fields[i];
	            String fieldName = field.getName();
	            String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
	            
	            try {
	                Class tCls = t.getClass();
	                Method getMethod = tCls.getMethod(getMethodName, new Class[] {});
	                Object value = getMethod.invoke(t, new Object[] {});
	                /** 判断值的类型后进行强制类型转换 **/
	                String textValue = null;
	                if (value instanceof Boolean) {
	                	boolean bValue = (Boolean) value;
	                	textValue = "是";
	                	if (!bValue) {
	                		textValue ="否";
	                	}
	                } else if (value instanceof Date) {
	                	Date date = (Date) value;
	                	SimpleDateFormat sdf = new SimpleDateFormat(pattern);
	                    textValue = sdf.format(date);
	                } else if (value instanceof byte[]) {
	                	/** 有图片时,设置行高为60px **/
	                	row.setHeightInPoints(60);
	                	/** 设置图片所在列宽度为80px,注意这里单位的一个换算 **/
	                	sheet.setColumnWidth(i, (short) (35.7 * 80));
	                	byte[] bsValue = (byte[]) value;
	                	HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 1023, 255, (short) 6, index, (short) 6, index);
	                 	anchor.setAnchorType(2);
	                	patriarch.createPicture(anchor, workbook.addPicture(bsValue, HSSFWorkbook.PICTURE_TYPE_JPEG));
	                } else if(value instanceof Calendar){
	                	Calendar cale = Calendar.getInstance();  
	                	Date tasktime = cale.getTime();  
	                	SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	                	textValue = df.format(tasktime);
	                } else{
	                	/** 其它数据类型都当作字符串简单处理 **/
	                	if(value != null){
	                		textValue = value.toString();
	                	}
	                }
	                /** 如果不是图片数据,就利用正则表达式判断textValue是否全部由数字组成 **/
	                if(textValue!=null){
	                	Pattern p = Pattern.compile("^//d+(//.//d+)?$");  
	                	Matcher matcher = p.matcher(textValue);
	                	if(matcher.matches()){
	                		/** 是数字当作double处理 **/
	                		cell.setCellValue(Double.parseDouble(textValue));
	                   }else{
	                	   HSSFRichTextString richString = new HSSFRichTextString(textValue);
	                	   HSSFFont font3 = workbook.createFont();
	                	   font3.setColor(HSSFColor.BLACK.index);
	                	   richString.applyFont(font3);
	                	   cell.setCellValue(richString);
	                   }
	                }else{
	                	cell.setCellValue("");
	                }
	            } catch (SecurityException e) {
	                e.printStackTrace();
	            } catch (NoSuchMethodException e) {
	                e.printStackTrace();
	            } catch (IllegalArgumentException e) {
	                e.printStackTrace();
	            } catch (IllegalAccessException e) {
	                e.printStackTrace();
	            } catch (InvocationTargetException e) {
	                e.printStackTrace();
	            } finally {
	                //清理资源
	            }
	    	}
	    }
		return workbook;
	}
	
	
	public static void main(String[] args) {
		Timestamp time = TimeUtils.getCurrentTime();
		if(time instanceof Date){
			System.out.println("时间类型");
		}
	}
}

可能存在问题 

实体类

 因为set get是遵守驼峰规则的,按道理生成的get方法应该是getHMaxTemp,但是这里却不是,就是因为h后面接的是大写字母,如果是thMaxTemp,生成的get方法,就是getThMaxTemp,所以编码的时候,保持一个良好的习惯很重要,但是,项目用了一段时间,如果只是这个大小写的问题,就大改动,这样改动量也太大勒,这里我分享另外一种方法。

找到这个工具类的String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);,如上图所示换成下面的图片效果

需要增加一个辅助反射类

ReflectUtil.java


package com.cloudtech.web.util;
 
import java.lang.reflect.Field;
import java.util.ArrayList;

import com.cloudtech.web.entity.RuleCode;
 
public class ReflectUtil {
 
    /**
     * 使用反射设置变量值
     *
     * @param target 被调用对象
     * @param fieldName 被调用对象的字段,一般是成员变量或静态变量,不可是常量!
     * @param value 值
     * @param <T> value类型,泛型
     */
    public static <T> void setValue(Object target,String fieldName,T value) {
        try {
            Class c = target.getClass();
            Field f = c.getDeclaredField(fieldName);
            f.setAccessible(true);
            f.set(target, value);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
 
    /**
     * 使用反射获取变量值
     *
     * @param target 被调用对象
     * @param fieldName 被调用对象的字段,一般是成员变量或静态变量,不可以是常量
     * @param <T> 返回类型,泛型
     * @return 值
     */
    public static <T> T getValue(Object target,String fieldName) {
        T value = null;
        try {
            Class c = target.getClass();
            Field f = c.getDeclaredField(fieldName);
            f.setAccessible(true);
            value = (T) f.get(target);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return value;
    }
    
    public static void main(String[] args) {
		RuleCode code = new RuleCode();
		code.setId(1234);
		//Object value = ReflectUtil.getValue(code, "id");
		System.out.println(code.getId());
    /*	String s ="avgSpd gt hThreeMaxSpd";
    	String replace = s.replace("gt", "");
    	String[] split = replace.split(" ");
    	System.out.println();*/
	}
}

 3.对比

建议用后面这种,毕竟可以兼容实体类字段命名不规范的问题

4.优化后excel辅助类

注意:使用的时候,使用反射方式,去掉多余的代码,使用SXSSFWorkbook,性能更优

package com.cloudtech.web.util;

import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFPatriarch;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
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.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Drawing;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.IndexedColors;
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.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 导出Excel工具
 * 
 * @author wude
 *
 * @param <T>
 */
public class ExportExcelUtils<T> {
	private static final Logger logger = LoggerFactory.getLogger(ExportExcelUtils.class);

	public void exportExcel(String title, Collection<T> dataset, OutputStream out) {
		exportExcel(title, null, dataset, out, "yyyy-MM-dd HH:mm:ss");
	}

	/**
	 * 生成excel
	 * 
	 * @param title
	 *            sheet名称
	 * @param headers
	 *            表头
	 * @param width
	 *            宽
	 * @param dataset
	 *            当前list对象
	 * @param out
	 * @return
	 */
	public SXSSFWorkbook exportExcel(String title, String[] headers, int[] width, Collection<T> dataset,
			OutputStream out) {
		SXSSFWorkbook exportExcel = exportBigDataExcel(title, headers, width, dataset, out, "yyyy-MM-dd HH:mm:ss");
		return exportExcel;
	}

	public SXSSFWorkbook exportMapExcel(String title, String[] headers, int[] width,
			LinkedHashMap<String, LinkedHashMap<String, Object>> dataset, OutputStream out) {
		SXSSFWorkbook exportExcel = exportBigMapDataExcel(title, headers, width, dataset, out, "yyyy-MM-dd HH:mm:ss");
		return exportExcel;
	}

	/**
	 * 创建excel文档
	 * 
	 * @param wb
	 * @param response
	 * @param fileName
	 *            文件名称
	 * @throws IOException
	 */
	public void createSXSSFWorkbook(Workbook wb, HttpServletResponse response, String fileName) throws IOException {
		ServletOutputStream out = null;
		try {
			// 设置响应头
			response.addHeader("Content-Disposition",
					"attachment;filename=" + new String(fileName.getBytes("GBK"), "ISO8859_1"));
			out = response.getOutputStream();
			wb.write(out);
		} catch (Exception e) {
			logger.info("导出excel报错!", e.getMessage());
		} finally {
			if (out != null) {
				out.close();
			}
		}
	}

	/**
	 * 利用了JAVA的反射机制,可以将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上
	 * 
	 * @param title
	 *            表格标题名
	 * @param title
	 *            列宽度
	 * @param headers
	 *            表格属性列名数组
	 * @param dataset
	 *            需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。
	 *            此方法支持的javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)
	 * @param out
	 *            与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
	 * @param pattern
	 *            如果有时间数据,设定输出格式。默认为"yyy-MM-dd HH:mm:ss"
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public SXSSFWorkbook exportBigDataExcel(String title, String[] headers, int[] width, Collection<T> dataset,
			OutputStream out, String pattern) {
		/** 声明一个工作簿 **/
		SXSSFWorkbook workbook = new SXSSFWorkbook(100); // 100为内存缓存数据
		if (dataset == null || dataset.size() == 0) {
			// 防止数据为空的情况下,excel无法打开
			workbook.createSheet();
			return workbook;
		}
		/** 声明一个表格 **/
		Sheet sheet = workbook.createSheet(title);
		/** 设置表格默认列宽度为15个字节 **/
		sheet.setDefaultColumnWidth((int) 16);
		sheet.autoSizeColumn(1);
		/** 生成样式,用于表格标题行 **/
		CellStyle style = workbook.createCellStyle();
		/** 设置样式 **/
		style.setFillForegroundColor(IndexedColors.LEMON_CHIFFON.index);
		style.setFillPattern(CellStyle.SOLID_FOREGROUND);
		style.setBorderBottom(CellStyle.BORDER_THIN);
		style.setBorderLeft(CellStyle.BORDER_THIN);
		style.setBorderRight(CellStyle.BORDER_THIN);
		style.setBorderTop(CellStyle.BORDER_THIN);
		style.setAlignment(CellStyle.ALIGN_CENTER);
		/** 生成字体 **/
		Font font = workbook.createFont();
		font.setColor(IndexedColors.VIOLET.index);
		font.setFontHeightInPoints((short) 13);
		font.setBoldweight(Font.BOLDWEIGHT_BOLD);
		/** 将字体应用到样式中 **/
		style.setFont(font);

		/** 样式二,用于表格内容行 **/
		CellStyle style2 = workbook.createCellStyle();
		style2.setFillForegroundColor(IndexedColors.WHITE.index);
		style2.setFillPattern(CellStyle.SOLID_FOREGROUND);
		style2.setBorderBottom(CellStyle.BORDER_THIN);
		style2.setBorderLeft(CellStyle.BORDER_THIN);
		style2.setBorderRight(CellStyle.BORDER_THIN);
		style2.setBorderTop(CellStyle.BORDER_THIN);
		style2.setAlignment(CellStyle.ALIGN_CENTER); // 水平布局:居中;
		style2.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
		/** 字体二 **/
		Font font2 = workbook.createFont();
		font.setFontHeightInPoints((short) 12);
		font2.setBoldweight(Font.BOLDWEIGHT_NORMAL);
		font2.setColor(IndexedColors.BLACK.index);
		style2.setFont(font2);
		/** 声明画图顶级管理器 **/
		Drawing patriarch = sheet.createDrawingPatriarch();

		/** 设置表格标题行 **/
		Row row = sheet.createRow(0);
		for (int i = 0; i < headers.length; i++) {
			Cell cell = row.createCell(i);
			cell.setCellStyle(style);
			XSSFRichTextString text = new XSSFRichTextString(headers[i]);
			cell.setCellValue(text);
			sheet.setColumnWidth(i, (int) (width[i] * 35.7));
		}

		/** 以下是数据内容 **/
		Iterator<T> it = dataset.iterator();
		int index = 0;
		while (it.hasNext() && it != null) {
			index++;
			row = sheet.createRow(index);
			T t = (T) it.next();
			/** 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值 **/
			Field[] fields = t.getClass().getDeclaredFields();
			for (int i = 0; i < fields.length; i++) {
				if (i == headers.length) {
					break;
				}
				Cell cell = row.createCell(i);

				Field field = fields[i];
				String fieldName = field.getName();

				try {
					Object value = ReflectUtil.getValue(t, fieldName);
					/** 判断值的类型后进行强制类型转换 **/
					String textValue = null;
					if (value == null) {
						cell.setCellValue("");
					} else {
						if (value instanceof Boolean) {
							boolean bValue = (Boolean) value;
							textValue = "是";
							if (!bValue) {
								textValue = "否";
							}
							cell.setCellValue(textValue);
						} else if (value instanceof Date) {
							Date date = (Date) value;
							SimpleDateFormat sdf = new SimpleDateFormat(pattern);
							textValue = sdf.format(date);
							cell.setCellValue(textValue);
						} else if (value instanceof Integer) {
							if (value != null) {
								int intValue = new BigDecimal(value.toString()).intValue();
								cell.setCellValue(intValue);
							}
						} else {
							/** 其它数据类型都当作字符串简单处理 **/
							if (value != null) {
								textValue = value.toString();
								cell.setCellValue(textValue);
							}
						}
					}
				} catch (Exception e) {
					e.printStackTrace();
					logger.info("导出excel报错!", e.getMessage());
				} finally {
					// 清理资源
				}
				cell.setCellStyle(style2);
			}
		}
		return workbook;
	}

	@SuppressWarnings({ "rawtypes", "unchecked" })
	public SXSSFWorkbook exportBigMapDataExcel(String title, String[] headers, int[] width,
			LinkedHashMap<String, LinkedHashMap<String, Object>> dataset, OutputStream out, String pattern) {
		/** 声明一个工作簿 **/
		SXSSFWorkbook workbook = new SXSSFWorkbook(100); // 100为内存缓存数据
		if (dataset == null || dataset.size() == 0) {
			// 防止数据为空的情况下,excel无法打开
			workbook.createSheet();
			return workbook;
		}
		/** 声明一个表格 **/
		Sheet sheet = workbook.createSheet(title);
		/** 设置表格默认列宽度为15个字节 **/
		sheet.setDefaultColumnWidth((int) 16);
		sheet.autoSizeColumn(1);
		/** 生成样式,用于表格标题行 **/
		CellStyle style = workbook.createCellStyle();
		/** 设置样式 **/
		style.setFillForegroundColor(IndexedColors.LEMON_CHIFFON.index);
		style.setFillPattern(CellStyle.SOLID_FOREGROUND);
		style.setBorderBottom(CellStyle.BORDER_THIN);
		style.setBorderLeft(CellStyle.BORDER_THIN);
		style.setBorderRight(CellStyle.BORDER_THIN);
		style.setBorderTop(CellStyle.BORDER_THIN);
		style.setAlignment(CellStyle.ALIGN_CENTER);
		/** 生成字体 **/
		Font font = workbook.createFont();
		font.setColor(IndexedColors.VIOLET.index);
		font.setFontHeightInPoints((short) 13);
		font.setBoldweight(Font.BOLDWEIGHT_BOLD);
		/** 将字体应用到样式中 **/
		style.setFont(font);

		/** 样式二,用于表格内容行 **/
		CellStyle style2 = workbook.createCellStyle();
		style2.setFillForegroundColor(IndexedColors.WHITE.index);
		style2.setFillPattern(CellStyle.SOLID_FOREGROUND);
		style2.setBorderBottom(CellStyle.BORDER_THIN);
		style2.setBorderLeft(CellStyle.BORDER_THIN);
		style2.setBorderRight(CellStyle.BORDER_THIN);
		style2.setBorderTop(CellStyle.BORDER_THIN);
		style2.setAlignment(CellStyle.ALIGN_CENTER); // 水平布局:居中;
		style2.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
		/** 字体二 **/
		Font font2 = workbook.createFont();
		font.setFontHeightInPoints((short) 12);
		font2.setBoldweight(Font.BOLDWEIGHT_NORMAL);
		font2.setColor(IndexedColors.BLACK.index);
		style2.setFont(font2);
		/** 声明画图顶级管理器 **/
		Drawing patriarch = sheet.createDrawingPatriarch();

		/** 设置表格标题行 **/
		Row row = sheet.createRow(0);
		for (int i = 0; i < headers.length; i++) {
			Cell cell = row.createCell(i);
			cell.setCellStyle(style);
			XSSFRichTextString text = new XSSFRichTextString(headers[i]);
			cell.setCellValue(text);
			sheet.setColumnWidth(i, (int) (width[i] * 35.7));
		}

		/** 以下是数据内容 **/
		int index = 0;
		for (Entry<String, LinkedHashMap<String, Object>> key : dataset.entrySet()) {
			index++;
			row = sheet.createRow(index);

			Cell cell = row.createCell(0);
			cell.setCellValue(key.getKey());
			cell.setCellStyle(style2);

			LinkedHashMap<String, Object> hourValues = key.getValue();
			int i = 1;
			for (Entry<String, Object> hourKey : hourValues.entrySet()) {
				cell = row.createCell(i);
				try {
					/** 判断值的类型后进行强制类型转换 **/
					String textValue = hourKey.getValue().toString();
					cell.setCellValue(textValue);
				} catch (Exception e) {
					e.printStackTrace();
					logger.info("导出excel报错!", e.getMessage());
				} finally {
					// 清理资源
				}
				cell.setCellStyle(style2);
				i++;
			}
		}
		/*
		 * Iterator<T> it = (Iterator<T>) dataset.keySet().iterator(); int index
		 * = 0; while (it.hasNext() && it != null) { index++; row =
		 * sheet.createRow(index); T t = (T) it.next();
		 *//** 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值 **/
		/*
		 * Field[] fields = t.getClass().getDeclaredFields(); for (int i = 0; i
		 * < fields.length; i++) { if (i == headers.length) { break; } Cell cell
		 * = row.createCell(i);
		 * 
		 * Field field = fields[i]; String fieldName = field.getName(); //
		 * String getMethodName = "get" + fieldName.substring(0, //
		 * 1).toUpperCase() + fieldName.substring(1);
		 * 
		 * try { Class tCls = t.getClass(); Object value =
		 * ReflectUtil.getValue(t, fieldName); // Method getMethod =
		 * tCls.getMethod(getMethodName, new // Class[] {}); // Object value =
		 * getMethod.invoke(t, new Object[] {});
		 *//** 判断值的类型后进行强制类型转换 **/
		/*
		 * String textValue = null; if (value instanceof Boolean) { boolean
		 * bValue = (Boolean) value; textValue = "是"; if (!bValue) { textValue =
		 * "否"; } } else if (value instanceof Date) { Date date = (Date) value;
		 * SimpleDateFormat sdf = new SimpleDateFormat(pattern); textValue =
		 * sdf.format(date); } else if (value instanceof byte[]) {
		 *//** 有图片时,设置行高为60px **/
		/*
		 * row.setHeightInPoints(60);
		 *//** 设置图片所在列宽度为80px,注意这里单位的一个换算 **/
		/*
		 * sheet.setColumnWidth(i, (short) (35.7 * 80)); byte[] bsValue =
		 * (byte[]) value; XSSFClientAnchor anchor = new XSSFClientAnchor(0, 0,
		 * 1023, 255, (short) 6, index, (short) 6, index);
		 * anchor.setAnchorType(2); patriarch.createPicture(anchor,
		 * workbook.addPicture(bsValue, Workbook.PICTURE_TYPE_JPEG)); } else if
		 * (value instanceof Calendar) { Calendar cale = Calendar.getInstance();
		 * Date tasktime = cale.getTime(); SimpleDateFormat df = new
		 * SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); textValue =
		 * df.format(tasktime); } else {
		 *//** 其它数据类型都当作字符串简单处理 **/
		/*
		 * if (value != null) { textValue = value.toString(); } }
		 *//** 如果不是图片数据,就利用正则表达式判断textValue是否全部由数字组成 **/
		/*
		 * if (textValue != null) { Pattern p =
		 * Pattern.compile("^//d+(//.//d+)?$"); Matcher matcher =
		 * p.matcher(textValue); if (matcher.matches()) {
		 *//** 是数字当作double处理 **//*
								 * cell.setCellValue(Double.parseDouble(
								 * textValue)); } else { XSSFRichTextString
								 * richString = new
								 * XSSFRichTextString(textValue); Font font3 =
								 * workbook.createFont();
								 * font3.setColor(IndexedColors.BLACK.index);
								 * richString.applyFont(font3);
								 * cell.setCellValue(richString); } } else {
								 * cell.setCellValue(""); } } catch (Exception
								 * e) { e.printStackTrace();
								 * logger.info("导出excel报错!", e.getMessage()); }
								 * finally { // 清理资源 }
								 * cell.setCellStyle(style2); } }
								 */
		return workbook;
	}

	/**
	 * 利用了JAVA的反射机制,可以将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上
	 * 
	 * @param title
	 *            表格标题名
	 * @param headers
	 *            表格属性列名数组
	 * @param dataset
	 *            需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。
	 *            此方法支持的javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)
	 * @param out
	 *            与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
	 * @param pattern
	 *            如果有时间数据,设定输出格式。默认为"yyy-MM-dd HH:mm:ss"
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public HSSFWorkbook exportExcel(String title, String[] headers, Collection<T> dataset, OutputStream out,
			String pattern) {
		/** 声明一个工作簿 **/
		HSSFWorkbook workbook = new HSSFWorkbook();
		/** 声明一个表格 **/
		HSSFSheet sheet = workbook.createSheet(title);
		/** 设置表格默认列宽度为15个字节 **/
		sheet.setDefaultColumnWidth((int) 16);
		sheet.autoSizeColumn(1);
		/** 生成样式,用于表格标题行 **/
		HSSFCellStyle style = workbook.createCellStyle();
		/** 设置样式 **/
		style.setFillForegroundColor(HSSFColor.LEMON_CHIFFON.index);
		style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
		style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
		style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
		style.setBorderRight(HSSFCellStyle.BORDER_THIN);
		style.setBorderTop(HSSFCellStyle.BORDER_THIN);
		style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
		/** 生成字体 **/
		HSSFFont font = workbook.createFont();
		font.setColor(HSSFColor.VIOLET.index);
		font.setFontHeightInPoints((short) 12);
		font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
		/** 将字体应用到样式中 **/
		style.setFont(font);

		/** 样式二,用于表格内容行 **/
		HSSFCellStyle style2 = workbook.createCellStyle();
		style2.setFillForegroundColor(HSSFColor.WHITE.index);
		style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
		style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);
		style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);
		style2.setBorderRight(HSSFCellStyle.BORDER_THIN);
		style2.setBorderTop(HSSFCellStyle.BORDER_THIN);
		style2.setAlignment(HSSFCellStyle.ALIGN_LEFT);
		style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
		/** 字体二 **/
		HSSFFont font2 = workbook.createFont();
		font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
		font2.setColor(HSSFColor.BLACK.index);
		style2.setFont(font2);
		/** 声明画图顶级管理器 **/
		HSSFPatriarch patriarch = sheet.createDrawingPatriarch();

		/** 设置表格标题行 **/
		HSSFRow row = sheet.createRow(0);
		for (int i = 0; i < headers.length; i++) {
			HSSFCell cell = row.createCell(i);
			cell.setCellStyle(style);
			HSSFRichTextString text = new HSSFRichTextString(headers[i]);
			cell.setCellValue(text);
		}

		/** 以下是数据内容 **/
		Iterator<T> it = dataset.iterator();
		int index = 0;
		while (it.hasNext() && it != null) {
			index++;
			row = sheet.createRow(index);
			T t = (T) it.next();
			/** 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值 **/
			Field[] fields = t.getClass().getDeclaredFields();
			for (int i = 0; i < fields.length; i++) {
				HSSFCell cell = row.createCell(i);

				Field field = fields[i];
				String fieldName = field.getName();
				String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);

				try {
					Class tCls = t.getClass();
					Method getMethod = tCls.getMethod(getMethodName, new Class[] {});
					Object value = getMethod.invoke(t, new Object[] {});
					/** 判断值的类型后进行强制类型转换 **/
					String textValue = null;
					if (value instanceof Boolean) {
						boolean bValue = (Boolean) value;
						textValue = "是";
						if (!bValue) {
							textValue = "否";
						}
					} else if (value instanceof Date) {
						Date date = (Date) value;
						SimpleDateFormat sdf = new SimpleDateFormat(pattern);
						textValue = sdf.format(date);
					} else if (value instanceof byte[]) {
						/** 有图片时,设置行高为60px **/
						row.setHeightInPoints(60);
						/** 设置图片所在列宽度为80px,注意这里单位的一个换算 **/
						sheet.setColumnWidth(i, (short) (35.7 * 80));
						byte[] bsValue = (byte[]) value;
						HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 1023, 255, (short) 6, index, (short) 6,
								index);
						anchor.setAnchorType(2);
						patriarch.createPicture(anchor, workbook.addPicture(bsValue, HSSFWorkbook.PICTURE_TYPE_JPEG));
					} else if (value instanceof Calendar) {
						Calendar cale = Calendar.getInstance();
						Date tasktime = cale.getTime();
						SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
						textValue = df.format(tasktime);
					} else {
						/** 其它数据类型都当作字符串简单处理 **/
						if (value != null) {
							textValue = value.toString();
						}
					}
					/** 如果不是图片数据,就利用正则表达式判断textValue是否全部由数字组成 **/
					if (textValue != null) {
						Pattern p = Pattern.compile("^//d+(//.//d+)?$");
						Matcher matcher = p.matcher(textValue);
						if (matcher.matches()) {
							/** 是数字当作double处理 **/
							cell.setCellValue(Double.parseDouble(textValue));
						} else {
							HSSFRichTextString richString = new HSSFRichTextString(textValue);
							HSSFFont font3 = workbook.createFont();
							font3.setColor(HSSFColor.BLACK.index);
							richString.applyFont(font3);
							cell.setCellValue(richString);
						}
					} else {
						cell.setCellValue("");
					}
				} catch (SecurityException e) {
					e.printStackTrace();
				} catch (NoSuchMethodException e) {
					e.printStackTrace();
				} catch (IllegalArgumentException e) {
					e.printStackTrace();
				} catch (IllegalAccessException e) {
					e.printStackTrace();
				} catch (InvocationTargetException e) {
					e.printStackTrace();
				} finally {
					// 清理资源
				}
			}
		}
		return workbook;
	}

	public static void main(String[] args) {
		Timestamp time = TimeUtils.getCurrentTime();
		if (time instanceof Date) {
			System.out.println("时间类型");
		}
	}

}

4.性能分析

列有69列,导出excel分析

优化前:

通过图片,我们可以发现sql的时间很长,当然跟我的列有关,69列

5w数据需要31.42s,而1w数据是6.5s,我们是不是可以做一些优化。列入拿1w作为切割,5w数据分为5次查询出来,再组装数据,是不是可以提升查询数据。所以,这里需要使用多线程。这样整个导出的时长就短了不少。

 

优化后:

通过数据分析,发现,性能方面有质的提高,而且缓存数大小,性能没有什么明显的提示,所以建议缓存数还是设置为100把 

 

缓存数:

设置为100后,超过100的部分会写入硬盘,而不是所有的都存放在内存中

性能优化部分: 

/** 如果不是图片数据,就利用正则表达式判断textValue是否全部由数字组成 **/
					if (textValue != null) {
						Pattern p = Pattern.compile("^//d+(//.//d+)?$");
						Matcher matcher = p.matcher(textValue);
						if (matcher.matches()) {
							/** 是数字当作double处理 **/
							cell.setCellValue(Double.parseDouble(textValue));
						} else {
							XSSFRichTextString richString = new XSSFRichTextString(textValue);
							Font font3 = workbook.createFont();
							font3.setColor(IndexedColors.BLACK.index);
							richString.applyFont(font3);
							cell.setCellValue(richString);
						}
					} else {
						cell.setCellValue("");
					}

主要是正则方面的判断,消耗勒大量的数据,导致时间很长

2014-05-13 10:44:19 w330685946 阅读数 390
  • 基于SSM的POI导入导出Excel实战

    本课程将给大家分享如何基于SSM实现POI导入导出Excel,并讲解目前企业级JavaWeb应用mvc三层模式的开发流程,可让初学者或者职场萌新掌握如何基于SSM整合第三方框架并采用mvc三层开发模式实现自己的业务模块!

    1272 人正在学习 去看看 钟林森

  在上篇文章中,我们简单介绍了java读取word,excel和pdf文档内容 ,但在实际开发中,我们用到最多的是把数据库中数据导出excel报表形式。不仅仅简单的读取office中的数据.尤其是在生产管理或者财务系统中用的非常普遍,因为这些系统经常要做一些报表打印的工作。而数据导出的格式一般是EXCEL或者PDF 。所以今天我们来简单看一下利用Apache  POI实现数据库中数据导出excel报表。在java中有很多实现数据导出excel报表的第三方jar包。但在比较了一下感觉还是POI相对来说比较好用。如果大家想学习其他的导出方式可以自行研究一下。

 

首先来了解一下 Apache POI

 

     Apache POI 是用Java编写的免费开源的跨平台的 Java APIApache POI提供APIJava程式对Microsoft Office格式档案读和写的功能。Apache POI 是创建和维护操作各种符合Office Open XMLOOXML)标准和微软的OLE 2复合文档格式(OLE2)的Java API。用它可以使用Java读取和创建,修改MS Excel文件.而且,还可以使用Java读取和创建MS WordMSPowerPoint文件。Apache POI 提供Java操作Excel解决方案(适用于Excel97-2008)。 下面我们来看一下Apache POI 中提供的几大部分的作用:

 

 

HSSF - 提供读写Microsoft Excel XLS格式档案的功能。  

XSSF - 提供读写Microsoft Excel OOXML XLSX格式档案的功能。  

HWPF - 提供读写Microsoft Word DOC格式档案的功能。  

HSLF - 提供读写Microsoft PowerPoint格式档案的功能。  

HDGF - 提供读Microsoft Visio格式档案的功能。  

HPBF - 提供读Microsoft Publisher格式档案的功能。  

HSMF - 提供读Microsoft Outlook格式档案的功能。 

 

       本节我们所要学习的是POIexcel的操作。所以我们只需用到HSSF 这部分内容就可以了。其他的请大家自行研究吧。哈哈。

 

 

下面我们就一步一步的来看一下如何创建一个excel报表:

 

1. 创建新的Excel工作薄

 

HSSFWorkbook workbook = new HSSFWorkbook();

Excel工作簿中建一工作表,其名为缺省值。POI中还提供了其他的一些其他的workbook 构造方法。下面我们来看一下:

Java使用POI实现数据导出excel报表_www.fengfly.com

 

 

2.创建一个工作表

如要新建一名为"工资表"的工作表,其语句为:  

HSSFSheet sheet = workbook.createSheet("工资表"); 

 

3.创建行

 在索引0的位置创建行(最顶端的行)  

HSSFRow row = sheet.createRow(0);

 

4.创建单元格

在索引0的位置创建单元格(左上端)  

HSSFCell cell = row.createCell((short) 0);

定义单元格为字符串类型,这个字符串类型也可在创建单元格里面设置。

cell.setCellType(HSSFCell.CELL_TYPE_STRING); 

在单元格中输入一些内容  

cell.setCellValue("增加值"); 

 

5.新建一输出文件流把相应的Excel工作簿 输出到本地

FileOutputStream fOut = new FileOutputStream(outputFile);

workbook.write(fOut);

fOut.flush();

操作结束,关闭文件  

fOut.close(); 

 

      OK,在给单元格设置下从数据库中读取的数据。这样我们就可以把数据库里面的内容导入到excel了。当然这里我们只是简单的介绍了一些POI的用法。并没有细讲,比如设置单元格里面数据的格式。单元格的一些属性设置。这些将会在我下面的例子中用到。也算是给大家一些示例吧。好了。最后看一个实例吧:

 

EXCEL报表工具类:ExportExcel.java

 

  1. package com.bzu.search.action;  
  2.  
  3. import java.io.File;  
  4. import java.io.FileNotFoundException;  
  5. import java.io.FileOutputStream;  
  6. import java.io.IOException;  
  7.  
  8. import org.apache.poi.hssf.usermodel.HSSFCell;  
  9. import org.apache.poi.hssf.usermodel.HSSFCellStyle;  
  10. import org.apache.poi.hssf.usermodel.HSSFFont;  
  11. import org.apache.poi.hssf.usermodel.HSSFRichTextString;  
  12. import org.apache.poi.hssf.usermodel.HSSFRow;  
  13. import org.apache.poi.hssf.usermodel.HSSFSheet;  
  14. import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
  15. import org.apache.poi.hssf.util.HSSFColor;  
  16. import org.apache.poi.hssf.util.Region;  
  17.  
  18. /**  
  19.  * EXCEL报表工具类.  
  20.  *   
  21.  * @author caoyb  
  22.  * @version $Revision:$  
  23.  */ 
  24. public class ExportExcel {  
  25.  
  26.     private HSSFWorkbook wb = null;  
  27.  
  28.     private HSSFSheet sheet = null;  
  29.  
  30.     /**  
  31.      * @param wb  
  32.      * @param sheet  
  33.      */ 
  34.     public ExportExcel(HSSFWorkbook wb, HSSFSheet sheet) {  
  35.         super();  
  36.         this.wb = wb;  
  37.         this.sheet = sheet;  
  38.     }  
  39.  
  40.     /**  
  41.      * @return the sheet  
  42.      */ 
  43.     public HSSFSheet getSheet() {  
  44.         return sheet;  
  45.     }  
  46.  
  47.     /**  
  48.      * @param sheet  
  49.      *            the sheet to set  
  50.      */ 
  51.     public void setSheet(HSSFSheet sheet) {  
  52.         this.sheet = sheet;  
  53.     }  
  54.  
  55.     /**  
  56.      * @return the wb  
  57.      */ 
  58.     public HSSFWorkbook getWb() {  
  59.         return wb;  
  60.     }  
  61.  
  62.     /**  
  63.      * @param wb  
  64.      *            the wb to set  
  65.      */ 
  66.     public void setWb(HSSFWorkbook wb) {  
  67.         this.wb = wb;  
  68.     }  
  69.  
  70.     /**  
  71.      * 创建通用EXCEL头部  
  72.      *   
  73.      * @param headString  
  74.      *            头部显示的字符  
  75.      * @param colSum  
  76.      *            该报表的列数  
  77.      */ 
  78.     public void createNormalHead(String headString, int colSum) {  
  79.  
  80.         HSSFRow row = sheet.createRow(0);  
  81.  
  82.         // 设置第一行  
  83.         HSSFCell cell = row.createCell(0);  
  84.         row.setHeight((short400);  
  85.  
  86.         // 定义单元格为字符串类型  
  87.         cell.setCellType(HSSFCell.ENCODING_UTF_16);  
  88.         cell.setCellValue(new HSSFRichTextString("南京城区各网点进件统计报表"));  
  89.  
  90.         // 指定合并区域  
  91.         sheet.addMergedRegion(new Region(0, (short00, (short) colSum));  
  92.  
  93.         HSSFCellStyle cellStyle = wb.createCellStyle();  
  94.  
  95.         cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定单元格居中对齐  
  96.         cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定单元格垂直居中对齐  
  97.         cellStyle.setWrapText(true);// 指定单元格自动换行  
  98.  
  99.         // 设置单元格字体  
  100.         HSSFFont font = wb.createFont();  
  101.         font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  
  102.         font.setFontName("宋体");  
  103.         font.setFontHeight((short300);  
  104.         cellStyle.setFont(font);  
  105.  
  106.         cell.setCellStyle(cellStyle);  
  107.     }  
  108.  
  109.     /**  
  110.      * 创建通用报表第二行  
  111.      *   
  112.      * @param params  
  113.      *            统计条件数组  
  114.      * @param colSum  
  115.      *            需要合并到的列索引  
  116.      */ 
  117.     public void createNormalTwoRow(String[] params, int colSum) {  
  118.         HSSFRow row1 = sheet.createRow(1);  
  119.         row1.setHeight((short300);  
  120.  
  121.         HSSFCell cell2 = row1.createCell(0);  
  122.  
  123.         cell2.setCellType(HSSFCell.ENCODING_UTF_16);  
  124.         cell2.setCellValue(new HSSFRichTextString("统计时间:" + params[0] + "至" 
  125.                 + params[1]));  
  126.  
  127.         // 指定合并区域  
  128.         sheet.addMergedRegion(new Region(1, (short01, (short) colSum));  
  129.  
  130.         HSSFCellStyle cellStyle = wb.createCellStyle();  
  131.         cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定单元格居中对齐  
  132.         cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定单元格垂直居中对齐  
  133.         cellStyle.setWrapText(true);// 指定单元格自动换行  
  134.  
  135.         // 设置单元格字体  
  136.         HSSFFont font = wb.createFont();  
  137.         font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  
  138.         font.setFontName("宋体");  
  139.         font.setFontHeight((short250);  
  140.         cellStyle.setFont(font);  
  141.  
  142.         cell2.setCellStyle(cellStyle);  
  143.  
  144.     }  
  145.  
  146.     /**  
  147.      * 设置报表标题  
  148.      *   
  149.      * @param columHeader  
  150.      *            标题字符串数组  
  151.      */ 
  152.     public void createColumHeader(String[] columHeader) {  
  153.  
  154.         // 设置列头  
  155.         HSSFRow row2 = sheet.createRow(2);  
  156.  
  157.         // 指定行高  
  158.         row2.setHeight((short600);  
  159.  
  160.         HSSFCellStyle cellStyle = wb.createCellStyle();  
  161.         cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定单元格居中对齐  
  162.         cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定单元格垂直居中对齐  
  163.         cellStyle.setWrapText(true);// 指定单元格自动换行  
  164.  
  165.         // 单元格字体  
  166.         HSSFFont font = wb.createFont();  
  167.         font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  
  168.         font.setFontName("宋体");  
  169.         font.setFontHeight((short250);  
  170.         cellStyle.setFont(font);  
  171.  
  172.         /*  
  173.          * cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 设置单无格的边框为粗体  
  174.          * cellStyle.setBottomBorderColor(HSSFColor.BLACK.index); // 设置单元格的边框颜色.  
  175.          * cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);  
  176.          * cellStyle.setLeftBorderColor(HSSFColor.BLACK.index);  
  177.          * cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);  
  178.          * cellStyle.setRightBorderColor(HSSFColor.BLACK.index);  
  179.          * cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);  
  180.          * cellStyle.setTopBorderColor(HSSFColor.BLACK.index);  
  181.          */ 
  182.  
  183.         // 设置单元格背景色  
  184.         cellStyle.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);  
  185.         cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);  
  186.  
  187.         HSSFCell cell3 = null;  
  188.  
  189.         for (int i = 0; i < columHeader.length; i++) {  
  190.             cell3 = row2.createCell(i);  
  191.             cell3.setCellType(HSSFCell.ENCODING_UTF_16);  
  192.             cell3.setCellStyle(cellStyle);  
  193.             cell3.setCellValue(new HSSFRichTextString(columHeader[i]));  
  194.         }  
  195.  
  196.     }  
  197.  
  198.     /**  
  199.      * 创建内容单元格  
  200.      *   
  201.      * @param wb  
  202.      *            HSSFWorkbook  
  203.      * @param row  
  204.      *            HSSFRow  
  205.      * @param col  
  206.      *            short型的列索引  
  207.      * @param align  
  208.      *            对齐方式  
  209.      * @param val  
  210.      *            列值  
  211.      */ 
  212.     public void cteateCell(HSSFWorkbook wb, HSSFRow row, int col, short align,  
  213.             String val) {  
  214.         HSSFCell cell = row.createCell(col);  
  215.         cell.setCellType(HSSFCell.ENCODING_UTF_16);  
  216.         cell.setCellValue(new HSSFRichTextString(val));  
  217.         HSSFCellStyle cellstyle = wb.createCellStyle();  
  218.         cellstyle.setAlignment(align);  
  219.         cell.setCellStyle(cellstyle);  
  220.     }  
  221.  
  222.     /**  
  223.      * 创建合计行  
  224.      *   
  225.      * @param colSum  
  226.      *            需要合并到的列索引  
  227.      * @param cellValue  
  228.      */ 
  229.     public void createLastSumRow(int colSum, String[] cellValue) {  
  230.  
  231.         HSSFCellStyle cellStyle = wb.createCellStyle();  
  232.         cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定单元格居中对齐  
  233.         cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定单元格垂直居中对齐  
  234.         cellStyle.setWrapText(true);// 指定单元格自动换行  
  235.  
  236.         // 单元格字体  
  237.         HSSFFont font = wb.createFont();  
  238.         font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  
  239.         font.setFontName("宋体");  
  240.         font.setFontHeight((short250);  
  241.         cellStyle.setFont(font);  
  242.  
  243.         HSSFRow lastRow = sheet.createRow((short) (sheet.getLastRowNum() + 1));  
  244.         HSSFCell sumCell = lastRow.createCell(0);  
  245.  
  246.         sumCell.setCellValue(new HSSFRichTextString("合计"));  
  247.         sumCell.setCellStyle(cellStyle);  
  248.         sheet.addMergedRegion(new Region(sheet.getLastRowNum(), (short0,  
  249.                 sheet.getLastRowNum(), (short) colSum));// 指定合并区域  
  250.  
  251.         for (int i = 2; i < (cellValue.length + 2); i++) {  
  252.             sumCell = lastRow.createCell(i);  
  253.             sumCell.setCellStyle(cellStyle);  
  254.             sumCell.setCellValue(new HSSFRichTextString(cellValue[i - 2]));  
  255.  
  256.         }  
  257.  
  258.     }  
  259.  
  260.     /**  
  261.      * 输入EXCEL文件  
  262.      *   
  263.      * @param fileName  
  264.      *            文件名  
  265.      */ 
  266.     public void outputExcel(String fileName) {  
  267.         FileOutputStream fos = null;  
  268.         try {  
  269.             fos = new FileOutputStream(new File(fileName));  
  270.             wb.write(fos);  
  271.             fos.close();  
  272.         } catch (FileNotFoundException e) {  
  273.             e.printStackTrace();  
  274.         } catch (IOException e) {  
  275.             e.printStackTrace();  
  276.         }  
  277.     }  

报表生成类:ComplexExportExcelClient.java

 

  1. package com.bzu.search.action;  
  2.  
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.  
  6. import org.apache.poi.hssf.usermodel.HSSFCell;  
  7. import org.apache.poi.hssf.usermodel.HSSFCellStyle;  
  8. import org.apache.poi.hssf.usermodel.HSSFFont;  
  9. import org.apache.poi.hssf.usermodel.HSSFRichTextString;  
  10. import org.apache.poi.hssf.usermodel.HSSFRow;  
  11. import org.apache.poi.hssf.usermodel.HSSFSheet;  
  12. import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
  13. import org.apache.poi.hssf.util.Region;  
  14.  
  15. /**  
  16.  * 拒绝件报表生成类.  
  17.  *   
  18.  * @author caoyb  
  19.  * @version $Revision:$  
  20.  */ 
  21. public class ComplexExportExcelClient {  
  22.  
  23.     private static HSSFWorkbook wb = new HSSFWorkbook();  
  24.  
  25.     private static HSSFSheet sheet = wb.createSheet();  
  26.  
  27.     @SuppressWarnings({ "unchecked""deprecation" })  
  28.     public static void main(String[] args) {  
  29.  
  30.         ExportExcel exportExcel = new ExportExcel(wb, sheet);  
  31.  
  32.         // 创建列标头LIST  
  33.         List fialList = new ArrayList();  
  34.  
  35.         fialList.add("申请人未提供任何联系方式");  
  36.         fialList.add("无工作单位信息且未提供收入来源信息");  
  37.         fialList.add("有工作单位但未提供单位地址或电话");  
  38.         fialList.add("家庭地址缺失");  
  39.         fialList.add("客户身份证明资料缺");  
  40.         fialList.add("签名缺失或签名不符合要求");  
  41.         fialList.add("其它");  
  42.  
  43.         List errorList = new ArrayList();  
  44.  
  45.         errorList.add("客户主动取消");  
  46.         errorList.add("个人征信不良");  
  47.         errorList.add("欺诈申请");  
  48.         errorList.add("申请人基本条件不符");  
  49.         errorList.add("申请材料不合规");  
  50.         errorList.add("无法正常完成征信");  
  51.         errorList.add("重复申请");  
  52.         errorList.add("其他");  
  53.  
  54.         // 计算该报表的列数  
  55.         int number = 2 + fialList.size() * 2 + errorList.size() * 2;  
  56.  
  57.         // 给工作表列定义列宽(实际应用自己更改列数)  
  58.         for (int i = 0; i < number; i++) {  
  59.             sheet.setColumnWidth(i, 3000);  
  60.         }  
  61.  
  62.         // 创建单元格样式  
  63.         HSSFCellStyle cellStyle = wb.createCellStyle();  
  64.  
  65.         // 指定单元格居中对齐  
  66.         cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);  
  67.  
  68.         // 指定单元格垂直居中对齐  
  69.         cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);  
  70.  
  71.         // 指定当单元格内容显示不下时自动换行  
  72.         cellStyle.setWrapText(true);  
  73.  
  74.         // 设置单元格字体  
  75.         HSSFFont font = wb.createFont();  
  76.         font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  
  77.         font.setFontName("宋体");  
  78.         font.setFontHeight((short200);  
  79.         cellStyle.setFont(font);  
  80.  
  81.         // 创建报表头部  
  82.         exportExcel.createNormalHead("南京地区申请资料拒件分析统计", number);  
  83.  
  84.         // 设置第二行  
  85.         String[] params = new String[] { "    年  月  日""  年  月  日" };  
  86.         exportExcel.createNormalTwoRow(params, number);  
  87.  
  88.         // 设置列头  
  89.         HSSFRow row2 = sheet.createRow(2);  
  90.  
  91.         HSSFCell cell0 = row2.createCell(0);  
  92.         cell0.setCellStyle(cellStyle);  
  93.         cell0.setCellValue(new HSSFRichTextString("机构代码"));  
  94.  
  95.         HSSFCell cell1 = row2.createCell(1);  
  96.         cell1.setCellStyle(cellStyle);  
  97.         cell1.setCellValue(new HSSFRichTextString("支行名称"));  
  98.  
  99.         HSSFCell cell2 = row2.createCell(2);  
  100.         cell2.setCellStyle(cellStyle);  
  101.         cell2.setCellValue(new HSSFRichTextString("无效件"));  
  102.  
  103.         HSSFCell cell3 = row2.createCell(2 * fialList.size() + 2);  
  104.         cell3.setCellStyle(cellStyle);  
  105.         cell3.setCellValue(new HSSFRichTextString("拒绝件"));  
  106.  
  107.         HSSFRow row3 = sheet.createRow(3);  
  108.  
  109.         // 设置行高  
  110.         row3.setHeight((short800);  
  111.  
  112.         HSSFCell row3Cell = null;  
  113.         int m = 0;  
  114.         int n = 0;  
  115.  
  116.         // 创建不同的LIST的列标题  
  117.         for (int i = 2; i < number; i = i + 2) {  
  118.  
  119.             if (i < 2 * fialList.size() + 2) {  
  120.                 row3Cell = row3.createCell(i);  
  121.                 row3Cell.setCellStyle(cellStyle);  
  122.                 row3Cell.setCellValue(new HSSFRichTextString(fialList.get(m)  
  123.                         .toString()));  
  124.                 m++;  
  125.             } else {  
  126.                 row3Cell = row3.createCell(i);  
  127.                 row3Cell.setCellStyle(cellStyle);  
  128.                 row3Cell.setCellValue(new HSSFRichTextString(errorList.get(n)  
  129.                         .toString()));  
  130.                 n++;  
  131.             }  
  132.  
  133.         }  
  134.  
  135.         // 创建最后一列的合计列  
  136.         row3Cell = row3.createCell(number);  
  137.         row3Cell.setCellStyle(cellStyle);  
  138.         row3Cell.setCellValue(new HSSFRichTextString("合计"));  
  139.  
  140.         // 合并单元格  
  141.         HSSFRow row4 = sheet.createRow(4);  
  142.  
  143.         // 合并第三行到第五行的第一列  
  144.         sheet.addMergedRegion(new Region(2, (short04, (short0));  
  145.  
  146.         // 合并第三行到第五行的第二列  
  147.         sheet.addMergedRegion(new Region(2, (short14, (short1));  
  148.  
  149.         // 合并第三行的第三列到第AA指定的列  
  150.         int aa = 2 * fialList.size() + 1;  
  151.         sheet.addMergedRegion(new Region(2, (short22, (short) aa));  
  152.  
  153.         int start = aa + 1;  
  154.  
  155.         sheet.addMergedRegion(new Region(2, (short) start, 2,  
  156.                 (short) (number - 1)));  
  157.  
  158.         // 循环合并第四行的行,并且是每2列合并成一列  
  159.         for (int i = 2; i < number; i = i + 2) {  
  160.             sheet.addMergedRegion(new Region(3, (short) i, 3, (short) (i + 1)));  
  161.  
  162.         }  
  163.  
  164.         // 根据列数奇偶数的不同创建不同的列标题  
  165.         for (int i = 2; i < number; i++) {  
  166.             if (i < 2 * fialList.size() + 2) {  
  167.  
  168.                 if (i % 2 == 0) {  
  169.                     HSSFCell cell = row4.createCell(i);  
  170.                     cell.setCellStyle(cellStyle);  
  171.                     cell.setCellValue(new HSSFRichTextString("无效量"));  
  172.                 } else {  
  173.                     HSSFCell cell = row4.createCell(i);  
  174.                     cell.setCellStyle(cellStyle);  
  175.                     cell.setCellValue(new HSSFRichTextString("占比"));  
  176.                 }  
  177.             } else {  
  178.                 if (i % 2 == 0) {  
  179.                     HSSFCell cell = row4.createCell(i);  
  180.                     cell.setCellStyle(cellStyle);  
  181.                     cell.setCellValue(new HSSFRichTextString("拒绝量"));  
  182.                 } else {  
  183.                     HSSFCell cell = row4.createCell(i);  
  184.                     cell.setCellStyle(cellStyle);  
  185.                     cell.setCellValue(new HSSFRichTextString("占比"));  
  186.                 }  
  187.             }  
  188.  
  189.         }  
  190.  
  191.         // 循环创建中间的单元格的各项的值  
  192.         for (int i = 5; i < number; i++) {  
  193.             HSSFRow row = sheet.createRow((short) i);  
  194.             for (int j = 0; j <= number; j++) {  
  195.                 exportExcel  
  196.                         .cteateCell(wb, row, (short) j,  
  197.                                 HSSFCellStyle.ALIGN_CENTER_SELECTION, String  
  198.                                         .valueOf(j));  
  199.             }  
  200.  
  201.         }  
  202.  
  203.         // 创建最后一行的合计行  
  204.         String[] cellValue = new String[number - 1];  
  205.         for (int i = 0; i < number - 1; i++) {  
  206.             cellValue[i] = String.valueOf(i);  
  207.  
  208.         }  
  209.         exportExcel.createLastSumRow(1, cellValue);  
  210.  
  211.         exportExcel.outputExcel("c:\\拒绝件统计.xls");  
  212.  
  213.     }  

  运行上述两段代码你就会在c盘的根目录下看到一个拒绝件统计.xls文件

转自:http://www.fengfly.com/plus/view-210184-1.html

2019-08-11 20:59:59 weixin_42054155 阅读数 165
  • 基于SSM的POI导入导出Excel实战

    本课程将给大家分享如何基于SSM实现POI导入导出Excel,并讲解目前企业级JavaWeb应用mvc三层模式的开发流程,可让初学者或者职场萌新掌握如何基于SSM整合第三方框架并采用mvc三层开发模式实现自己的业务模块!

    1272 人正在学习 去看看 钟林森

背景:需要导出大量数据到Excel中,但是又因为普通的导出数据工具不太好用,并且很容易OOM,那么可以使用这个方法来解决:下面给出2个方法,一个是简洁数据文件,不带样式和标题的导出工具类,一个是导出的数据文件带有标题和一些简易样式 并且到百万级别数据速度非常快,如果字段不多,30秒左右即可

需要加入的poi依赖:

   <dependency>
       <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.10-FINAL</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.10-FINAL</version>
    </dependency>

1. 简洁易用的导出数据工具类:(不带样式)

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.poi.common.usermodel.Hyperlink;
import org.apache.poi.hpsf.SummaryInformation;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.streaming.SXSSFCell;
import org.apache.poi.xssf.streaming.SXSSFRow;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.*;

import java.io.*;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;

/**
*  不带样式的Excel输出基本数据的工具类
*/
public class ExcelUtil {



	public static final String DEFAULT_DATE_PATTERN = "yyyy年MM月dd日";// 默认日期格式,如果传递的是Date类型,则会格式化为这个
	public static final int DEFAULT_COLUMN_WIDTH = 17;// 默认列宽


	/**
	 * 导出Excel(.xlsx)格式
	 * @param titleList 表格头信息集合
	 * @param dataArray 数据数组
	 * @param os 文件输出流
	 */
	public static void exportExcel(ArrayList<LinkedHashMap> titleList, JSONArray dataArray, OutputStream os) {
		String datePattern = DEFAULT_DATE_PATTERN;
		int minBytes = DEFAULT_COLUMN_WIDTH;

		/**
		 * 声明一个工作薄
		 */
		SXSSFWorkbook workbook = new SXSSFWorkbook(100000);// 大于1000行时会把之前的行写入硬盘
		workbook.setCompressTempFiles(true);
		
		String title1 = (String) titleList.get(0).get("title1");
		String title2 = (String) titleList.get(0).get("title2");
		LinkedHashMap<String, String> headMap = titleList.get(1);

		/**
		 * 生成一个(带名称)表格
		 */
		if(StringUtils.isNotBlank(title1)) {
			SXSSFSheet sheet = (SXSSFSheet) workbook.createSheet(title1);
			sheet.createFreezePane(0, 3, 0, 3);// (单独)冻结前三行
		}
		SXSSFSheet sheet = (SXSSFSheet) workbook.createSheet();

		/**
		 * 生成head相关信息+设置每列宽度
		 */
		int[] colWidthArr = new int[headMap.size()];// 列宽数组
		String[] headKeyArr = new String[headMap.size()];// headKey数组
		String[] headValArr = new String[headMap.size()];// headVal数组
		int i = 0;
		for (Map.Entry<String, String> entry : headMap.entrySet()) {
			headKeyArr[i] = entry.getKey();
			headValArr[i] = entry.getValue();

			int bytes = headKeyArr[i].getBytes().length;
			colWidthArr[i] = bytes < minBytes ? minBytes : bytes;
			sheet.setColumnWidth(i, colWidthArr[i] * 256);// 设置列宽
			i++;
		}


		/**
		 * 遍历数据集合,产生Excel行数据
		 */
		int rowIndex = 0;
		for (Object obj : dataArray) {
			// 生成title+head信息
			if (rowIndex == 0) {
				SXSSFRow headerRow = (SXSSFRow) sheet.createRow(0);// head行
				for (int j = 0; j < headValArr.length; j++) {
					headerRow.createCell(j).setCellValue(headValArr[j]);
//					headerRow.getCell(j).setCellStyle(headerStyle);
				}
				rowIndex++;
			}

			JSONObject jo = (JSONObject) JSONObject.toJSON(obj);
			// 生成数据
			SXSSFRow dataRow = (SXSSFRow) sheet.createRow(rowIndex);// 创建行
			for (int k = 0; k < headKeyArr.length; k++) {
				SXSSFCell cell = (SXSSFCell) dataRow.createCell(k);// 创建单元格
				Object o = jo.get(headKeyArr[k]);
				String cellValue = "";

				if (o == null) {
					cellValue = "";
				} else if (o instanceof Date) {
					cellValue = new SimpleDateFormat(datePattern).format(o);
				} else if (o instanceof Float || o instanceof Double) {
					cellValue = new BigDecimal(o.toString()).setScale(2, BigDecimal.ROUND_HALF_UP).toString();
				} else {
					cellValue = o.toString();
				}

				cell.setCellValue(cellValue);
			}
			rowIndex++;
		}

		try {
			workbook.write(os);
			os.flush();// 刷新此输出流并强制将所有缓冲的输出字节写出
			IOUtils.closeQuietly(os);
			workbook.dispose();// 释放workbook所占用的所有windows资源
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

调用示例:

public void exportData(String dir) {
		    // 从数据库中查询list数据
		    List<Object[]> list = tempRepository.queryData();

			String fileName = "EXAMPLE_FILE" + ".xlsx";
			
			// 将list集合数据转换为JsonArray类型
			JSONArray dataArray = new JSONArray();
			for (Object[] obj : list) {
				if (obj != null) {
					ExportModel fc = new ExportModel();
					fc.setId((String) obj[0]);
					fc.setName((String) obj[1]);
					fc.setMobile((String) obj[2]);
					Date date = (Date)obj[3];
					fc.setCreateDate(date != null? df.format(date):"");
					dataArray.add(fc);
				}
			}


			ArrayList<LinkedHashMap> titleList = new ArrayList<LinkedHashMap>();
			// 1.titleMap存放了该excel的头信息
			LinkedHashMap<String, String> titleMap = new LinkedHashMap<String, String>();
			// 2.headMap存放了该excel的列项
			LinkedHashMap<String, String> headMap = new LinkedHashMap<String, String>();
			headMap.put("id", "ID");
			headMap.put("name", "name");
			headMap.put("mobile", "MOBILE");
			headMap.put("create_date", "create_date");

			titleList.add(titleMap);
			titleList.add(headMap);

			File file = new File(dir);
			if (!file.exists()) file.mkdirs();// 创建该文件夹目录
			OutputStream os = null;
			try {
				log.info("正在导出xlsx...");
				long start = System.currentTimeMillis();
				// .xlsx格式
				os = new FileOutputStream(file.getAbsolutePath() + File.separator + fileName);
				ExcelUtil.exportExcel(titleList, dataArray, os);
				log.info("导出完成...共" + list.size() + "条数据,用时" + (System.currentTimeMillis() - start) + "毫秒");
				log.info("文件路径:" + file.getAbsolutePath() + File.separator + start + ".xlsx");
			} catch (Exception e) {
				log.error("创建文件异常:", e);
			} finally {
				IOUtils.closeQuietly(os);
			}
	}

2. 简洁易用的导出数据工具类:(带样式)

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.poi.common.usermodel.Hyperlink;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.streaming.SXSSFCell;
import org.apache.poi.xssf.streaming.SXSSFRow;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.*;

import java.io.*;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * 带有样式的Excel导出工具类
 * @time 2019/8/8 10:05 AM
 */
public class ExcelUtil {



	public static final String DEFAULT_DATE_PATTERN = "yyyy年MM月dd日";// 默认日期格式,如果传递的是Date类型,则会格式化为这个
	public static final int DEFAULT_COLUMN_WIDTH = 17;// 默认列宽


	/**
	 * 导出Excel(.xlsx)格式
	 * @param titleList 表格头信息集合
	 * @param dataArray 数据数组
	 * @param os 文件输出流
	 */
	public static void exportExcel(ArrayList<LinkedHashMap> titleList, JSONArray dataArray, OutputStream os) {
		String datePattern = DEFAULT_DATE_PATTERN;
		int minBytes = DEFAULT_COLUMN_WIDTH;

		/**
		 * 声明一个工作薄
		 */
		SXSSFWorkbook workbook = new SXSSFWorkbook(100000);// 大于100000行时会把之前的行写入硬盘
		workbook.setCompressTempFiles(true);

		// 表头1样式
		CellStyle title1Style = workbook.createCellStyle();
		title1Style.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 水平居中
		title1Style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直居中
		Font titleFont = workbook.createFont();// 字体
		titleFont.setFontHeightInPoints((short) 20);
		titleFont.setBoldweight((short) 700);
		title1Style.setFont(titleFont);

		// 表头2样式
		CellStyle title2Style = workbook.createCellStyle();
		title2Style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
		title2Style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
		title2Style.setBorderTop(HSSFCellStyle.BORDER_THIN);// 上边框
		title2Style.setBorderRight(HSSFCellStyle.BORDER_THIN);// 右
		title2Style.setBorderBottom(HSSFCellStyle.BORDER_THIN);// 下
		title2Style.setBorderLeft(HSSFCellStyle.BORDER_THIN);// 左
		Font title2Font = workbook.createFont();
		title2Font.setUnderline((byte) 1);
		title2Font.setColor(HSSFColor.BLUE.index);
		title2Style.setFont(title2Font);

		// head样式
		CellStyle headerStyle = workbook.createCellStyle();
		headerStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
		headerStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
		headerStyle.setFillForegroundColor(HSSFColor.LIGHT_GREEN.index);// 设置颜色
		headerStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);// 前景色纯色填充
		headerStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
		headerStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
		headerStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
		headerStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
		Font headerFont = workbook.createFont();
		headerFont.setFontHeightInPoints((short) 12);
		headerFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
		headerStyle.setFont(headerFont);

		// 单元格样式
		CellStyle cellStyle = workbook.createCellStyle();
		cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
		cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
		cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
		cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
		cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
		cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
		Font cellFont = workbook.createFont();
		cellFont.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
		cellStyle.setFont(cellFont);


		String title1 = (String) titleList.get(0).get("title1");
		String title2 = (String) titleList.get(0).get("title2");
		LinkedHashMap<String, String> headMap = titleList.get(1);

		/**
		 * 生成一个(带名称)表格
		 */
		SXSSFSheet sheet = null;
		if(StringUtils.isNotBlank(title1)) {
			sheet = (SXSSFSheet) workbook.createSheet(title1);
			sheet.createFreezePane(0, 3, 0, 3);// (单独)冻结前三行
		} else {
			sheet = (SXSSFSheet) workbook.createSheet();
		}

		/**
		 * 生成head相关信息+设置每列宽度
		 */
		int[] colWidthArr = new int[headMap.size()];// 列宽数组
		String[] headKeyArr = new String[headMap.size()];// headKey数组
		String[] headValArr = new String[headMap.size()];// headVal数组
		int i = 0;
		for (Map.Entry<String, String> entry : headMap.entrySet()) {
			headKeyArr[i] = entry.getKey();
			headValArr[i] = entry.getValue();

			int bytes = headKeyArr[i].getBytes().length;
			colWidthArr[i] = bytes < minBytes ? minBytes : bytes;
			sheet.setColumnWidth(i, colWidthArr[i] * 256);// 设置列宽
			i++;
		}


		/**
		 * 遍历数据集合,产生Excel行数据
		 */
		int rowIndex = 0;
		for (Object obj : dataArray) {
			// 生成title+head信息
			if (rowIndex == 0) {
				SXSSFRow title1Row = (SXSSFRow) sheet.createRow(0);// title1行
				title1Row.createCell(0).setCellValue(title1);
				title1Row.getCell(0).setCellStyle(title1Style);
				sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, headMap.size() - 1));// 合并单元格

				if(StringUtils.isNotBlank(title2)) {
					SXSSFRow title2Row = (SXSSFRow) sheet.createRow(1);// title2行
					title2Row.createCell(0).setCellValue(title2);
					CreationHelper createHelper = workbook.getCreationHelper();
					XSSFHyperlink  hyperLink = (XSSFHyperlink) createHelper.createHyperlink(Hyperlink.LINK_URL);
					hyperLink.setAddress(title2);
					title2Row.getCell(0).setHyperlink(hyperLink);// 添加超链接

					title2Row.getCell(0).setCellStyle(title2Style);
					sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, headMap.size() - 1));// 合并单元格

				}


				SXSSFRow headerRow = (SXSSFRow) sheet.createRow(2);// head行
				for (int j = 0; j < headValArr.length; j++) {
					headerRow.createCell(j).setCellValue(headValArr[j]);
					headerRow.getCell(j).setCellStyle(headerStyle);
				}
				rowIndex = 3;
			}

			JSONObject jo = (JSONObject) JSONObject.toJSON(obj);
			// 生成数据
			SXSSFRow dataRow = (SXSSFRow) sheet.createRow(rowIndex);// 创建行
			for (int k = 0; k < headKeyArr.length; k++) {
				SXSSFCell cell = (SXSSFCell) dataRow.createCell(k);// 创建单元格
				Object o = jo.get(headKeyArr[k]);
				String cellValue = "";

				if (o == null) {
					cellValue = "";
				} else if (o instanceof Date) {
					cellValue = new SimpleDateFormat(datePattern).format(o);
				} else if (o instanceof Float || o instanceof Double) {
					cellValue = new BigDecimal(o.toString()).setScale(2, BigDecimal.ROUND_HALF_UP).toString();
				} else {
					cellValue = o.toString();
				}

				cell.setCellValue(cellValue);
				cell.setCellStyle(cellStyle);
			}
			rowIndex++;
		}

		try {
			workbook.write(os);
			os.flush();// 刷新此输出流并强制将所有缓冲的输出字节写出
			IOUtils.closeQuietly(os);
			workbook.dispose();// 释放workbook所占用的所有windows资源
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

调用示例:

public void exportData(String dir) {
	// 查询数据
	List<Object[]> list = tempRepository.queryData();
	
	String fileName = "EXAMPLE_FILE" + ".xlsx";
	
	// 将list集合转换为JsonnArray
	JSONArray dataArray = new JSONArray();
	for (Object[] obj : list) {
		if (obj != null) {
			ExportModel fc = new ExportModel();
			fc.setId((String) obj[0]);
			fc.setName((String) obj[1]);
			fc.setMobile((String) obj[2]);
			Date date = (Date)obj[3];
			fc.setCreateDate(date != null? df.format(date):"");
			dataArray.add(fc);
		}
	}


	ArrayList<LinkedHashMap> titleList = new ArrayList<LinkedHashMap>();
	// 1.titleMap存放了该excel的头信息
	LinkedHashMap<String, String> titleMap = new LinkedHashMap<String, String>();
	titleMap.put("title1", "大标题");
	titleMap.put("title2", "小标题");
	// 2.headMap存放了该excel的列项
	LinkedHashMap<String, String> headMap = new LinkedHashMap<String, String>();
	headMap.put("id", "id");
	headMap.put("name", "name");
	headMap.put("mobile", "mobile");
	headMap.put("create_date", "create_date");

	titleList.add(titleMap);
	titleList.add(headMap);

	File file = new File(dir);
	if (!file.exists()) file.mkdirs();// 创建该文件夹目录
	OutputStream os = null;
	try {
		log.info("正在导出xlsx...");
		long start = System.currentTimeMillis();
		// .xlsx格式
		os = new FileOutputStream(file.getAbsolutePath() + File.separator + fileName);
		ExcelUtil.exportExcel(titleList, dataArray, os);
		log.info("导出完成...共" + list.size() + "条数据,用时" + (System.currentTimeMillis() - start) + "毫秒");
		log.info("文件路径:" + file.getAbsolutePath() + File.separator + start + ".xlsx");
	} catch (Exception e) {
		log.error("创建文件异常:", e);
	} finally {
		IOUtils.closeQuietly(os);
	}
}			

Springmvc poi导出excel

阅读数 122

没有更多推荐了,返回首页