导出excel的两种方式(二)

1.调用类如下:

@RequestMapping("/exportExcel4ServiceFee")
    public void exportExcel4ServiceFee(LoanSplitModel loanSplitModel,HttpServletRequest request, HttpServletResponse response) {
		try {
			PageView<LoanSplitModel> pageView = collectionService.downPageView4RemindersServiceFee(loanSplitModel);
			String[] titles = new String[]{"序号","合同编号","客户姓名","合同金额"};
			SXXExcel excel = new SXXExcel(titles);
			StringBuffer sb = null;
			int count = 1;
			for (LoanSplitModel item : pageView.getRecords()) {
				sb = new StringBuffer();
				sb = sb.append(count++).append(",")//序号
	                   .append(item.getContractCode() != null ? item.getContractCode() : "").append(",")//合同编号
	                   .append(item.getCustomerName() != null ? item.getCustomerName() : "").append(",")//客户姓名
	                   .append(item.getContractMoney() != null ? df.format(item.getContractMoney()) : "").append(",");//合同金额
				excel.addSXSSFRow(sb.toString().split(","));
			}
			excel.outSXSSFFile(response, "催收服务费统计表.xlsx");
		} catch (Exception e) {
			e.printStackTrace();
            logger.error("-----------催收服务费统计列表导出excel异常", e);
		}
    }

 SXXExcel类如下:

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.math.BigDecimal;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.regex.Pattern;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.IOUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.streaming.SXSSFCell;
import org.apache.poi.xssf.streaming.SXSSFRow;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;

public class SXXExcel {
	
	private static SXSSFWorkbook workbook;
	private static CellStyle titleStyle; // 标题行样式
	private static Font titleFont; // 标题行字体
	private static CellStyle dateStyle; // 日期行样式
	private static Font dateFont; // 日期行字体
	private static CellStyle headStyle; // 表头行样式
	private static Font headFont; // 表头行字体
	private static CellStyle contentStyle; // 内容行样式
	private static Font contentFont; // 内容行字体
	private static CellStyle doubleContextStyle;
	
	/**
	 * @Description: 初始化
	 */
	private static void init() {
		workbook = new SXSSFWorkbook(1000);
		titleFont = workbook.createFont();
		titleStyle = workbook.createCellStyle();
		dateStyle = workbook.createCellStyle();
		dateFont = workbook.createFont();
		headStyle = workbook.createCellStyle();
		headFont = workbook.createFont();
		contentStyle = workbook.createCellStyle();
		contentFont = workbook.createFont();
		doubleContextStyle= workbook.createCellStyle();
		initTitleCellStyle();
		initTitleFont();
		initDateCellStyle();
		initDateFont();
		initHeadCellStyle();
		initHeadFont();
		initContentCellStyle();
		initContentFont();
		initDoubleContextStyle();
	}
	
	/**
	 * @Description: 初始化标题行样式
	 */
	private static void initTitleCellStyle() {
		titleStyle.setAlignment(CellStyle.ALIGN_CENTER);
		titleStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
		titleStyle.setFont(titleFont);
		titleStyle.setFillBackgroundColor(IndexedColors.YELLOW.getIndex());

	}

	/**
	 * @Description: 初始化日期行样式
	 */
	private static void initDateCellStyle() {
		dateStyle.setAlignment(CellStyle.ALIGN_CENTER_SELECTION);
		dateStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
		dateStyle.setFont(dateFont);
		dateStyle.setFillBackgroundColor(IndexedColors.SKY_BLUE.getIndex());
	}

	/**
	 * @Description: 初始化表头行样式
	 */
	private static void initHeadCellStyle() {

		headStyle.setAlignment(CellStyle.ALIGN_CENTER);
		headStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
		headStyle.setFont(headFont);
		headStyle.setFillBackgroundColor(IndexedColors.YELLOW.getIndex());
		headStyle.setBorderTop(CellStyle.BORDER_MEDIUM);
		headStyle.setBorderBottom(CellStyle.BORDER_THIN);
		headStyle.setBorderLeft(CellStyle.BORDER_THIN);
		headStyle.setBorderRight(CellStyle.BORDER_THIN);
		headStyle.setTopBorderColor(IndexedColors.BLUE.getIndex());
		headStyle.setBottomBorderColor(IndexedColors.BLUE.getIndex());
		headStyle.setLeftBorderColor(IndexedColors.BLUE.getIndex());
		headStyle.setRightBorderColor(IndexedColors.BLUE.getIndex());
	}

	/**
	 * @Description: 初始化内容行样式
	 */
	private static void initContentCellStyle() {
		contentStyle.setAlignment(CellStyle.ALIGN_CENTER);
		contentStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
		contentStyle.setFont(contentFont);
		contentStyle.setBorderTop(CellStyle.BORDER_THIN);
		contentStyle.setBorderBottom(CellStyle.BORDER_THIN);
		contentStyle.setBorderLeft(CellStyle.BORDER_THIN);
		contentStyle.setBorderRight(CellStyle.BORDER_THIN);
		contentStyle.setTopBorderColor(IndexedColors.BLUE.getIndex());
		contentStyle.setBottomBorderColor(IndexedColors.BLUE.getIndex());
		contentStyle.setLeftBorderColor(IndexedColors.BLUE.getIndex());
		contentStyle.setRightBorderColor(IndexedColors.BLUE.getIndex());
		contentStyle.setWrapText(true); // 字段换行
	}
	
	private static void initDoubleContextStyle(){
		doubleContextStyle.setAlignment(CellStyle.ALIGN_CENTER);
		doubleContextStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
		doubleContextStyle.setFont(contentFont);
		doubleContextStyle.setBorderTop(CellStyle.BORDER_THIN);
		doubleContextStyle.setBorderBottom(CellStyle.BORDER_THIN);
		doubleContextStyle.setBorderLeft(CellStyle.BORDER_THIN);
		doubleContextStyle.setBorderRight(CellStyle.BORDER_THIN);
		doubleContextStyle.setTopBorderColor(IndexedColors.BLUE.getIndex());
		doubleContextStyle.setBottomBorderColor(IndexedColors.BLUE.getIndex());
		doubleContextStyle.setLeftBorderColor(IndexedColors.BLUE.getIndex());
		doubleContextStyle.setRightBorderColor(IndexedColors.BLUE.getIndex());
		doubleContextStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00"));
		doubleContextStyle.setWrapText(true); // 字段换行
	}

	/**
	 * @Description: 初始化标题行字体
	 */
	private static void initTitleFont() {
		titleFont.setFontName("华文楷体");
		titleFont.setFontHeightInPoints((short) 20);
		titleFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
		titleFont.setCharSet(Font.DEFAULT_CHARSET);
		titleFont.setColor(IndexedColors.BLUE_GREY.getIndex());
	}

	/**
	 * @Description: 初始化日期行字体
	 */
	private static void initDateFont() {
		dateFont.setFontName("隶书");
		dateFont.setFontHeightInPoints((short) 10);
		dateFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
		dateFont.setCharSet(Font.DEFAULT_CHARSET);
		dateFont.setColor(IndexedColors.BLUE_GREY.getIndex());
	}

	/**
	 * @Description: 初始化表头行字体
	 */
	private static void initHeadFont() {
		headFont.setFontName("宋体");
		headFont.setFontHeightInPoints((short) 10);
		headFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
		headFont.setCharSet(Font.DEFAULT_CHARSET);
		headFont.setColor(IndexedColors.BLUE_GREY.getIndex());
	}

	/**
	 * @Description: 初始化内容行字体
	 */
	private static void initContentFont() {
		contentFont.setFontName("宋体");
		contentFont.setFontHeightInPoints((short) 10);
		contentFont.setBoldweight(Font.BOLDWEIGHT_NORMAL);
		contentFont.setCharSet(Font.DEFAULT_CHARSET);
		contentFont.setColor(IndexedColors.BLUE_GREY.getIndex());
	}
		
	public SXXExcel(String title, String[] headers){
		init();
		SXSSFSheet sheet = workbook.createSheet();
		SXSSFRow fristRow=sheet.createRow(0);
		SXSSFCell titleCell =fristRow.createCell(0);
		titleCell.setCellStyle(titleStyle);
		titleCell.setCellValue(title);
		sheet.addMergedRegion(new CellRangeAddress(0,0,0,headers.length-1));
		SXSSFRow dateRow=sheet.createRow(1);
		SXSSFCell dateCell = dateRow.createCell(0);
		dateCell.setCellStyle(dateStyle);
		dateCell.setCellValue(new SimpleDateFormat("yyyy-MM-dd")
		.format(new Date()));
		sheet.addMergedRegion(new CellRangeAddress(1,1,0,headers.length-1));
		
		SXSSFRow headerRow=sheet.createRow(2);
		for(int i=0;i<headers.length;i++){
			SXSSFCell cell = headerRow.createCell(i);
			cell.setCellStyle(headStyle);
			cell.setCellType(HSSFCell.CELL_TYPE_STRING);
			cell.setCellValue(headers[i]);
		}
	}
	
	public SXXExcel(String[] headers){
		init();
		SXSSFSheet sheet = workbook.createSheet();
		SXSSFRow headerRow=sheet.createRow(0);
		for(int i=0;i<headers.length;i++)
		{
			SXSSFCell cell = headerRow.createCell(i);
			cell.setCellStyle(headStyle);
			cell.setCellType(HSSFCell.CELL_TYPE_STRING);
			cell.setCellValue(headers[i]);
		}
	}
	
	/**
	 * 往EXCEL追加数据
	 * @param filePath
	 * @param rows
	 */
	public void addSXSSFRow(List<Object[]> rows){
		SXSSFSheet sheet = workbook.getSheetAt(0);
		for(Object[] cells : rows)
		{
			SXSSFRow excelRow=sheet.createRow(sheet.getLastRowNum()+1);
			for(int i=0;i<cells.length;i++)
			{
				if(cells[i] instanceof Number)
				{
					SXSSFCell cell = excelRow.createCell(i);
					cell.setCellStyle(contentStyle);
					cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
					cell.setCellValue(((Number)cells[i]).doubleValue());
				}
				else
				{
					SXSSFCell cell = excelRow.createCell(i);
					cell.setCellStyle(contentStyle);
					cell.setCellType(HSSFCell.CELL_TYPE_STRING);
					cell.setCellValue(this.toString(cells[i]));
				}
			}
		}
	}
	
	/**
	 * 往EXCEL追加数据
	 * @param filePath
	 * @param rows
	 */
	public void addSXSSFRow(Object[] cells){
		SXSSFSheet sheet = workbook.getSheetAt(0);
		SXSSFRow excelRow=sheet.createRow(sheet.getLastRowNum()+1);
		Pattern p2=Pattern.compile("^(([1-9]\\d{0,9})|0)(\\.\\d{2})+$");
		
		for(int i=0;i<cells.length;i++)
		{
			sheet.setColumnWidth(i, 5900);
			if(cells[i] instanceof BigDecimal)
			{
				SXSSFCell cell = excelRow.createCell(i);
				cell.setCellStyle(contentStyle);
				cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
				cell.setCellValue(((BigDecimal)cells[i]).setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue());
			}
			else
			{
				if(null !=cells[i] && !"".equals(cells[i].toString())){
					boolean flag2 = p2.matcher(cells[i].toString()).matches();
					if (flag2) {
						SXSSFCell cell = excelRow.createCell(i);
						cell.setCellStyle(contentStyle);
						cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
						cell.setCellValue(Double.parseDouble(cells[i].toString()));
					}else {
						SXSSFCell cell = excelRow.createCell(i);
						cell.setCellStyle(contentStyle);
						cell.setCellType(HSSFCell.CELL_TYPE_STRING);
						cell.setCellValue(this.toString(cells[i]));
					}
				}else {
					SXSSFCell cell = excelRow.createCell(i);
					cell.setCellStyle(contentStyle);
					cell.setCellType(HSSFCell.CELL_TYPE_STRING);
					cell.setCellValue(this.toString(cells[i]));
				}
			}
		}
	}
	
	public void outSXSSFFile(String filePath){
		FileOutputStream outFile = null;
		java.io.BufferedOutputStream outStream = null;
		try {
			File file = new File(filePath);
			file.deleteOnExit();
			file.createNewFile();
			outFile = new FileOutputStream(filePath);
			outStream = new BufferedOutputStream(outFile);
			workbook.write(outStream);
			outStream.flush();
			workbook.dispose();
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			IOUtils.closeQuietly(outFile);
			IOUtils.closeQuietly(outStream);
		}
	}
	
	public void outSXSSFFile(HttpServletResponse response, String filename){
		ServletOutputStream outStream = null;
		try {
			filename = new String(filename.getBytes("utf-8"),"iso-8859-1");
			response.setCharacterEncoding("utf-8");
			response.setContentType("multipart/form-data");
			response.setHeader("Content-Disposition", "attachment;fileName="+ filename);
			outStream = response.getOutputStream();
			workbook.write(outStream);
			outStream.flush();
			workbook.dispose();
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			IOUtils.closeQuietly(outStream);
		}
	}
	
	private  String toString(Object val){
		if(val==null)
			return "";
		if(val instanceof String)
			return (String)val;
		else if(val instanceof Integer)
			return String.valueOf(val);
		else if(val instanceof Long)
			return String.valueOf(val);
		else if(val instanceof java.math.BigDecimal){
			NumberFormat format=NumberFormat.getNumberInstance() ;
			format.setMaximumFractionDigits(2);
			format.setGroupingUsed(false);
			return format.format(val) ; 
		}else if(val instanceof java.util.Date){
			SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");
			return format.format(val) ; 
		}else{
			return val.toString();
		}
	}
}

 

猜你喜欢

转载自zhangchunxiao.iteye.com/blog/2264796