Java使用poi来导出Excel表格

package com.ifourthwall.ppm.controller;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.List;
import java.util.Map;

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

import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.util.CellRangeAddress;

/***
 * Excel导出工具类
 * @author gzb
 */
@SuppressWarnings({ "deprecation", "unused" })
public class ExportExcelUtils {

    public static String TITlE = "title";//标题字体
    public static String HEAD = "head";
    public static String SYSTEM = "system";//系统字体
    public static String NORMAL = "normal";//正常字体
    public static String LINETYPE = "lineType";//条线字体
    public static String FUWU = "fuwu";//服务区域字体。样式与normal一样。用于区分是否换行
    public static int jobNameWidth = 21 * 160;//系统名称宽度
    public static int seqWidth = 13 * 160;//档案号宽度
    public static int taskWidth = 51 * 160;//保养类别宽度
    public static int zoneWidth = 50 * 160;//服务区域宽度
    public static int cycleWidth = 20 * 160;//服务频率宽度
    public static int vendorWidth = 20 * 160;//负责方宽度
    public static int weekNoWidth = 4 * 160;//周宽度
    public static int titleHeight = 23 * 3;//标题高度
    public static int lineTypeHeight = 7 * 3;//条线高度
    public static int weekNoHeight = 4 * 3;//周高度
    public static short GREEN = HSSFColor.LIME.index;//绿色
    public static short RED = HSSFColor.RED.index;//红色
    public static short ORANGE = HSSFColor.ORANGE.index;//橙色
    public static short GREY = HSSFColor.GREY_50_PERCENT.index;//灰色
    public static short WHITE = HSSFColor.WHITE.index;//白色
    public static short GREENOUT = HSSFColor.GREEN.index;//绿色

    /**
     *  用于本地测试
     * @author gzb
     * Date: 2016年11月7日 下午4:11:36
     * @param filePath 文件路径
     * @param wb 要写入文件的工作簿
     * @return
     * @throws Exception
     */
    public static synchronized String writeExcel(final String filePath, HSSFWorkbook wb) throws Exception {
        FileOutputStream fileOut = null;
        try {
            fileOut = new FileOutputStream(filePath);
            wb.write(fileOut);
        } catch (Exception e) {
            throw e;
        } finally {
            if (fileOut != null) {
                fileOut.close();
            }
            if (wb != null) {
                wb.close();
            }
        }

        return filePath;
    }

    /**
     * excel 下载
     * @author xuye
     * Date: 2016年11月10日 上午11:09:26
     * @param wb
     * @param fileTile
     * @param response
     */
    public static void exportExeclData(HSSFWorkbook wb, String fileTile, HttpServletResponse response) {
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        String filename = fileTile + ".xls";
        try {
            wb.write(os);//把excel装到os中
            response.reset();//清缓存,设置不缓存
            response.setContentType("application/vnd.ms-excel;charset=utf-8");//文件客户端按.xls来解析文档
            //告知客户端为下载类型文件
            response.setHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes(), "iso-8859-1"));
            byte[] content = os.toByteArray();
            InputStream is = new ByteArrayInputStream(content);
            ServletOutputStream out = response.getOutputStream();//读取文件流
            bis = new BufferedInputStream(is);
            bos = new BufferedOutputStream(out);
            byte[] buff = new byte[2048];
            int bytesRead;
            while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {//下载
                bos.write(buff, 0, bytesRead);
            }
        } catch (final Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (bis != null) {
                    bis.close();
                }
                if (bos != null) {
                    bos.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
    }

    /**
     * 设置标题
     * @author xuye
     * Date: 2016年11月8日 上午9:49:41
     * @param wb
     * @param title 标题
     * @param sheet 页
     * @param num 合并单元格的数量
     * @return
     */
    public static HSSFSheet createTitle(HSSFWorkbook wb, String title, HSSFSheet sheet, int num) {
        HSSFRow row = sheet.createRow(0);//创建行
        //<<<<<<<<<<<<<<<<
        HSSFFont font = wb.createFont();//设置字体
        font.setColor(HSSFColor.BLACK.index);//颜色
        font.setFontHeightInPoints((short) 23);//字体大小
        font.setBold(true); //字体加粗
        font.setFontName("微软雅黑");
        //<<<<<<<<<<<<<<<<
        ExportExcelUtils.createCell(wb, row, 0, TITlE, HorizontalAlignment.CENTER,
                VerticalAlignment.CENTER, title, WHITE, font);//插入标题
        row.setHeightInPoints(titleHeight);//设置行高
        sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, num));
        return sheet;
    }

    /**
     * 创建条线类别一栏
     * @author xuye
     * Date: 2016年11月8日 上午10:09:43
     * @param wb
     * @param sheet 页
     * @param linetype 条线
     * @param regions 服务区域
     * @param services 服务频次
     * @param providers 负责方
     * @param num 合并数量
     * @return
     */
    public static HSSFSheet createLineType(HSSFWorkbook wb, HSSFSheet sheet, String linetype, int num,
            String regions, String services, String providers) {
        String[] str = { "服务区域:", "服务频次:", "负责方:" };
        String[] str2 = { regions, services, providers };
        //<<<<<<<<<<<<<<<<
        HSSFFont lineTypeFont = wb.createFont();//条线字体
        lineTypeFont.setColor(HSSFColor.RED.index);
        lineTypeFont.setFontHeightInPoints((short) 17);
        lineTypeFont.setBold(true);
        lineTypeFont.setFontName("微软雅黑");
        //<<<<<<<<<<<<<<<<
        HSSFFont systemFont = wb.createFont();//条线字体
        systemFont.setColor(HSSFColor.BLACK.index);
        systemFont.setFontHeightInPoints((short) 11);
        systemFont.setBold(true);
        systemFont.setFontName("微软雅黑");
        //<<<<<<<<<<<<<<<<
        for (int i = 1; i < 4; i++) {//循环创建第2行到第4行
            HSSFRow row = sheet.createRow(i);
            row.setHeightInPoints(lineTypeHeight);//设置行高
            if (i == 1) {
                ExportExcelUtils.createCell(wb, row, 0, LINETYPE, HorizontalAlignment.CENTER,
                        VerticalAlignment.CENTER, linetype, WHITE, lineTypeFont);//插入条线
            } else {
                ExportExcelUtils.createCell(wb, row, 0, LINETYPE, HorizontalAlignment.CENTER,
                        VerticalAlignment.CENTER, "", WHITE, lineTypeFont);//用于条线合并单元格
            }
            ExportExcelUtils.createCell(wb, row, 1, SYSTEM, HorizontalAlignment.CENTER,
                    VerticalAlignment.CENTER, str[i - 1], WHITE, systemFont);//插入服务区域等.
            //ExportExcelUtils.createCell(wb, row, 2, SYSTEM, HorizontalAlignment.CENTER,
            //VerticalAlignment.CENTER, "", WHITE, systemFont);//用于服务区域的单元合并
            //sheet.addMergedRegion(new CellRangeAddress(i, i, 1, 2));//合并服务区域单元格
            ExportExcelUtils.createCell(wb, row, 2, SYSTEM, HorizontalAlignment.LEFT,
                    VerticalAlignment.CENTER, str2[i - 1], WHITE, systemFont);//插入相应的值
            for (int f = 3; f < num + 1; f++) {
                ExportExcelUtils.createCell(wb, row, f, SYSTEM, HorizontalAlignment.LEFT,
                        VerticalAlignment.CENTER, "", WHITE, systemFont);//插入相应的值
            }
            sheet.addMergedRegion(new CellRangeAddress(i, i, 2, num));

        }
        sheet.addMergedRegion(new CellRangeAddress(1, 3, 0, 0));//合并条线单元格
        return sheet;

    }

    /**
     * 创建系统月份这一栏
     * @author xuye
     * Date: 2016年11月8日 下午1:24:33
     * @param wb
     * @param sheet 页
     * @param date 月份集合
     * @return
     */
    public static HSSFSheet createYearMonth(HSSFWorkbook wb, HSSFSheet sheet, List
    
    
     
     > date) {
        //<<<<<<<<<<<<<<<<
        HSSFFont systemFont = wb.createFont();//条线字体
        systemFont.setColor(HSSFColor.BLACK.index);
        systemFont.setFontHeightInPoints((short) 11);
        systemFont.setBold(true);
        systemFont.setFontName("微软雅黑");
        //<<<<<<<<<<<<<<<<
        HSSFFont normalFont = wb.createFont();//条线字体
        normalFont.setColor(HSSFColor.BLACK.index);
        normalFont.setFontHeightInPoints((short) 9);
        normalFont.setBold(true);
        normalFont.setFontName("微软雅黑");
        //<<<<<<<<<<<<<<<<
        HSSFRow row4 = sheet.createRow(4);//创建行
        row4.setHeightInPoints(weekNoHeight);//设置行高
        HSSFRow row5 = sheet.createRow(5);//创建行,用户单元合并
        row5.setHeightInPoints(weekNoHeight);//设置行高

        int num = 0;
        String[] str = { "系统", "保养类别", "服务区域", "服务频率", "负责方" };
        int[] width = { jobNameWidth, taskWidth, zoneWidth, cycleWidth, vendorWidth };
        for (int i = 0; i < str.length; i++) {
            ExportExcelUtils.createCell(wb, row4, num, SYSTEM, HorizontalAlignment.CENTER,
                    VerticalAlignment.CENTER, str[i], WHITE, systemFont);//插入数据
            sheet.setColumnWidth(num, width[i]);//设置宽度
            ExportExcelUtils.createCell(wb, row5, num, SYSTEM, HorizontalAlignment.CENTER,
                    VerticalAlignment.CENTER, "", WHITE, systemFont);//用于单元合并。
            sheet.addMergedRegion(new CellRangeAddress(4, 5, num, num));//单元合并
            num++;
        }
        int week = num;
        int mon = num;
        //循环月份
        for (int i = 0; i < date.size(); i++) {
            Map
     
     
      
       map = date.get(i);
            //循环周数
            List
      
      
       
       
         > weeks = (List 
         
         
           >) map.get("week_list"); for (int j = 0; j < weeks.size(); j++) { Map 
          
            map2 = weeks.get(j); Long weekNo = Long.valueOf(String.valueOf(map2.get("week_no"))); ExportExcelUtils.createCell(wb, row5, week, NORMAL, HorizontalAlignment.CENTER, VerticalAlignment.CENTER, weekNo, WHITE, normalFont);//插入周数 sheet.setColumnWidth(week, weekNoWidth * 2);//设置宽度 week++; } String month = String.valueOf(map.get("month")); ExportExcelUtils.createCell(wb, row4, mon, NORMAL, HorizontalAlignment.CENTER, VerticalAlignment.CENTER, month + "月", WHITE, normalFont);//插入月份数 for (int j = mon + 1; j < week; j++) { ExportExcelUtils.createCell(wb, row4, j, NORMAL, HorizontalAlignment.CENTER, VerticalAlignment.CENTER, "", WHITE, normalFont);//插入月份数 } sheet.addMergedRegion(new CellRangeAddress(4, 4, mon, week - 1));//合并月份数 mon = week; } return sheet; } /** * * @author xuye * Date: 2016年11月9日 下午5:58:21 * @param wb excel * @param sheet 页 * @param data 对应条线的所有数据 * @return */ public static HSSFSheet createJob(HSSFWorkbook wb, HSSFSheet sheet, List 
            
            
              > data) { //<<<<<<<<<<<<<<<< HSSFFont systemFont = wb.createFont();//条线字体 systemFont.setColor(HSSFColor.BLACK.index); systemFont.setFontHeightInPoints((short) 11); systemFont.setBold(true); systemFont.setFontName("微软雅黑"); //<<<<<<<<<<<<<<<< HSSFFont normalFont = wb.createFont();//条线字体 normalFont.setColor(HSSFColor.BLACK.index); normalFont.setFontHeightInPoints((short) 9); normalFont.setBold(true); normalFont.setFontName("微软雅黑"); int rownum = 6;//初始从第6行开始创建 int seq = 1; for (Map 
             
               dataMap : data) {//循环系统 int indexRow = rownum; //循环保养类别 List 
               
               
                 > taskList = (List 
                 
                 
                   >) dataMap.get("task_list"); for (Map 
                  
                    taskMap : taskList) { int cell = 1;//初始从第0列开始 HSSFRow taskRow1 = sheet.createRow(rownum); taskRow1.setHeightInPoints(weekNoHeight * 2);//设置行高 ExportExcelUtils.createCell(wb, taskRow1, 0, SYSTEM, HorizontalAlignment.CENTER, VerticalAlignment.CENTER, String.valueOf(dataMap.get("job_name_lv2")), GREEN, systemFont); rownum++; //HSSFRow taskRow2 = sheet.createRow(rownum);//用于合并单元格 //rownum++; //ExportExcelUtils.createCell(wb, taskRow1, cell, NORMAL, HorizontalAlignment.CENTER, // VerticalAlignment.CENTER, String.valueOf(seq), GREEN, normalFont); //sheet.addMergedRegion(new CellRangeAddress(rownum - 2, rownum - 1, cell, cell));//合并档案号单元格 //seq++; //cell++; ExportExcelUtils.createCell(wb, taskRow1, cell, NORMAL, HorizontalAlignment.CENTER, VerticalAlignment.CENTER, String.valueOf(taskMap.get("task_name")), GREEN, normalFont); //sheet.addMergedRegion(new CellRangeAddress(rownum - 2, rownum - 1, cell, cell));//合并保养类别单元格 cell++; ExportExcelUtils.createCell(wb, taskRow1, cell, FUWU, HorizontalAlignment.CENTER, VerticalAlignment.CENTER, String.valueOf(taskMap.get("zone_list")), GREEN, normalFont); //sheet.addMergedRegion(new CellRangeAddress(rownum - 2, rownum - 1, cell, cell));//合并服务区域 cell++; ExportExcelUtils.createCell(wb, taskRow1, cell, NORMAL, HorizontalAlignment.CENTER, VerticalAlignment.CENTER, String.valueOf(taskMap.get("cycle_period")), GREEN, normalFont); //sheet.addMergedRegion(new CellRangeAddress(rownum - 2, rownum - 1, cell, cell));//合并服务频率单元格 cell++; ExportExcelUtils.createCell(wb, taskRow1, cell, NORMAL, HorizontalAlignment.CENTER, VerticalAlignment.CENTER, String.valueOf(taskMap.get("vendor_name")), GREEN, normalFont); //sheet.addMergedRegion(new CellRangeAddress(rownum - 2, rownum - 1, cell, cell));//合并负责方单元格 cell++; //taskRow1.createCell(cell).setCellValue("计划");//计划 //taskRow2.createCell(cell).setCellValue("实施");//实施 //循环日程列表 List 
                    
                    
                      > gridList = (List 
                      
                      
                        >) taskMap.get("grid_list"); int cell2 = cell; for (int i = 0; i < gridList.size(); i++) { Map 
                       
                         gridMap = gridList.get(i); //for (Map 
                        
                          gridMap : gridList) { String week_no = String.valueOf(gridMap.get("week_no")); String status = String.valueOf(gridMap.get("status")); if (week_no != null && week_no.matches("^[0-9]+$")) { short color = 0; if ("0".equals(status)) { color = GREY;//日程未开始,灰色 } else if ("1".equals(status)) { color = GREENOUT;//日程等待完成 } else if ("2".equals(status)) { color = GREEN;//日程按时完成 } else if ("3".equals(status)) { color = ORANGE;//日程超时完成 } else if ("4".equals(status)) { color = RED;//日程超时未完成 } int gridCell = cell + Integer.valueOf(week_no) - 1; ExportExcelUtils.createCell(wb, taskRow1, gridCell, NORMAL, HorizontalAlignment.CENTER, VerticalAlignment.CENTER, "", color, normalFont); } } } if ((rownum - 1) - indexRow > 0) {//如果只有一行,且进行单元合并的话,会报错 sheet.addMergedRegion(new CellRangeAddress(indexRow, rownum - 1, 0, 0)); } } return sheet; } /** * * @author xuye * Date: 2016年11月9日 下午6:02:25 * @param wb 工作簿 * @param row 行 * @param column 列 * @param type 原来是文字类型 * @param halign 水平方向 * @param valign 垂直方向 * @param value 单元格的文字 * @param color 背景颜色 * @param font 字体样式 */ public static void createCell(HSSFWorkbook wb, Row row, int column, String type, HorizontalAlignment halign, VerticalAlignment valign, Object value, short color, HSSFFont font) { Cell cell = row.createCell(column); if (value != null && value.toString().matches("^[0-9]+$")) { int valueInt = Integer.valueOf(value.toString()); cell.setCellValue(valueInt); } else { cell.setCellValue(value.toString()); } HSSFCellStyle style = wb.createCellStyle(); if (color != 0 && color != GREENOUT) { style.setFillForegroundColor(color);//设置背景颜色 style.setFillPattern(FillPatternType.SOLID_FOREGROUND);//设置背景颜色 short index = HSSFColor.LIME.index; } style.setAlignment(halign); // 设置水平对齐的样式为居中对齐 style.setVerticalAlignment(valign); // 设置垂直对齐的样式为居中对齐 style.setBorderBottom(BorderStyle.THICK);//下边框 style.setBorderLeft(BorderStyle.THICK);//左边框 style.setBorderRight(BorderStyle.THICK);//右边框 style.setBorderTop(BorderStyle.THICK);//上边框 if (!ExportExcelUtils.TITlE.equals(type) && ExportExcelUtils.GREENOUT != color) { style.setBottomBorderColor(HSSFColor.BLACK.index);//边框颜色 style.setLeftBorderColor(HSSFColor.BLACK.index); style.setRightBorderColor(HSSFColor.BLACK.index); style.setTopBorderColor(HSSFColor.BLACK.index); } else if (ExportExcelUtils.GREENOUT == color) { style.setBottomBorderColor(GREEN); style.setLeftBorderColor(GREEN); style.setRightBorderColor(GREEN); style.setTopBorderColor(GREEN); } if (!ExportExcelUtils.FUWU.equals(type)) {//服务区域不自动换行 style.setWrapText(true);//自动换行 } style.setFont(font);//设置字体 cell.setCellStyle(style); // 设置单元格样式 } } 
                         
                        
                       
                     
                   
                  
                
              
             
           
          
       
     
     
    
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值