zoukankan      html  css  js  c++  java
  • 使用HSSFWorkbook导出、操作excel

    原文地址:https://www.jianshu.com/p/dd1e4f28757b

    在实际开发中我们经常需要导入数据,统计数据,并且将统计好的数据导出excel,今天分享一个导出学生信息的方法。
    目前,比较常用的实现Java导入、导出Excel的技术有两种Jakarta POI和Java Excel。
    Jakarta POI 是一套用于访问微软格式文档的Java API。Jakarta POI有很多组件组成,其中有用于操作Excel格式文件的HSSF和用于操作Word的HWPF,目前用于操作Excel的HSSF比较成熟。官方主页API文档
    使用步骤:

    一:下载jar包,并放在工程的WEB-INF——>lib目录下

    下载地址:http://poi.apache.org/download.html
    目前最新版本是4.0,我使用的是3.9

    二:理解HSSFWorkbook的几种对象:

    HSSFWorkbook:excel的工作簿
    HSSFSheet:excel的工作表
    HSSFRow:excel的行
    HSSFCell:excel的单元格
    HSSFFont:excel字体
    HSSFDataFormat:日期格式
    HSSFHeader:sheet头
    样式:
    HSSFCellStyle:单元格样式
    一个Excel的文件对应一个工作簿(HSSFWorkbook),一个工作簿可以有多个工作表(我们通常看到的Sheet0、Sheet1)(HSSFSheet)组成,一个工作表是由多行(HSSFRow)组成,一行又是由多个单元格(HSSFCell)组成。

    三:定义导出数据的请求接口,一般的业务逻辑在这里处理

    /**
         * 导出学生信息
         * @param request
         * @param response
         * @throws IOException
         */
        @RequestMapping("/studentInfoExcelOut")
        public void studentInfoExcelOut(HttpServletRequest request, HttpServletResponse response)
                throws IOException {
            /**获取导出数据,实际开发中这里一般是从数据库查询的数据,
            这里演示是定义了一个实体对象,然后初始化多个对象,并放进我们需要导出的集合里*/
            List<Student> list = new ArrayList<>();
            int sex = 1;
            for(int i = 0 ;i < 10 ;i++){
                if(i%2 == 0){
                    sex = 2;
                }
                Student stu = new Student(i+1,"学生"+(i+1)+"",sex,18+i,20190001+i,"1998年-"+(i+1)+"",new Date());
                list.add(stu);
            }
            exportExcelBook(request,response,list);
            return;
        }

    由于我们是导出学生的基础信息,所以需要定义一个学生实体类对象Student.java:

    public class Student {
        /**学生id*/
        private int id;
        /**学生姓名*/
        private String name;
        /**学生性别 1:男 2:女*/
        private int sex;
        /**学生年龄*/
        private int age;
        /**学生学号*/
        private int student_no;
        /**学生出生年月*/
        private String birthday;
        /**学生创建时间*/
        private Date create_time;
    
        public Student(int id,String name,int sex,int age,int student_no,String birthday,Date create_time) {
            this.id = id;
            this.name = name;
            this.sex = sex;
            this.age = age;
            this.student_no = student_no;
            this.birthday = birthday;
            this.create_time = create_time;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getSex() {
            return sex;
        }
    
        public void setSex(int sex) {
            this.sex = sex;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public int getStudent_no() {
            return student_no;
        }
    
        public void setStudent_no(int student_no) {
            this.student_no = student_no;
        }
    
        public String getBirthday() {
            return birthday;
        }
    
        public void setBirthday(String birthday) {
            this.birthday = birthday;
        }
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public Date getCreate_time() {
            return create_time;
        }
    
        public void setCreate_time(Date create_time) {
            this.create_time = create_time;
        }
    }

    四:调用HSSFWorkbook提供的方法将所需要导出的数据导出并生成文件

    /**
         * 导出数据生成EXCEL方法
         * @param request
         * @param response
         * @param list
         * @throws IOException
         */
        public void exportExcelBook(HttpServletRequest request, HttpServletResponse response,List<Student> list)
                throws IOException {
            if (CollectionUtils.isEmpty(list)) {
                return;
            }
            //文件名称,客户端传来的参数,防止中文文件名乱码参数编码因此这里需要解码
            String fileName = URLDecoder.decode(request.getParameter("fileName"),"UTF-8");
            //创建Excel工作薄对象
            HSSFWorkbook workbook = new HSSFWorkbook();
            //创建Excel工作表对象
            HSSFSheet sheet = workbook.createSheet();
            sheet.setColumnWidth(0, 3000);
            sheet.setColumnWidth(1, 5000);
            sheet.setColumnWidth(2, 4000);
            sheet.setColumnWidth(3, 2500);
            sheet.setColumnWidth(4, 3000);
            sheet.setColumnWidth(5, 6000);
            sheet.setColumnWidth(6, 6000);
    
            // 设置表头字体样式
            HSSFFont columnHeadFont = workbook.createFont();
            columnHeadFont.setFontName("宋体");
            columnHeadFont.setFontHeightInPoints((short) 10);
            columnHeadFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
    
            // 列头的样式
            HSSFCellStyle columnHeadStyle = workbook.createCellStyle();
            columnHeadStyle.setFont(columnHeadFont);
            // 左右居中
            columnHeadStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
            // 上下居中
            columnHeadStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
            columnHeadStyle.setLocked(true);
            columnHeadStyle.setWrapText(true);
            // 左边框的颜色
            columnHeadStyle.setLeftBorderColor(HSSFColor.BLACK.index);
            // 边框的大小
            columnHeadStyle.setBorderLeft((short) 1);
            // 右边框的颜色
            columnHeadStyle.setRightBorderColor(HSSFColor.BLACK.index);
            // 边框的大小
            columnHeadStyle.setBorderRight((short) 1);
            // 设置单元格的边框为粗体
            columnHeadStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
            // 设置单元格的边框颜色
            columnHeadStyle.setBottomBorderColor(HSSFColor.BLACK.index);
            // 设置单元格的背景颜色(单元格的样式会覆盖列或行的样式)
            columnHeadStyle.setFillForegroundColor(HSSFColor.WHITE.index);
            // 设置普通单元格字体样式
            HSSFFont font = workbook.createFont();
            font.setFontName("宋体");
            font.setFontHeightInPoints((short) 10);
    
            //创建Excel工作表第一行
            HSSFRow row0 = sheet.createRow(0);
            // 设置行高
            row0.setHeight((short) 750);
            HSSFCell cell = row0.createCell(0);
            //设置单元格内容
            cell.setCellValue(new HSSFRichTextString("学生id"));
            //设置单元格字体样式
            cell.setCellStyle(columnHeadStyle);
            cell = row0.createCell(1);
            cell.setCellValue(new HSSFRichTextString("姓名"));
            cell.setCellStyle(columnHeadStyle);
            cell = row0.createCell(2);
            cell.setCellValue(new HSSFRichTextString("性别"));
            cell.setCellStyle(columnHeadStyle);
            cell = row0.createCell(3);
            cell.setCellValue(new HSSFRichTextString("年龄"));
            cell.setCellStyle(columnHeadStyle);
            cell = row0.createCell(4);
            cell.setCellValue(new HSSFRichTextString("学号"));
            cell.setCellStyle(columnHeadStyle);
            cell = row0.createCell(5);
            cell.setCellValue(new HSSFRichTextString("出生年月"));
            cell.setCellStyle(columnHeadStyle);
            cell = row0.createCell(6);
            cell.setCellValue(new HSSFRichTextString("创建时间"));
            cell.setCellStyle(columnHeadStyle);
    
            // 循环写入数据
            for (int i = 0; i < list.size(); i++) {
                Student stu = list.get(i);
                HSSFRow row = sheet.createRow(i + 1);
                cell = row.createCell(0);
                cell.setCellValue(new HSSFRichTextString(String.valueOf(stu.getId())));
                cell.setCellStyle(columnHeadStyle);
                cell = row.createCell(1);
                cell.setCellValue(new HSSFRichTextString(stu.getName()));
                cell.setCellStyle(columnHeadStyle);
                cell = row.createCell(2);
                if(stu.getSex() == 1){
                    cell.setCellValue(new HSSFRichTextString(""));
                }else{
                    cell.setCellValue(new HSSFRichTextString(""));
                }
                cell.setCellStyle(columnHeadStyle);
                cell = row.createCell(3);
                cell.setCellValue(new HSSFRichTextString(String.valueOf(stu.getAge())));
                cell.setCellStyle(columnHeadStyle);
                cell = row.createCell(4);
                cell.setCellValue(new HSSFRichTextString(String.valueOf(stu.getStudent_no())));
                cell.setCellStyle(columnHeadStyle);
                cell = row.createCell(5);
                cell.setCellValue(new HSSFRichTextString(stu.getBirthday()));
                cell.setCellStyle(columnHeadStyle);
                cell = row.createCell(6);
                cell.setCellValue(new HSSFRichTextString());
                cell.setCellStyle(columnHeadStyle);
                cell.setCellValue(new HSSFRichTextString(DateUtils.DateToString(stu.getCreate_time(), "yyyy-MM-dd HH:mm:ss")));
            }
            // 获取输出流
            OutputStream os = response.getOutputStream();
            // 重置输出流
            response.reset();
            // 设定输出文件头
            response.setHeader("Content-disposition",
                    "attachment; filename=" + new String(fileName.getBytes("GB2312"), "8859_1") + ".xls");
            // 定义输出类型
            response.setContentType("application/msexcel");
            workbook.write(os);
            os.close();
            return;
        }

    五:网页调用导出excel接口

    <a href="javascript:void(0)" onclick="outExcel()">导出学生信息</a>
          <script>
            function outExcel(){
                var fileName ="学生信息表";
                //编码防止中文字符乱码
                window.location.href=encodeURI("studentInfoExcelOut?fileName="+encodeURIComponent(fileName));
            }
          </script>

    六:导出excel截图:




     
     
     
  • 相关阅读:
    Django进阶(三)
    Django进阶(二)
    全局变量初始化顺序探究
    调试实战 —— dll 加载失败之全局变量初始化篇
    10 个实验搞懂命令提示符
    帮 vs2019 找回丢失的 SDK
    从堆里找回“丢失”的代码
    排错实战 —— 解决 c++ 工程编译错: error C2059 'string' illegal token on right side of xxx
    善用 vs 中的错误列表和输出窗口,高效查找 C++ 多工程编译错误
    使用 VMware + win10 + vs2019 从零搭建双机内核调试环境
  • 原文地址:https://www.cnblogs.com/dyh004/p/12372740.html
Copyright © 2011-2022 走看看