zoukankan      html  css  js  c++  java
  • Java之Poi导出Excel文档

    一、Poi简介

    在后台管理系统中,我们经常要做的导出操作,通常导出为Excel文档的形式,而Poi则提供了这种需要的支持。

    二、Workbook/HSSFWorkbook/XSSFWorkbook

    1) Workbook是Poi模型中的工作簿的概念,等同于Excel文档,我们的一切操作都基于这个工作簿。不过Workbook只是定义了一个接口,它有两个实现类: HSSFWorkbook/XSSFWorkbook。

    2)HSSFWorkbook是Workbook的实现类,它生成的是.xls格式的文档(Excel '97(-2007))

    3)XSSFWorkbook是Workbook的新的实现类,它生成的是.xlsx格式的文档(Excel 2007以后)

    我们以下示例将使用HSSFWorkbook实现类,XSSFWorkbook类似

    三、效果图

    我们先看以下最后的效果图

    以上是Mac的numbers打开的样子,与window有所不同。

    我们看到:

    1)第一行,单元格数据(设置值);

    2)单元格文本居中(设置样式);

    3)第二行,单元格合并(合并操作);

    四、代码示例

    下面是实现代码,详细请看注解内容:

    public static List<String> dataList;
    
        static {
            // 数据准备
            dataList = new ArrayList<>();
            dataList.add("星期一");
            dataList.add("星期二");
            dataList.add("星期三");
            dataList.add("星期四");
            dataList.add("星期五");
            dataList.add("星期六");
            dataList.add("星期七");
        }
    
        /**
         * 下载Excel文档
         * @param outputStream
         */
        public void downloadExcel(OutputStream outputStream) {
            // 创建工作簿
            Workbook wb = new HSSFWorkbook();
            // 创建样式
            CellStyle style = wb.createCellStyle();
            // 文本居中
            style.setAlignment(HorizontalAlignment.CENTER);
            // 创建工作表
            Sheet sheet = wb.createSheet("sheet1");
            // 合并单元格(开始行, 结束行, 开始列, 结束列)
            sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, dataList.size() - 1));
            // 创建首行
            Row row = sheet.createRow(0);
            // 创建首行各个列
            for (int cellNum = 0; cellNum < dataList.size(); cellNum++) {
                String cellValue = dataList.get(cellNum);
                // 创建单元格
                Cell cell = row.createCell(cellNum);
                // 设置单元格的值
                cell.setCellValue(cellValue);
                cell.setCellStyle(style);
            }
            try {
                // 输出为文件
                wb.write(outputStream);
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    wb.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    以上代码,传入一个OutputStream输出流,通过Workbook创建相关内容后,最后将workbook的内容写入输出流。

    五、下载

    如果你想通过web请求下载,那么可以将workbook写入response的输出流,例如:

    @RequestMapping(value = "download")
        public void downloadExcel(HttpServletResponse response){
            try {
                String fileName = String.valueOf(new Date().getTime());
                fileName += ".xls";
                // 浏览器直接下载
                response.setHeader("Content-Disposition", "attachment;filename="+new String(fileName.getBytes("utf-8"),"iso8859-1"));
                response.setContentType("application/ynd.ms-excel;charset=UTF-8");
                poiService.downloadExcel(response.getOutputStream());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    注意,这里设置了头:Content-Disposition:attachment...这里头信息,将使得浏览器直接将该内容做为文件直接下载。

    前端JS代码可以简单这么写即可:

     window.open("/download")

    具体内容可以参考官网文档:https://poi.apache.org/spreadsheet/quick-guide.html

  • 相关阅读:
    Nowcoder9981A.串(排列组合)
    267D.Fedor and Essay(强连通分量缩点+DAG上DP)
    1290C. Prefix Enlightenment(带权并查集)
    LeetCode1. 两数之和
    LeetCode451. 根据字符出现频率排序
    LeetCode205. 同构字符串
    LeetCode290. 单词规律
    LeetCode202. 快乐数
    LeetCode242. 有效的字母异位词
    LeetCode136. 只出现一次的数字
  • 原文地址:https://www.cnblogs.com/lay2017/p/8941644.html
Copyright © 2011-2022 走看看