package com.io.util;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* 导出至excel 最多104w行数据
*/
public class ExportExcel {
private SXSSFWorkbook workbook;
private Sheet sheet;
private ExportExcel() {
}
private List<?> datas;
private Map<String, Object> columnName;
private String sheetName;
public ExportExcel(List<?> datas, Map<String, Object> columnName, String sheetName) {
this.datas = datas;
this.columnName = columnName;
this.sheetName = sheetName;
}
public void excelExport(HttpServletResponse response) {
initHSSWorkbook(sheetName);
createTitleRow(sheetName, columnName);
createDateRow(columnName);
createHeadRow(columnName);
createContentRow(datas, columnName);
String fileName = System.currentTimeMillis() + ".xlsx";
if (response == null)
writeAndClose(fileName, workbook);
else
writeAndClose(response, fileName, workbook);
workbook.dispose();
workbook = null;
sheet = null;
}
/**
* 创建文本行
* 需要使用到反射机制
*
* @param datas 数据
* @param columnName 列名
*/
private void createContentRow(List<?> datas, Map<String, Object> columnName) {
try {
int i = 0, y = 0;
//Sheet sheet=this.sheet;
for (Object obj : datas) {
//添加计数器
if (i == 1000000) {
i = 0;
sheet = workbook.createSheet(sheetName + "." + y++);
createTitleRow(sheetName, columnName);
createDateRow(columnName);
createHeadRow(columnName);
}
Row hssfRow = sheet.createRow(3 + i);
int j = 0;
for (String column : columnName.keySet()) {
String methodStr = "get" + column.substring(0, 1).toUpperCase() + column.substring(1);
// System.out.println(methodStr);
String value = "";
try {
Object val=null;
if(obj instanceof Map){
if( ((Map) obj).get(column)!=null)
val =((Map) obj).get(column).toString();
}else{
Method method = obj.getClass().getMethod(methodStr, null);
// 通过反射机制调用方法
val = method.invoke(obj, null);
}
value = val == null ? "" : val.toString();
} catch (NoSuchMethodException ex) {
// System.out.println(ex.toString());
}
Cell cell = hssfRow.createCell(j);
cell.setCellValue(value);
j++;
}
i++;
}
columnName.clear();
datas.clear();
datas = null;
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 创建列名行
*
* @param columnName
*/
private void createHeadRow(Map<String, Object> columnName) {
Row hssfRow = sheet.createRow(2);
Cell cell = null;
int i = 0;
for (String str : columnName.keySet()) {
cell = hssfRow.createCell(i);
cell.setCellValue(columnName.get(str).toString());
i++;
}
}
/**
* 创建日期行
*
* @param columnName
*/
private void createDateRow(Map<String, Object> columnName) {
CellRangeAddress cellRangeAddress = new CellRangeAddress(1, 1, 0, columnName.size() - 1);
sheet.addMergedRegion(cellRangeAddress);
Cell cell = sheet.createRow(1).createCell(0);
cell.setCellValue(new SimpleDateFormat().format(new Date()));
}
/**
* 创建表格标题
*
* @param sheetName 工作表名称
* @param columnName
*/
private void createTitleRow(String sheetName, Map<String, Object> columnName) {
CellRangeAddress cellRangeAddress = new CellRangeAddress(0, 0, 0, columnName.size() - 1);
sheet.addMergedRegion(cellRangeAddress);
Row hssfRow = sheet.createRow(0);
Cell cell = hssfRow.createCell(0);
cell.setCellValue(sheetName);
}
/**
* 初始化HSSFWorkbook
*
* @param sheetName 工作表名称
*/
private void initHSSWorkbook(String sheetName) {
workbook = new SXSSFWorkbook(100);
sheet = workbook.createSheet(sheetName);
}
private void writeAndClose(HttpServletResponse response, String fileName, Workbook wb) {
try {
this.setResponseHeader(response, fileName);
OutputStream os = response.getOutputStream();
wb.write(os);
os.flush();
os.close();
//wb.close();
} catch (Exception e) {
e.printStackTrace();
}
}
private void writeAndClose(String fileName, Workbook wb) {
File file;
FileOutputStream stream = null;
try {
file = new File("C:\\");
stream = new FileOutputStream(new File(file, fileName));
wb.write(stream);
//wb.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (stream != null) {
try {
stream.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
public void setResponseHeader(HttpServletResponse response, String fileName) {
try {
try {
fileName = new String(fileName.getBytes(), "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
response.setContentType("application/octet-stream;charset=ISO8859-1");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
response.addHeader("Pargam", "no-cache");
response.addHeader("Cache-Control", "no-cache");
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static void main(String[] args) {
List<Map> list=new ArrayList();
Map map=new HashMap<String,String>();
map.put("jlbh","这是黑烟车编号001");
map.put("dwbh","这是黑烟车点位编号660606");
list.add(map);
checkListFromExportUtils(null,list);
}
/**
* 测试
* response=null保存本地否则下载
* @param response
* @param list
*/
public static void checkListFromExportUtils(HttpServletResponse response, List<?> list) {
Map<String, Object> titleMap = new LinkedHashMap<>();
titleMap.put("jlbh", "黑烟车记录编号");
titleMap.put("dwbh", "点位编号");
ExportExcel exportExcel = new ExportExcel(list, titleMap, "xx信息表");
exportExcel.excelExport(response);
}
}