• POI 生成Excel表格的使用


    一.简介

    Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。

      结构:
      • HSSF - 提供读写Microsoft Excel格式档案的功能。
      • XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。
      • HWPF - 提供读写Microsoft Word格式档案的功能。
      • HSLF - 提供读写Microsoft PowerPoint格式档案的功能。
      • HDGF - 提供读写Microsoft Visio格式档案的功能。

     

    二.POI生成Excel表格

      在POI中,使用面向对象的思想将表格中的工作簿、表、行、单元格、样式等都封装为类,读写这些内容就是对这些类的操作

    public class ExportExcelUtils {
        public static ByteArrayOutputStream exportCustomerExcel(List<Customer> customers, String sheetName) {
            // 一组装excel文档
            // 1,创建工作簿
            HSSFWorkbook workbook = new HSSFWorkbook();
            // 2,创建样式
            HSSFCellStyle baseStyle = ExportHSSFCellStyle.createBaseStyle(workbook);
            HSSFCellStyle subTitleStyle = ExportHSSFCellStyle.createSubTitleStyle(workbook);
            HSSFCellStyle tableTitleStyle = ExportHSSFCellStyle.createTableTitleStyle(workbook);
            HSSFCellStyle titleStyle = ExportHSSFCellStyle.createTitleStyle(workbook);
            // 3在工作簿创建sheet
            HSSFSheet sheet = workbook.createSheet(sheetName);
            // 4,设置sheet
            sheet.setDefaultColumnWidth(25);
            // 5,合并
            CellRangeAddress region1 = new CellRangeAddress(0, 0, 0, 6);
            CellRangeAddress region2 = new CellRangeAddress(1, 1, 0, 6);
            sheet.addMergedRegion(region1);
            sheet.addMergedRegion(region2);
            // 6,创建第一行
            int index = 0;
            HSSFRow row1 = sheet.createRow(index);
            // 6.1在第一行里面创建一个单元格
            HSSFCell row1_cell1 = row1.createCell(0);
            // 6.2设置标题样式
            row1_cell1.setCellStyle(titleStyle);
            // 6.3设置单元格内容
            row1_cell1.setCellValue("客户数据列表");
    
            // 7,第二行
            index++;
            HSSFRow row2 = sheet.createRow(index);
            // 7.1在第一行里面创建一个单元格
            HSSFCell row2_cell1 = row2.createCell(0);
            // 7.2设置标题样式
            row2_cell1.setCellStyle(subTitleStyle);
            // 7.3设置单元格内容
            row2_cell1.setCellValue("总条数:" + customers.size() + "   导出时间:" + new Date().toLocaleString());
    
            // 8第三行
            String[] titles = { "身份证号", "客户姓名", "客户电话", "客户地址", "客户职位", "性别", "录入时间" };
            index++;
            HSSFRow row3 = sheet.createRow(index);
            for (int i = 0; i < titles.length; i++) {
                HSSFCell row3_cell = row3.createCell(i);
                row3_cell.setCellStyle(tableTitleStyle);
                row3_cell.setCellValue(titles[i]);
            }
            // 9第四行
            for (int i = 0; i < customers.size(); i++) {
                index++;
                Customer customer = customers.get(i);
                HSSFRow row = sheet.createRow(index);
                // 9.1创建列身份证号
                HSSFCell row_identity = row.createCell(0);
                row_identity.setCellStyle(baseStyle);
                row_identity.setCellValue(customer.getIdentity());
                // 9.2创建列客户姓名
                HSSFCell row_custname = row.createCell(1);
                row_custname.setCellStyle(baseStyle);
                row_custname.setCellValue(customer.getCustname());
                // 9.3创建列客户电话
                HSSFCell row_phone = row.createCell(2);
                row_phone.setCellStyle(baseStyle);
                row_phone.setCellValue(customer.getPhone());
                // 9.4创建列客户地址
                HSSFCell row_address = row.createCell(3);
                row_address.setCellStyle(baseStyle);
                row_address.setCellValue(customer.getAddress());
                // 9.5创建列客户职位
                HSSFCell row_career = row.createCell(4);
                row_career.setCellStyle(baseStyle);
                row_career.setCellValue(customer.getCareer());
                // 9.6创建列性别
                HSSFCell row_sex = row.createCell(5);
                row_sex.setCellStyle(baseStyle);
                row_sex.setCellValue(customer.getGender() == 1 ? "男" : "女");
                // 9.7创建列录入时间
                HSSFCell row_createtime = row.createCell(6);
                row_createtime.setCellStyle(baseStyle);
                row_createtime.setCellValue(customer.getCreatetime().toLocaleString());
            }
            // 到此excel组装完成
    
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            // 把workbook里面的数据写到outputStream
            try {
                workbook.write(outputStream);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return outputStream;
    
        }
    }
    package com.sd.stat.util;
    
    import org.apache.poi.hssf.usermodel.HSSFCellStyle;
    import org.apache.poi.hssf.usermodel.HSSFFont;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.hssf.util.HSSFColor;
    import org.apache.poi.ss.usermodel.HorizontalAlignment;
    import org.apache.poi.ss.usermodel.VerticalAlignment;
    
    public class ExportHSSFCellStyle {
        /**
         * 创建基础样式  
         * 水平和垂直居中
         */
        public static HSSFCellStyle  createBaseStyle(HSSFWorkbook workbook) {
            HSSFCellStyle style = workbook.createCellStyle();
            //设置水平居中
            style.setAlignment(HorizontalAlignment.CENTER);
            //设置垂直居中
            style.setVerticalAlignment(VerticalAlignment.CENTER);
            return style;
        }
        
        /**
         * 创建数据表格的头的样式 
         */
        public static HSSFCellStyle createTableTitleStyle(HSSFWorkbook workbook) {
            HSSFCellStyle style = createBaseStyle(workbook);
            
            //设置字体
            HSSFFont font=workbook.createFont();
            font.setBold(true);//是否加粗
            font.setItalic(false);//是否斜体
            font.setFontHeightInPoints((short)10); //设置字体大小
            font.setColor(HSSFColor.HSSFColorPredefined.BLACK.getIndex());//设置颜色
            font.setFontName("黑体");//设置字体
            style.setFont(font);
            
            return style;
        }
        
        
        /**
         * 创建小标题样式
         */
        public static HSSFCellStyle createSubTitleStyle(HSSFWorkbook workbook) {
            HSSFCellStyle style = createBaseStyle(workbook);
            //设置右对齐
            style.setAlignment(HorizontalAlignment.RIGHT);
            //设置字体
            HSSFFont font=workbook.createFont();
            font.setBold(true);//是否加粗
            font.setFontHeightInPoints((short)12); //设置字体大小
            font.setColor(HSSFColor.HSSFColorPredefined.BLUE_GREY.getIndex());//设置颜色
            font.setFontName("黑体");//设置字体
            style.setFont(font);
            return style;
        }
        
        
        
        /**
         * 创建标题样式
         */
        public static HSSFCellStyle createTitleStyle(HSSFWorkbook workbook) {
            HSSFCellStyle style = createBaseStyle(workbook);
            //设置字体
            HSSFFont font=workbook.createFont();
            font.setBold(true);//是否加粗
            font.setFontHeightInPoints((short)26); //设置字体大小
            font.setColor(HSSFColor.HSSFColorPredefined.DARK_RED.getIndex());//设置颜色
            font.setFontName("宋体");//设置字体
            style.setFont(font);
            return style;
        }
        
    }

    Web应用中将数据生成Excel表并返回客户端:

      请求➡后台查询数据➡POI工具类生成workbook以流的形式返回➡Controller返回ResponseEntity,设置响应形式,workbook的字节流转换为字节数据

      图片,数据表格等多媒体数据返回➡以字节流的形式传输,最后转换为Byte数组传输给ResponseEntity

        @RequestMapping("exportCustomerExcel.do")
        public ResponseEntity<Object> exportCustomerExcel(CustomerVo customerVo,HttpServletResponse response){
            //调用Service层查询数据List+数据表名称
            List<Customer> customers = customerService.queryNomalCustomer(customerVo);
            String fileName="客户数据.xls";
            String sheetName = "客户数据";
            //调用POI工具类导出Excel表数据-->表格数据转化为流运输过来
            ByteArrayOutputStream customerExcel = ExportExcelUtils.exportCustomerExcel(customers, sheetName);
            //设置响应信息包装为ResponseEntity返回
            try {
                fileName = URLEncoder.encode(fileName, "UTF-8");//处理响应文件名乱码问题
                //设置响应头
                HttpHeaders headers = new HttpHeaders();
                //封装响应内容类型(APPLICATION_OCTET_STREAM 响应的内容不限定)
                headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
                //设置下载文件的名称
                headers.setContentDispositionFormData("attachment", fileName);
                //再将字节流转化为具体的字节数据
                return new ResponseEntity<Object>(customerExcel.toByteArray(), headers,HttpStatus.CREATED);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            return null;
        }

      

     

  • 相关阅读:
    负margin在页面布局中的应用
    2018-05-04 圣杯布局 and 双飞翼布局,display:flex
    vue 动态加载图片路径报错解决方法
    vue 带参数的跳转-完成一个功能之后 之后需要深思,否则还会忘记
    vue项目打包后打开空白解决办法
    css 居中方法
    vue 不用npm下载安装包 该如何引用js
    安装WAMP 及 修改MYSQL用户名 、 密码
    Python 软件开发目录规范
    Python 1-3区分Python文件的两种用途和模块的搜索路径
  • 原文地址:https://www.cnblogs.com/ying-dong/p/12559598.html
Copyright © 2020-2023  润新知