您的位置:首页 > 其它

导出excel报表

2018-01-25 11:00 23 查看
话不多说,上代码。maven依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-excelant</artifactId>
<version>3.9</version>
</dependency>
ExcelUtil类
public class ExcelExport {

public static  SXSSFWorkbook buildExcel(  ExcelBean ev,List<Integer> widthList)throws Exception{
int rowaccess = 100;//内存中缓存记录行数
SXSSFWorkbook wb = new SXSSFWorkbook(rowaccess);
//创建名称为ev.getSheetName()的sheet
Sheet sh = wb.createSheet(ev.getSheetName());
Row row0 = sh.createRow(0);
Cell cell0 = row0.createCell(0);
//社会第一个row的第一个cell  excel名称
cell0.setCellValue(ev.getTitle());
for (int i=0;i<widthList.size();i++){//设置excel每列宽度
sh.setColumnWidth(i, widthList.get(i) * 256);
}
CellStyle style1 = wb.createCellStyle();//第一行样式
CellStyle style = wb.createCellStyle();//第二行样式
Font f  = wb.createFont();
Font f1  = wb.createFont();
f.setFontHeightInPoints((short) 14);//字号
f1.setFontHeightInPoints((short) 15);//字号
f.setBoldweight(Font.BOLDWEIGHT_NORMAL);//加粗
f.setFontName("楷体");
style.setFont(f);
style.setWrapText(true);
style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);//垂直
style.setAlignment(CellStyle.ALIGN_CENTER);//字体垂直居中
style1.setFont(f1);
style1.setAlignment(CellStyle.ALIGN_CENTER);//字体左右居中
CellRangeAddress region = new CellRangeAddress(0, 0, (short) 0, (short) (ev.getColumn().size()-1));
sh.addMergedRegion(region);// 合并到rowTo行columnTo的区域
//第一行字体样式----------------
cell0.setCellStyle(style1);
cell0.setCellValue(ev.getTitle());
// 设置border
style.setBorderLeft(CellStyle.BORDER_THIN);
style.setBorderRight(CellStyle.BORDER_THIN);
style.setBorderTop(CellStyle.BORDER_THIN);
style.setBorderBottom(CellStyle.BORDER_THIN);
style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());      // 填充颜色
style.setFillPattern(CellStyle.SOLID_FOREGROUND);           // 填充方式
//设置第二行数据名称
Row row1 = sh.createRow(1);
for (int i=0;i<ev.getColumn().size();i++){
Cell cells = row1.createCell(i);
cells.setCellValue(ev.getColumn().get(i));
cells.setCellStyle(style);
}
//每个SHEET有 content.size()数据
List<Map<String, Object>> content = ev.getContent();
for(int rownum = 0; rownum < content.size(); rownum++) {
Row row = sh.createRow(rownum + 2);
//每行有ev.getDbcolumn().size()个CELL
Map<String, Object> m11 = content.get(rownum);
for(int cellnum = 0; cellnum < ev.getDbcolumn().size(); cellnum++) {
Cell cell = row.createCell(cellnum);{
if(m11.get(ev.getDbcolumn().get(cellnum))!=null ){
cell.setCellValue(m11.get(ev.getDbcolumn().get(cellnum)).toString());
}else{
cell.setCellValue("");
}
}
}
//每当行数达到设置的值就刷新数据到硬盘,以清理内存
if(rownum%rowaccess == 0){
((SXSSFSheet)sh).flushRows();
}
}
return wb;
}
}
excel格式类
public class ExcelBean {

/**
* sheet名
*/
private String sheetName;//sheet名

/**
* 标题
*/
private String title;//标题

/**
* 列名集合
*/
private List<String> column;//列名集合

/**
* 数据库列名
*/
private List<String> dbcolumn;//数据库列名

private List<Map<String,Object>> content;//内容

public String getSheetName() {
return sheetName;
}

public void setSheetName(String sheetName) {
this.sheetName = sheetName;
}

public List<String> getColumn() {
return column;
}

public void setColumn(List<String> column) {
this.column = column;
}

public List<String> getDbcolumn() {
return dbcolumn;
}

public void setDbcolumn(List<
b6d6
;String> dbcolumn) {
this.dbcolumn = dbcolumn;
}

public List<Map<String, Object>> getContent() {
return content;
}

public void setContent(List<Map<String, Object>> content) {
this.content = content;
}

public String getTitle() {
return title;
}

public void setTitle(String title) {
this.title = title;
}

public ExcelBean(String sheetName, String title, List<String> column, List<String> dbcolumn, List<Map<String, Object>> content) {
this.sheetName = sheetName;
this.title = title;
this.column = column;
this.dbcolumn = dbcolumn;
this.content = content;
}

public ExcelBean() {
}
}
方法调用
//获取导出数据
List<CoffeeOrderDomain> coffeeOrders = null;
try {
coffeeOrders = statisticDao.exportOrder(startTime,endTime,status,devNo);
} catch (Exception e) {
e.printStackTrace();
}
//数据库字段和列名一一对应
List<String> col = new ArrayList();
col.add("订单编号");
col.add("设备编号");
col.add("支付金额");
col.add("订单时间");
col.add("支付状态");
List<String> dbCol = new ArrayList();
dbCol.add("order_no");
dbCol.add("dev_no");
dbCol.add("price");
dbCol.add("gmt_create");
dbCol.add("status");
//生成报表sheet1
ExcelBean excel = new ExcelBean();
excel.setColumn(col);
excel.setDbcolumn(dbCol);
excel.setTitle("设置标题");
excel.setSheetName("设置工作表名称");
//生成数据
List<Map<String, Object>> content = new ArrayList<Map<String, Object>>();
for (int i = 0; i < coffeeOrders.size(); i++) {
Map map = new HashMap();
map.put("order_no", coffeeOrders.get(i).getOrderNo());
map.put("dev_no", coffeeOrders.get(i).getDevNo());
map.put("price", coffeeOrders.get(i).getPrice());
map.put("gmt_create", DateUtils.getDateTimeFormat(coffeeOrders.get(i).getGmtCreate()));
if(coffeeOrders.get(i).getStatus() == 1){
map.put("status", "已支付");
}
if(coffeeOrders.get(i).getStatus() == 0){
map.put("status", "未支付");
}
content.add(map);
}
excel.setContent(content);
//设置每列的列宽
List<Integer> widthList = new ArrayList<Integer>();
widthList.add(30);
widthList.add(15);
widthList.add(15);
widthList.add(25);
widthList.add(20);
SXSSFWorkbook workBook = null;
try {
workBook = ExcelExport.buildExcel(excel,widthList);
} catch (Exception e) {
logger.error("生成SXSSFWorkbook错误",e);
}
//写入流
OutputStream out = null;
try {
out = response.getOutputStream();
String fileName ="XXX.xlsx";
response.setContentType("application/x-msdownload");
//避免中文名称乱码
response.setHeader("Content-Disposition", "attachment; filename="
+ URLEncoder.encode(fileName, "UTF-8"));
workBook.write(out);
} catch (Exception e) {
logger.error("向浏览器输出XSSFWorkbook错误",e);
} finally {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
大家可以看到ExcelExport工具类中用的是SXSSFWorkbook并且设置的内存中缓存的记录为100有助于减少内存的消耗,但是报表导出确实非常耗内存。以前用的是HSSFWorkbook每次导出的时候就会内存溢出,用SXSSFWorkbook可以有效的减少内存的消耗,其实解决这个问题也很简单就是加大内存呗,但是架不住我们服务器就这么大啊,因为我们不止一个地方用到了导出报表并且项目共用一个数据库,我个人的解决方案是把导出报表自己起一个服务,占大一点的内存,导出的时候统一走这个服务,因为导出报表使用的次数相对于别的业务还是比较少的。如果有些小伙伴的服务器配置好可以挥霍内存的话,那就更好啦。
---------------一个搬砖的小菜鸡

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: