原文地址: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>