1.需要引入Apache POI的依赖
<!-- poi office -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.9</version>
</dependency>
package com.hpt.util;
import com.google.common.collect.Lists;
import org.apache.commons.lang.StringUtils;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
import org.slf4j.LoggerFactory;
import javax.servlet.http.HttpServletResponse;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by hpt on 2016/3/24.
* 导出excel工具类
*
*/
public class ExportExcelUtils {
private static org.slf4j.Logger log = LoggerFactory.getLogger(ExportExcelUtils.class);
/**
* 工作薄对象
*/
private SXSSFWorkbook wb;
/**
* 工作表对象
*/
private Sheet sheet;
/**
* 样式列表
*/
private Map<String, CellStyle> styles;
/**
* 当前行号
*/
private int rownum;
/**
* 构造函数
*
* @param title
* 表格标题,传“空值”,表示无标题
* @param headerList
* 表头列表
*/
public ExportExcelUtils(String title, List<String> headerList){
initialize(title, headerList);
}
/**
* 初始化函数
*
* @param title
* 表格标题,传“空值”,表示无标题
* @param headerList
* 表头列表
*/
private void initialize(String title, List<String> headerList) {
this.wb = new SXSSFWorkbook(500);
this.sheet = wb.createSheet("Export");
this.styles = createStyles(wb);
// Create title
if (StringUtils.isNotBlank(title)) {
Row titleRow = sheet.createRow(rownum++);
titleRow.setHeightInPoints(30);
Cell titleCell = titleRow.createCell(0);
titleCell.setCellStyle(styles.get("title"));
titleCell.setCellValue(title);
sheet.addMergedRegion(new CellRangeAddress(titleRow.getRowNum(),
titleRow.getRowNum(), titleRow.getRowNum(), headerList
.size() - 1));
}
// Create header
if (headerList == null) {
throw new RuntimeException("headerList not null!");
}
Row headerRow = sheet.createRow(rownum++);
headerRow.setHeightInPoints(16);
for (int i = 0; i < headerList.size(); i++) {
Cell cell = headerRow.createCell(i);
cell.setCellStyle(styles.get("header"));
String[] ss = StringUtils.split(headerList.get(i), "**", 2);
if (ss.length == 2) {
cell.setCellValue(ss[0]);
Comment comment = this.sheet.createDrawingPatriarch()
.createCellComment(
new XSSFClientAnchor(0, 0, 0, 0, (short) 3, 3,
(short) 5, 6));
comment.setString(new XSSFRichTextString(ss[1]));
cell.setCellComment(comment);
} else {
cell.setCellValue(headerList.get(i));
}
sheet.autoSizeColumn(i);
}
for (int i = 0; i < headerList.size(); i++) {
int colWidth = sheet.getColumnWidth(i) * 2;
sheet.setColumnWidth(i, colWidth < 3000 ? 3000 : colWidth);
}
log.debug("Initialize success.");
}
/**
* 创建表格样式
*
* @param wb
* 工作薄对象
* @return 样式列表
*/
private Map<String, CellStyle> createStyles(Workbook wb) {
Map<String, CellStyle> styles = new HashMap<String, CellStyle>();
CellStyle style = wb.createCellStyle();
style.setAlignment(CellStyle.ALIGN_CENTER);
style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
Font titleFont = wb.createFont();
titleFont.setFontName("Arial");
titleFont.setFontHeightInPoints((short) 16);
titleFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
style.setFont(titleFont);
styles.put("title", style);
style = wb.createCellStyle();
style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
style.setBorderRight(CellStyle.BORDER_THIN);
style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
style.setBorderLeft(CellStyle.BORDER_THIN);
style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
style.setBorderTop(CellStyle.BORDER_THIN);
style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
style.setBorderBottom(CellStyle.BORDER_THIN);
style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
Font dataFont = wb.createFont();
dataFont.setFontName("Arial");
dataFont.setFontHeightInPoints((short) 10);
style.setFont(dataFont);
styles.put("data", style);
style = wb.createCellStyle();
style.cloneStyleFrom(styles.get("data"));
style.setAlignment(CellStyle.ALIGN_LEFT);
styles.put("data1", style);
style = wb.createCellStyle();
style.cloneStyleFrom(styles.get("data"));
style.setAlignment(CellStyle.ALIGN_CENTER);
styles.put("data2", style);
style = wb.createCellStyle();
style.cloneStyleFrom(styles.get("data"));
style.setAlignment(CellStyle.ALIGN_RIGHT);
styles.put("data3", style);
style = wb.createCellStyle();
style.cloneStyleFrom(styles.get("data"));
// style.setWrapText(true);
style.setAlignment(CellStyle.ALIGN_CENTER);
style.setFillForegroundColor(IndexedColors.GREY_50_PERCENT.getIndex());
style.setFillPattern(CellStyle.SOLID_FOREGROUND);
Font headerFont = wb.createFont();
headerFont.setFontName("Arial");
headerFont.setFontHeightInPoints((short) 10);
headerFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
headerFont.setColor(IndexedColors.WHITE.getIndex());
style.setFont(headerFont);
styles.put("header", style);
return styles;
}
/**
* 添加一行
*
* @return 行对象
*/
public Row addRow() {
return sheet.createRow(rownum++);
}
/**
* 添加一个单元格
*
* @param row
* 添加的行
* @param column
* 添加列号
* @param val
* 添加值
* @return 单元格对象
*/
public Cell addCell(Row row, int column, Object val) {
return this.addCell(row, column, val, 0, Class.class);
}
/**
* 添加一个单元格
*
* @param row
* 添加的行
* @param column
* 添加列号
* @param val
* 添加值
* @param align
* 对齐方式(1:靠左;2:居中;3:靠右)
* @return 单元格对象
*/
public Cell addCell(Row row, int column, Object val, int align,
Class<?> fieldType) {
Cell cell = row.createCell(column);
CellStyle style = styles.get("data"
+ (align >= 1 && align <= 3 ? align : ""));
try {
if (val == null) {
cell.setCellValue("");
} else if (val instanceof String) {
cell.setCellValue((String) val);
} else if (val instanceof Integer) {
cell.setCellValue((Integer) val);
} else if (val instanceof Long) {
cell.setCellValue((Long) val);
} else if (val instanceof Double) {
cell.setCellValue((Double) val);
} else if (val instanceof Float) {
cell.setCellValue((Float) val);
} else if (val instanceof Date) {
DataFormat format = wb.createDataFormat();
style.setDataFormat(format.getFormat("yyyy-MM-dd"));
cell.setCellValue((Date) val);
} else {
if (fieldType != Class.class) {
cell.setCellValue((String) fieldType.getMethod("setValue",
Object.class).invoke(null, val));
} else {
cell.setCellValue((String) Class
.forName(
this.getClass()
.getName()
.replaceAll(
this.getClass()
.getSimpleName(),
"fieldtype."
+ val.getClass()
.getSimpleName()
+ "Type"))
.getMethod("setValue", Object.class)
.invoke(null, val));
}
}
} catch (Exception ex) {
log.info("Set cell value [" + row.getRowNum() + "," + column
+ "] error: " + ex.toString());
cell.setCellValue(val.toString());
}
cell.setCellStyle(style);
return cell;
}
/**
* 输出到文件
*
* @param name
* 输出文件名
*/
public ExportExcelUtils writeFile(String name) throws FileNotFoundException,
IOException {
FileOutputStream os = new FileOutputStream(name);
this.write(os);
return this;
}
/**
* 输出到客户端
*
* @param fileName
* 输出文件名
*/
public ExportExcelUtils write(HttpServletResponse response, String fileName)
throws IOException {
response.reset();
response.setContentType("application/octet-stream; charset=utf-8");
response.setHeader("Content-Disposition", "attachment; filename="
+ java.net.URLEncoder.encode(fileName,"UTF-8"));
write(response.getOutputStream());
return this;
}
/**
* 输出数据流
*
* @param os
* 输出数据流
*/
public ExportExcelUtils write(OutputStream os) throws IOException {
wb.write(os);
return this;
}
/**
* 清理临时文件
*/
public ExportExcelUtils dispose() {
wb.dispose();
return this;
}
/**
* 导出测试
*/
public static void main(String[] args) throws Throwable {
List<String> headerList = Lists.newArrayList();
for (int i = 1; i <= 10; i++) {
headerList.add("表头"+i);
}
List<String> dataRowList = Lists.newArrayList();
for (int i = 1; i <= headerList.size(); i++) {
dataRowList.add("数据"+i);
}
List<List<String>> dataList = Lists.newArrayList();
for (int i = 1; i <=1000000; i++) {
dataList.add(dataRowList);
}
ExportExcelUtils ee = new ExportExcelUtils("表格标题", headerList);
for (int i = 0; i < dataList.size(); i++) {
Row row = ee.addRow();
for (int j = 0; j < dataList.get(i).size(); j++) {
ee.addCell(row, j, dataList.get(i).get(j));
}
}
ee.writeFile("target/export.xlsx");
ee.dispose();
log.debug("Export success.");
}
/**
* 合并单元格
* @param sheet
* @param firstRow
* @param lastRow
* @param firstCol
* @param lastCol
*/
public void mergeCell(int sheet, int firstRow, int lastRow, int firstCol, int lastCol) {
Sheet mSheet = wb.getSheetAt(sheet);
CellRangeAddress address = new CellRangeAddress(firstRow, lastRow, firstCol, lastCol);
mSheet.addMergedRegion(address);
}
/**
* 跨行 合并单元格
* @param rownum 起始行
* @param domListSize 跨行
* @param col 列
*/
public void mergeRow(int rownum, int domListSize,int col){
mergeCell(0, rownum - domListSize + 1, rownum,col, col);
}
}
/**
* 导出Execl文件
* @param request
* @param response
* @return
*/
@RequestMapping(value = "getOrderListExcel")
@ResponseBody
public Object getOrderListExcel(HttpServletRequest request, HttpServletResponse response) throws Exception{
Map<String,Object> param =searchParam(request);
List<String> headerList = getHeaderList(); // 表格Titile
List<Map<String,Object>> dataList = orderService.getExportOrderList(param); // 获取导出订单列表
//定义行数 从第二行开始
int rownum = 2;
// 实例化 导出Excel工具
ExportExcelUtils ee = new ExportExcelUtils("订单详情",headerList);
List<Map<String,Object>> statusList = orderService.getOrderStatus(param); // 订单状态列表
for(Map<String,Object> rMap : dataList){
int c = rMap.size();
String detail = clobToString((Clob)rMap.get("detail")); // 订单详情
// dom 解析 订单详情
List<Map<String,Object>> domList = convertXml2Str(detail);
int num = 0 ;
int domListSize = domList.size();
for(Map<String,Object> dom : domList){
rownum++;
Row row = ee.addRow();
String itemTitle = getObj(dom.get("ItemTitle")); // 商品名称
String SPU = getObj(dom.get("SPU")); // 商品编码
String propertyName = getObj(dom.get("PropertyName")); // 属性
String unitPrice = getObj(dom.get("UnitPrice")); // 商品价格
String quantity = getObj(dom.get("Quantity")); // 数量
String category = getObj(dom.get("category")); // 类目
String thirdCategoryName = getObj(dom.get("ThirdCategoryName")); //
String royaltyPrice = getObj(dom.get("RoyaltyPrice"));
String oUnitPrice = getObj(dom.get("OUnitPrice"));
String royaltyRatio = getObj(dom.get("RoyaltyRatio"));
for (int j = 0; j <c; j++) {
switch (j){
case 0:
String orderno = getObj(rMap.get("orderno")); // 订单编号
ee.addCell(row, j,orderno);
break;
case 1:
String clubUserName = getObj(rMap.get("ClubUserName")); // 用户名
ee.addCell(row,j,clubUserName);
break;
case 2:
ee.addCell(row,j,SPU); // 商品编码
break;
case 3:
String MName = getObj(rMap.get("MName")); // 商家名称
ee.addCell(row,j,MName);
break;
}
}
num ++;
}
//合并单元格
if (domListSize > 1) {
ee.mergeRow(rownum, domListSize,0); // 合并第一列单元格
ee.mergeRow( rownum, domListSize,1); // 合并第二列单元格
}
}
ee.write(response,"订单.xls");
ee.dispose();
return null;
}