IntelligentRecognition/ah-jjsp-service/.svn/pristine/49/49e052a858fa9e5019d4dd2c7d0...

265 lines
11 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.sercurityControl.decision.utils;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.CellRangeAddressList;
import org.apache.poi.util.Units;
import org.apache.poi.xssf.usermodel.*;
import org.springframework.util.ObjectUtils;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.Base64;
import java.util.List;
import java.util.Map;
public class ExcelExportUtil {
public ExcelExportUtil() {
}
private XSSFWorkbook workbook;
/**
* @param data 数据集 类型String
* @param headList 表头集合
* @param colWidths 列宽
*/
public static void excelFileExport(HttpServletResponse response, String fileName, List<List<Object>> data,
List<List<String>> headList, List<Integer> colWidths) {
excelFileExport(response, fileName, data, headList,null, colWidths,null,null);
}
public static void excelFileExport(HttpServletResponse response, String fileName, List<List<Object>> data,
List<List<String>> headList, List<Integer> colWidths,List<String[]> validationList, List<Integer> validationColList) {
excelFileExport(response, fileName, data, headList,null, colWidths,validationList,validationColList);
}
public static void excelFileExport(HttpServletResponse response, String fileName, List<List<Object>> data,
List<List<String>> headList,List<int[]> mergeList, List<Integer> colWidths) {
excelFileExport(response, fileName, data, headList,mergeList,colWidths,null,null);
}
/**
* @param fileName 文件名
* @param data 数据集
* @param headList 表头集合
* @param mergeList 合并规则集合(数组长度只能为4)
* @param colWidths 列宽
* @param values 下拉选择项
* @param colList 下拉列集合
*/
public static void excelFileExport(HttpServletResponse response, String fileName, List<List<Object>> data,
List<List<String>> headList, List<int[]> mergeList, List<Integer> colWidths,List<String[]> values, List<Integer> colList) {
try {
String encodeFileName = URLEncoder.encode(fileName, "UTF-8");
response.addHeader("Content-Disposition", "attachment; filename=\"" + encodeFileName + "\"");
ExcelExportUtil excel = new ExcelExportUtil();
InputStream input = excel.getExcelFile(data, headList, mergeList, colWidths,values, colList);
XSSFWorkbook wb = new XSSFWorkbook(input);
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8");
OutputStream ouputStream = response.getOutputStream();
wb.write(ouputStream);
ouputStream.flush();
ouputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 创建行元素
*
* @param style 样式
* @param height 行高
* @param value 行显示的内容
* @param row1 起始行
* @param row2 结束行
* @param col1 起始列
* @param col2 结束列
*/
private void createRow(XSSFCellStyle style, XSSFSheet sheet, int height, String value, int row1, int row2, int col1, int col2) {
sheet.addMergedRegion(new CellRangeAddress(row1, row2, col1, col2)); //设置从第row1行合并到第row2行第col1列合并到col2列
XSSFRow rows = sheet.createRow(row1); //设置第几行
rows.setHeight((short) height); //设置行高
XSSFCell cell = rows.createCell(col1); //设置内容开始的列
cell.setCellStyle(style); //设置样式
cell.setCellValue(value); //设置该行的值
}
/**
* 创建样式
*
* @param fontSize 字体大小
* @param bold 是否加粗
* @return style
*/
private XSSFCellStyle getStyle(int fontSize, boolean bold, boolean border) {
Font font = workbook.createFont();
font.setFontName("宋体");
font.setFontHeightInPoints((short) fontSize);// 字体大小
if (bold) {
font.setBold(true);
}
XSSFCellStyle style = (XSSFCellStyle) workbook.createCellStyle();
style.setFont(font); //设置字体
style.setAlignment(HorizontalAlignment.CENTER); // 左右居中2 居右3 默认居左
style.setVerticalAlignment(VerticalAlignment.CENTER);// 上下居中1
XSSFDataFormat format = workbook.createDataFormat();
style.setDataFormat(format.getFormat("@"));
style.setWrapText(true);
if (border) {
style.setBorderRight(BorderStyle.MEDIUM);
style.setBorderLeft(BorderStyle.MEDIUM);
style.setBorderBottom(BorderStyle.MEDIUM);
style.setBorderTop(BorderStyle.MEDIUM);
style.setLocked(true);
}
return style;
}
/**
* 根据数据集生成Excel并返回Excel文件流
*
* @param data 数据集
* @return ba
* @throws IOException io异常
*/
public InputStream getExcelFile(List<List<Object>> data, List<List<String>> headList, List<int[]> mergeList, List<Integer> colWidths,List<String[]> values, List<Integer> colList) throws IOException {
try {
workbook = new XSSFWorkbook();
XSSFCellStyle cellStyle = getStyle(14, false, true);
XSSFSheet sheet = workbook.createSheet("Sheet1");
int startRow = createHeadCell(sheet, headList, mergeList, colWidths);
setCellData(data, sheet, cellStyle, startRow);
if (ObjectUtils.isEmpty(data) && !ObjectUtils.isEmpty(values)){
for (int i = 0; i < values.size(); i++) {
setDropDownBox("Sheet1",values.get(i),colList.get(i),startRow);
}
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
workbook.write(baos);
byte[] ba = baos.toByteArray();
return new ByteArrayInputStream(ba);
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
data = null;
if (workbook != null) {
workbook.close();
}
}
}
/**
* 创建表头
*
*/
private int createHeadCell(XSSFSheet sheet, List<List<String>> headList, List<int[]> mergeList, List<Integer> colWidths) {
/*创建表头*/
XSSFCellStyle cellStyle = getStyle(15, false, true);
for (int i = 0; i < headList.size(); i++) {
XSSFRow row2 = sheet.createRow(i);
row2.setHeight((short) 0x289);
for (int j = 0; j < headList.get(i).size(); j++) {
XSSFCell tempCell = row2.createCell(j);
tempCell.setCellValue(headList.get(i).get(j));
tempCell.setCellStyle(cellStyle);
if (colWidths != null && j < colWidths.size() && i == 0) {
sheet.setColumnWidth(j, 10 * colWidths.get(j));
}
}
}
/*合并单元格
* merge[0], merge[1] 行合并 相等为不合并
* merge[2], merge[3] 列合并
*/
if (!ObjectUtils.isEmpty(mergeList)) {
for (int[] merge : mergeList) {
if (merge.length == 4) {
sheet.addMergedRegion(new CellRangeAddress(merge[0], merge[1], merge[2], merge[3]));
}
}
}
// 从哪一行开始渲染表体
return headList.size();
}
/**
* 创建表体数据
*
* @param data 表体数据
* @param cellStyle 样式
* @param startRow 开始行
*/
private void setCellData(List<List<Object>> data, XSSFSheet sheet, XSSFCellStyle cellStyle, int startRow) {
XSSFRow row = null;
XSSFCell cell = null;
if (data != null && data.size() > 0) {
for (List<Object> rowData : data) {
row = sheet.createRow(startRow);
row.setHeight((short) 0xB99);
for (int j = 0; j < rowData.size();j++) {
cell = row.createCell(j);
cell.setCellStyle(cellStyle);
cell.setCellType(CellType.STRING);
cell.setCellValue(rowData.get(j) == null ? "" : String.valueOf(rowData.get(j)));
}
startRow++;
}
} else {
for (int j = startRow; j < startRow + 100; j++) {
row = sheet.createRow(j);
row.setHeight((short) 0x299);
for (int i = 0; i < sheet.getRow(0).getLastCellNum(); i++) {
cell = row.createCell(i);
cell.setCellStyle(cellStyle);
cell.setCellType(CellType.STRING);
cell.setCellValue("");
}
}
}
}
private void setDropDownBox(String sheetName, String[] values, Integer col,int startRow) {
//获取所有sheet页个数
int sheetTotal = workbook.getNumberOfSheets();
//处理下拉数据
if (values != null && values.length != 0) {
//新建一个sheet页
String hiddenSheetName = "hiddenSheet";
XSSFSheet hiddenSheet = workbook.getSheet(hiddenSheetName);
if (hiddenSheet == null) {
hiddenSheet = workbook.createSheet(hiddenSheetName);
sheetTotal++;
}
// 获取数据起始行
int startRowNum = hiddenSheet.getLastRowNum() + 1;
int endRowNum = startRowNum;
//写入下拉数据到新的sheet页中
for (String value : values) {
hiddenSheet.createRow(endRowNum++).createCell(0).setCellValue(value);
}
//将新建的sheet页隐藏掉
workbook.setSheetHidden(sheetTotal - 1, true);
//获取新sheet页内容
String strFormula = hiddenSheetName + "!$A$" + ++startRowNum + ":$A$" + endRowNum;
// 设置下拉
XSSFSheet mainSheet = workbook.getSheet(sheetName);
mainSheet.addValidationData(setDataValidation(strFormula, mainSheet, col, col,startRow));
}
}
private DataValidation setDataValidation(String strFormula, XSSFSheet mainSheet, int firstCol, int endCol,int startRow) {
CellRangeAddressList regions = new CellRangeAddressList(startRow, startRow + 100, firstCol, endCol);
DataValidationHelper dvHelper = mainSheet.getDataValidationHelper();
DataValidationConstraint dataValidationConstraint = dvHelper.createFormulaListConstraint(strFormula);
DataValidation validation = dvHelper.createValidation(dataValidationConstraint, regions);
validation.setSuppressDropDownArrow(true);
return validation;
}
}