Java使用poi来导出Excel表格

本文介绍了一个用于生成和导出Excel文件的工具类实现,包括设置标题、合并单元格、填充数据等功能,并提供了文件保存及HTTP响应下载的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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); // 设置单元格样式
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值