首页>代码>java 通过Apache poi导出excel代码demo实例>/poi导出excel/代码示例/ExcelUtil.java
package net.xx.util;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;

import org.apache.poi.hssf.usermodel.HSSFCell;
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;

/**
 * @描述 负责将数据集(表单数据)导出Excel文件
 */
public class ExcelUtil {

    /**
     * 类实例
     */
    private static ExcelUtil export;

    /**
     * excel文档
     */
    private HSSFWorkbook workbook;

    /**
     * excel sheet
     */
    private HSSFSheet sheet;

    /**
     * 字节流
     */
    private OutputStream fileOutput;

    /**
     * 声明私有构造方法
     */
    private ExcelUtil() {

    }

    /**
     * 产生一个excel导出工具类实例(单例模式)
     * 
     * @return excel导出工具类对象
     */
    public static ExcelUtil newInstance() {
        if (export == null)
            export = new ExcelUtil();
        return export;
    }

    /**
     * @功能描述 设置excel文档(单表单)
     * @创建人 xx
     * @创建时间 2011-5-27 下午02:25:58
     * @param tName
     *            excel表名集
     * @param tHeader
     *            excel表头数据集
     * @param tValue
     *            excel表单数据集(除表头)
     * @param tHeaderStyle
     *            excel表头单元格样式
     * @param tValueStyle
     *            excel表单数据单元格样式(除表头)
     * @param filePath
     *            excel文件地址
     * @throws Exception
     *             异常往上抛出
     */
    public void exportExcel(String tName, ArrayList<String> tHeader, ArrayList<ArrayList<Object>> tValue,
            Map<String, Short> tHeaderStyle, Map<String, Short> tValueStyle, String filePath) throws Exception {

        try {
            // 当excel文档不存在时创建
            workbook = new HSSFWorkbook();

            // 单个表单赋值和样式
            this.setSheet(tName, tHeader, tValue, tHeaderStyle, tValueStyle);
            // 导出excel文件
            this.export(workbook, filePath);

        } catch (Exception e) {
            e.printStackTrace();

        }
    }

    /**
     * @功能描述 设置excel文档(单表单)
     * @创建人 xx
     * @创建时间 2011-5-27 下午02:25:58
     * @param tName
     *            excel表名集
     * @param tHeader
     *            excel表头数据集
     * @param tValue
     *            excel表单数据集(除表头)
     * @param tHeaderStyle
     *            excel表头单元格样式
     * @param tValueStyle
     *            excel表单数据单元格样式(除表头)
     * @throws Exception
     *             异常往上抛出
     */
    public InputStream exportExcelToStream(String tName, ArrayList<String> tHeader,
            ArrayList<ArrayList<Object>> tValue, Map<String, Short> tHeaderStyle, Map<String, Short> tValueStyle)
            throws Exception {

        // 当excel文档不存在时创建
        workbook = new HSSFWorkbook();

        // 单个表单赋值和样式
        this.setSheet(tName, tHeader, tValue, tHeaderStyle, tValueStyle);

        // 导出excel文件
        return export(workbook);

    }

    /**
     * @功能描述 设置excel文档(多表单)
     * @创建人 xx
     * @创建时间 2011-5-27 下午02:25:58
     * @param tName
     *            excel表名集
     * @param tHeader
     *            excel表头数据集
     * @param tValue
     *            excel表单数据集(除表头)
     * @param tHeaderStyle
     *            excel表头单元格样式
     * @param tValueStyle
     *            excel表单数据单元格样式(除表头)
     * @param filePath
     *            excel文件地址
     * @throws Exception
     *             异常往上抛出
     */
    public void exportExcel(ArrayList<String> tName, ArrayList<ArrayList<String>> tHeader,
            ArrayList<ArrayList<ArrayList<Object>>> tValue, ArrayList<Map<String, Short>> tHeaderStyle,
            ArrayList<Map<String, Short>> tValueStyle, String filePath) throws Exception {

        try {
            // 当excel文档不存在时创建
            workbook = new HSSFWorkbook();

            // for循环完成文档各个表单的赋值和样式
            for (int i = 0; i < tName.size(); i++) {
                this.setSheet(tName.get(i), tHeader.get(i), tValue.get(i), tHeaderStyle.get(i), tValueStyle.get(i)); // 单个表单赋值和样式
            }

            // 导出excel文件
            this.export(workbook, filePath);

        } catch (Exception e) {
        }
    }

    /**
     * @功能描述 设置excel文档(多表单)
     * @创建人 xx
     * @创建时间 2011-5-27 下午02:25:58
     * @param tName
     *            excel表名集
     * @param tHeader
     *            excel表头数据集
     * @param tValue
     *            excel表单数据集(除表头)
     * @param tHeaderStyle
     *            excel表头单元格样式
     * @param tValueStyle
     *            excel表单数据单元格样式(除表头)
     * @throws Exception
     *             异常往上抛出
     */
    public InputStream exportExcelToStream(ArrayList<String> tName, ArrayList<ArrayList<String>> tHeader,
            ArrayList<ArrayList<ArrayList<Object>>> tValue, ArrayList<Map<String, Short>> tHeaderStyle,
            ArrayList<Map<String, Short>> tValueStyle) throws Exception {

        // 当excel文档不存在时创建
        workbook = new HSSFWorkbook();

        // for循环完成文档各个表单的赋值和样式
        for (int i = 0; i < tName.size(); i++) {
            this.setSheet(tName.get(i), tHeader.get(i), tValue.get(i), tHeaderStyle.get(i), tValueStyle.get(i)); // 单个表单赋值和样式
        }
        return export(workbook);
    }

    /**
     * @功能描述 设置excel表单
     * @创建人 xx
     * @创建时间 2011-5-27 下午02:23:02
     * @param tName
     *            excel表名
     * @param tHeader
     *            excel表头数据集
     * @param tValue
     *            excel表单数据集(除表头)
     * @param tHeaderStyle
     *            excel表头单元格样式
     * @param tValueStyle
     *            excel表单数据单元格样式(除表头)
     * @throws Exception
     *             异常往上抛出
     */
    private void setSheet(String tName, ArrayList<String> tHeader, ArrayList<ArrayList<Object>> tValue,
            Map<String, Short> tHeaderStyle, Map<String, Short> tValueStyle) throws Exception {

        try {
            // 创建表单并设置其表名
            sheet = workbook.createSheet(tName);

            // 创建表单行
            HSSFRow tRow = sheet.createRow(0);

            // 赋值和样式(此时,为表头行)
            tRow = this.setTRow(tRow, tHeader, tHeaderStyle);

            // for循环完成表单数据的赋值和样式(除表头)
            for (int i = 0; i < tValue.size(); i++) {
                tRow = sheet.createRow(i + 1); // 获取表单行

                tRow = this.setTRow(tRow, tValue.get(i), tValueStyle); // 设置当前行的数据和样式
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * @功能描述 设置excel表单行数据
     * @创建人 xx
     * @创建时间 2011-5-27 下午02:22:30
     * @param row
     *            excel表单行
     * @param tRow
     *            excel表单行数据
     * @param tHeaderStyle
     *            excel表头样式
     * @return 设置后的的表单行
     * @throws Exception
     *             异常往外抛出
     */
    @SuppressWarnings("unchecked")
    private HSSFRow setTRow(HSSFRow row, ArrayList tRow, Map<String, Short> tHeaderStyle) throws Exception {

        try {
            // 获取单元格样式
            HSSFCellStyle cellStyle = this.setCellStyle(tHeaderStyle);
            // 声明单元格
            HSSFCell cell = null;

            // for循环完成该表单某行各个列赋值和样式
            for (int i = 0; i < tRow.size(); i++) {
                cell = row.createCell(i); // 获取每列单元格
                cell.setCellStyle(cellStyle); // 设置样式

                sheet.autoSizeColumn((short) i); // 设置单元格自适应
                Object obj = tRow.get(i); // 获取当前列的值
                // 判断对象所属类型, 并强转
                if (obj instanceof Integer) // 当数字时
                    cell.setCellValue((Integer) obj);
                if (obj instanceof String) // 当为字符串时
                    cell.setCellValue((String) obj);
                if (obj instanceof Boolean) // 当为布尔时
                    cell.setCellValue((Boolean) obj);
                if (obj instanceof Date) // 当为时间时
                    cell.setCellValue((Date) obj);
                if (obj instanceof Calendar) // 当为时间时
                    cell.setCellValue((Calendar) obj);
                if (obj instanceof Double) // 当为小数时
                    cell.setCellValue((Double) obj);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return row; // 返回
    }

    /**
     * @功能描述 设置单元格样式
     * @创建人 xx
     * @创建时间 2011-5-27 下午02:21:40
     * @param fontStyle
     *            样式Map集合
     * @return 设置后单元格样式
     * @throws Exception
     *             异常往外抛出
     */
    private HSSFCellStyle setCellStyle(Map<String, Short> fontStyle) throws Exception {

        // 声明单元格样式
        HSSFCellStyle cellStyle = null;
        try {
            // 创建字体
            HSSFFont font = workbook.createFont();
            // 设置字体样式
            // 设置字体颜色(红色为:HSSFFont.COLOR_RED 这里表示short类型 10)
            font.setColor(fontStyle.get("color"));
            // 设置字体形体(宽体为:HSSFFont.BOLDWEIGHT_BOLD 700) -- 粗体
            font.setBoldweight(fontStyle.get("weight"));

            // 创建单元格样式
            cellStyle = workbook.createCellStyle();
            // 添加字体样式
            cellStyle.setFont(font);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return cellStyle; // 返回
    }

    /**
     * @功能描述 导出Excel
     * @创建人 xx
     * @创建时间 2011-5-27 下午02:57:37
     * @param workbook
     *            excel文档
     * @param filePath
     *            xls文件地址
     * @throws Exception
     *             异常往外抛出
     */
    private void export(HSSFWorkbook workbook, String filePath) throws Exception {

        try {
            // 根据指定xls文件创建文件字符流
            fileOutput = new FileOutputStream(filePath);
            // 将文档写入指定文件
            workbook.write(fileOutput);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                // 关闭流, 释放资源
                fileOutput.close();
            } catch (IOException e) {
                e.printStackTrace();
                ;
            }
        }
    }

    /**
     * @功能描述 获取流
     * @创建人 xx
     * @创建时间 2011-5-27 下午02:57:37
     * @param workbook
     *            excel文档
     * @throws Exception
     *             异常往外抛出
     */
    private InputStream export(HSSFWorkbook workbook) throws IOException {

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        try {
            try {
                workbook.write(baos);
            } catch (IOException e) {
                e.printStackTrace();
            }
            byte[] ba = baos.toByteArray();
            ByteArrayInputStream bais = new ByteArrayInputStream(ba);
            return bais;
        } finally {
            // 关闭流, 释放资源
            baos.close();
        }
    }
}
最近下载更多
15302544391  LV1 2023年11月26日
rookie_58  LV2 2022年6月2日
1234mama  LV19 2022年4月22日
ffftfff  LV1 2022年2月20日
blackcat123  LV7 2021年8月26日
tian12345  LV1 2021年6月29日
maolv100k  LV1 2021年6月10日
zhaokai0224  LV14 2021年5月10日
我是helloworld  LV23 2021年4月18日
huhua722 2021年4月12日
暂无贡献等级
最近浏览更多
hellozui  LV11 8月28日
15302544391  LV1 2023年11月26日
gvin001  LV14 2023年5月11日
暂无贡献等级
00044304  LV6 2022年10月17日
taoshen95  LV15 2022年9月24日
小翊杭宝  LV2 2022年6月6日
rookie_58  LV2 2022年5月27日
1234mama  LV19 2022年4月22日
ffftfff  LV1 2022年2月20日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友