GZMachinesWeb/.svn/pristine/76/76855bb2a410a207ddc223aa368...

221 lines
8.5 KiB
Plaintext
Raw Normal View History

2025-06-20 17:47:53 +08:00
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);
}
}