221 lines
8.5 KiB
Plaintext
221 lines
8.5 KiB
Plaintext
package com.bonus.index.controller;
|
||
|
||
import java.io.IOException;
|
||
import java.io.OutputStream;
|
||
import java.io.UnsupportedEncodingException;
|
||
import java.net.URLEncoder;
|
||
import java.util.ArrayList;
|
||
import java.util.List;
|
||
import java.util.Map;
|
||
|
||
import javax.servlet.http.HttpServletRequest;
|
||
import javax.servlet.http.HttpServletResponse;
|
||
import javax.servlet.http.HttpSession;
|
||
|
||
import org.apache.poi.hssf.usermodel.*;
|
||
import org.apache.poi.ss.usermodel.BorderStyle;
|
||
import org.apache.poi.ss.usermodel.HorizontalAlignment;
|
||
import org.apache.poi.ss.usermodel.VerticalAlignment;
|
||
|
||
|
||
/**
|
||
* 导出表格工具类
|
||
*
|
||
* @author lvjilong
|
||
*/
|
||
public class ExcelUtils {
|
||
|
||
//excel默认宽度;
|
||
private static int width = 256 * 14;
|
||
//默认字体
|
||
private static String excelfont = "微软雅黑";
|
||
|
||
/**
|
||
* @param excelName 导出的EXCEL名字
|
||
* @param sheetName 导出的SHEET名字 当前sheet数目只为1
|
||
* @param headers 导出的表格的表头
|
||
* @param ds_titles 导出的数据 map.get(key) 对应的 key
|
||
* @param ds_format 导出数据的样式
|
||
* 1:String left;
|
||
* 2:String center
|
||
* 3:String right
|
||
* 4 int right
|
||
* 5:float ###,###.## right
|
||
* 6:number: #.00% 百分比 right
|
||
* @param widths 表格的列宽度 默认为 256*14
|
||
* @param data 数据集 List<Map>
|
||
* @param response
|
||
* @throws IOException
|
||
*/
|
||
public static void export(String excelName, String sheetName, String[] headers, String[] ds_titles, int[] ds_format, int[] widths, List<Map<String, Object>> data, HttpServletRequest request, HttpServletResponse response) throws IOException {
|
||
HttpSession session = request.getSession();
|
||
session.setAttribute("state", null);
|
||
if (widths == null) {
|
||
widths = new int[ds_titles.length];
|
||
for (int i = 0; i < ds_titles.length; i++) {
|
||
widths[i] = width;
|
||
}
|
||
}
|
||
if (ds_format == null) {
|
||
ds_format = new int[ds_titles.length];
|
||
for (int i = 0; i < ds_titles.length; i++) {
|
||
ds_format[i] = 1;
|
||
}
|
||
}
|
||
//设置文件名
|
||
String fileName = "";
|
||
if (isNotEmpty(excelName)) {
|
||
fileName = excelName;
|
||
}
|
||
//创建一个工作薄
|
||
HSSFWorkbook wb = new HSSFWorkbook();
|
||
//创建一个sheet
|
||
HSSFSheet sheet = wb.createSheet(isNotEmpty(sheetName) ? sheetName : "excel");
|
||
//创建表头,如果没有跳过
|
||
int headerrow = 0;
|
||
if (headers != null) {
|
||
HSSFRow row = sheet.createRow(headerrow);
|
||
//表头样式
|
||
HSSFCellStyle style = wb.createCellStyle();
|
||
HSSFFont font = wb.createFont();
|
||
font.setBold(true);
|
||
font.setFontName(excelfont);
|
||
font.setFontHeightInPoints((short) 11);
|
||
style.setFont(font);
|
||
// style.setVerticalAlignment(VerticalAlignment.CENTER);
|
||
style.setWrapText(true);
|
||
// style.setAlignment(HorizontalAlignment.CENTER);
|
||
// style.setBorderBottom(BorderStyle.THIN);
|
||
// style.setBorderLeft(BorderStyle.THIN);
|
||
// style.setBorderRight(BorderStyle.THIN);
|
||
// style.setBorderTop(BorderStyle.THIN);
|
||
for (int i = 0; i < headers.length; i++) {
|
||
sheet.setColumnWidth((short) i, (short) widths[i]);
|
||
HSSFCell cell = row.createCell(i);
|
||
cell.setCellValue(headers[i]);
|
||
cell.setCellStyle(style);
|
||
}
|
||
headerrow++;
|
||
}
|
||
//表格主体 解析list
|
||
if (data != null) {
|
||
List styleList = new ArrayList();
|
||
for (int i = 0; i < ds_titles.length; i++) { //列数
|
||
HSSFCellStyle style = wb.createCellStyle();
|
||
HSSFFont font = wb.createFont();
|
||
font.setFontName(excelfont);
|
||
font.setFontHeightInPoints((short) 10);
|
||
style.setFont(font);
|
||
// style.setBorderBottom(BorderStyle.THIN);
|
||
// style.setBorderLeft(BorderStyle.THIN);
|
||
// style.setBorderRight(BorderStyle.THIN);
|
||
// style.setBorderTop(BorderStyle.THIN);
|
||
// if (ds_format[i] == 1) {
|
||
// style.setAlignment(HorizontalAlignment.LEFT);
|
||
// } else if (ds_format[i] == 2) {
|
||
// style.setAlignment(HorizontalAlignment.CENTER);
|
||
// } else if (ds_format[i] == 3) {
|
||
// style.setAlignment(HorizontalAlignment.RIGHT);
|
||
// //int类型
|
||
// } else if (ds_format[i] == 4) {
|
||
// style.setAlignment(HorizontalAlignment.RIGHT);
|
||
// //int类型
|
||
// style.setDataFormat(HSSFDataFormat.getBuiltinFormat("0"));
|
||
// } else if (ds_format[i] == 5) {
|
||
// //float类型
|
||
// style.setAlignment(HorizontalAlignment.RIGHT);
|
||
// style.setDataFormat(HSSFDataFormat.getBuiltinFormat("#,##0.00"));
|
||
// } else if (ds_format[i] == 6) {
|
||
// //百分比类型
|
||
// style.setAlignment(HorizontalAlignment.RIGHT);
|
||
// style.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00%"));
|
||
// }
|
||
styleList.add(style);
|
||
}
|
||
for (int i = 0; i < data.size(); i++) { //行数
|
||
HSSFRow row = sheet.createRow(headerrow);
|
||
Map map = data.get(i);
|
||
for (int j = 0; j < ds_titles.length; j++) { //列数
|
||
HSSFCell cell = row.createCell(j);
|
||
Object o = map.get(ds_titles[j]);
|
||
if (o == null || "".equals(o)) {
|
||
cell.setCellValue("");
|
||
} else if (ds_format[j] == 4) {
|
||
//int
|
||
cell.setCellValue((Long.valueOf((map.get(ds_titles[j])) + "")).longValue());
|
||
} else if (ds_format[j] == 5 || ds_format[j] == 6) {
|
||
//float
|
||
cell.setCellValue((Double.valueOf((map.get(ds_titles[j])) + "")).doubleValue());
|
||
} else {
|
||
cell.setCellValue(map.get(ds_titles[j]) + "");
|
||
}
|
||
cell.setCellStyle((HSSFCellStyle) styleList.get(j));
|
||
}
|
||
headerrow++;
|
||
}
|
||
}
|
||
|
||
fileName = fileName + ".xls";
|
||
String filename = "";
|
||
try {
|
||
filename = encodeChineseDownloadFileName(request, fileName);
|
||
} catch (Exception e) {
|
||
e.printStackTrace();
|
||
}
|
||
response.setHeader("Content-disposition", filename);
|
||
response.setContentType("application/vnd.ms-excel");
|
||
response.setHeader("Content-disposition", "attachment;filename=" + filename);
|
||
response.setHeader("Pragma", "No-cache");
|
||
OutputStream ouputStream = response.getOutputStream();
|
||
wb.write(ouputStream);
|
||
ouputStream.flush();
|
||
ouputStream.close();
|
||
wb.close();
|
||
}
|
||
|
||
/**
|
||
* 对文件流输出下载的中文文件名进行编码 屏蔽各种浏览器版本的差异性
|
||
*
|
||
* @throws UnsupportedEncodingException
|
||
*/
|
||
public static String encodeChineseDownloadFileName(
|
||
HttpServletRequest request, String pFileName) throws Exception {
|
||
String filename = null;
|
||
String agent = request.getHeader("USER-AGENT");
|
||
if (null != agent) {
|
||
if (contains(agent, "MSIE") || contains(agent, "like Gecko")) {//IE浏览器
|
||
filename = URLEncoder.encode(pFileName, "UTF-8");
|
||
} else if (contains(agent, "Mozilla")) {//google,火狐浏览器
|
||
filename = new String(pFileName.getBytes(), "ISO8859-1");
|
||
} else {//其他
|
||
filename = URLEncoder.encode(pFileName, "UTF-8");
|
||
}
|
||
} else {
|
||
filename = pFileName;
|
||
}
|
||
return filename;
|
||
}
|
||
|
||
/**
|
||
* 判断字符串 不为空
|
||
*/
|
||
public static boolean isNotEmpty(String str) {
|
||
return !isEmpty(str);
|
||
}
|
||
|
||
public static boolean isEmpty(String str) {
|
||
if (str == null || "" .equals(str.trim())) {
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
public static boolean contains(String s1, String s2) {
|
||
if (isEmpty(s1)) {
|
||
return false;
|
||
}
|
||
return s1.contains(s2);
|
||
|
||
}
|
||
|
||
} |