springMVC(4)---生成excel文件並導出
在開發過程中,需要將數據庫中的數據以excel表格的方式導出。
首先說明。我這里用的是Apache的POI項目,它是目前比較成熟的HSSF接口,用來處理Excel對象。其實POI不僅僅只能處理excel,它還可以處理word、PowerPoint、Visio、甚至Outlook。
一.首先介紹利用POI如何生成excel。
首先在生成Excel前,我們需要理解一下Excel文件的組織形式。在POI中,是這樣理解的:一個Excel文件對應一個workbook,一個workerbook是有若干個sheet組成的。一個sheet有多個row,一個row一般存在多個cell。
對於上面的四個名詞我們可以在下圖理解:

對於生成Excel,POI提供了如下幾個基本對象:
HSSFWorkbook excel 的文檔對象
HSSFSheet excel 的表單
HSSFRow excel 的行
HSSFCell excel 的格子單元
從上面的圖片和Excel的組織結構,我們就可以明白創建Excel的步驟。
1、生成文檔對象HSSHWorkbook。
2、通過HSSFWorkbook生成表單HSSFSheet。
3、通過HSSFSheet生成行HSSFRow
4、通過HSSFRow生成單元格HSSFCell。
下面展示代碼:
第一步、導入jar包
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>
第二步,創建Model對象
public class Person {
private String id;
private String name;
private String password;
private String age;
public Person(String id, String name, String password, String age) {
super();
this.id = id;
this.name = name;
this.password = password;
this.age = age;
}
//提供set和get方法
}
第三步.下載界面 exportexcel.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<!-- 正常數據導出肯定要傳入參數,我這里沒有用ajax傳參,簡單用鏈接傳參 -->
<script type="text/javascript">
function download(){
var url="download_excel?id=10&name=張三";
window.open(url);
}
</script>
<body>
<form action="">
<input type="button" value="報表導出" onclick="download()"/>
</form>
</body>
</html>
第四步、ExcleController.java
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import com.ssm.service.impl.ExcleImpl;
@Controller
public class ExcleController {
//這里直接new了
ExcleImpl excleImpl=new ExcleImpl();
@RequestMapping(value="/jsp/download_excel")
//獲取url鏈接上的參數
public @ResponseBody String dowm(HttpServletResponse response,@RequestParam("id") String id,@RequestParam("name") String name){
response.setContentType("application/binary;charset=UTF-8");
try{
ServletOutputStream out=response.getOutputStream();
try {
//設置文件頭:最后一個參數是設置下載文件名(這里我們叫:張三.pdf)
response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(name+".xls", "UTF-8"));
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
String[] titles = { "用戶id", "用戶姓名", "用戶密碼", "用戶年齡" };
excleImpl.export(titles, out);
return "success";
} catch(Exception e){
e.printStackTrace();
return "導出信息失敗";
}
}
}
第五步、ExcleImpl 報表導出實現層
import java.util.ArrayList;
import javax.servlet.ServletOutputStream;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import com.ssm.model.Person;
public class ExcleImpl {
public void export(String[] titles, ServletOutputStream out) throws Exception{
try{
// 第一步,創建一個workbook,對應一個Excel文件
HSSFWorkbook workbook = new HSSFWorkbook();
// 第二步,在webbook中添加一個sheet,對應Excel文件中的sheet
HSSFSheet hssfSheet = workbook.createSheet("sheet1");
// 第三步,在sheet中添加表頭第0行,注意老版本poi對Excel的行數列數有限制short
HSSFRow row = hssfSheet.createRow(0);
// 第四步,創建單元格,並設置值表頭 設置表頭居中
HSSFCellStyle hssfCellStyle = workbook.createCellStyle();
//居中樣式
hssfCellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
HSSFCell hssfCell = null;
for (int i = 0; i < titles.length; i++) {
hssfCell = row.createCell(i);//列索引從0開始
hssfCell.setCellValue(titles[i]);//列名1
hssfCell.setCellStyle(hssfCellStyle);//列居中顯示
}
// 第五步,寫入實體數據
Person person1=new Person("1","張三","123","26");
Person person2=new Person("2","李四","123","18");
Person person3=new Person("3","王五","123","77");
Person person4=new Person("4","徐小筱","123","1");
//這里我把list當做數據庫啦
ArrayList<Person> list=new ArrayList<Person>();
list.add(person1);
list.add(person2);
list.add(person3);
list.add(person4);
for (int i = 0; i < list.size(); i++) {
row = hssfSheet.createRow(i+1);
Person person = list.get(i);
// 第六步,創建單元格,並設置值
String id = null;
if(person.getId() != null){
id = person.getId();
}
row.createCell(0).setCellValue(id);
String name = "";
if(person.getName() != null){
name = person.getName();
}
row.createCell(1).setCellValue(name);
String password = "";
if(person.getPassword() != null){
password = person.getPassword();
}
row.createCell(2).setCellValue(password);
String age=null;
if(person.getAge() !=null){
age = person.getAge();
}
row.createCell(3).setCellValue(age);
}
// 第七步,將文件輸出到客戶端瀏覽器
try {
workbook.write(out);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}catch(Exception e){
e.printStackTrace();
throw new Exception("導出信息失敗!");
}
}
}
第六步:最終效果,當我點擊報表導出按鈕

完美!
