隐藏

JAVA使用HSSFWorkbook导出、操作excel

发布:2023/3/24 21:57:34作者:管理员 来源:本站 浏览次数:990

在实际开发中我们经常需要导入数据,统计数据,并且将统计好的数据导出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截图: