在實際開發(fā)中我們經(jīng)常需要導(dǎo)入數(shù)據(jù),統(tǒng)計數(shù)據(jù)输瓜,并且將統(tǒng)計好的數(shù)據(jù)導(dǎo)出excel栗菜,今天分享一個導(dǎo)出學(xué)生信息的方法骡男。
目前赃蛛,比較常用的實現(xiàn)Java導(dǎo)入、導(dǎo)出Excel的技術(shù)有兩種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的文件對應(yīng)一個工作簿(HSSFWorkbook),一個工作簿可以有多個工作表(我們通惩洌看到的Sheet0罩阵、Sheet1)(HSSFSheet)組成竿秆,一個工作表是由多行(HSSFRow)組成,一行又是由多個單元格(HSSFCell)組成稿壁。
三:定義導(dǎo)出數(shù)據(jù)的請求接口幽钢,一般的業(yè)務(wù)邏輯在這里處理
/**
* 導(dǎo)出學(xué)生信息
* @param request
* @param response
* @throws IOException
*/
@RequestMapping("/studentInfoExcelOut")
public void studentInfoExcelOut(HttpServletRequest request, HttpServletResponse response)
throws IOException {
/**獲取導(dǎo)出數(shù)據(jù),實際開發(fā)中這里一般是從數(shù)據(jù)庫查詢的數(shù)據(jù)傅是,
這里演示是定義了一個實體對象匪燕,然后初始化多個對象,并放進(jìn)我們需要導(dǎo)出的集合里*/
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,"學(xué)生"+(i+1)+"號",sex,18+i,20190001+i,"1998年-"+(i+1)+"月",new Date());
list.add(stu);
}
exportExcelBook(request,response,list);
return;
}
由于我們是導(dǎo)出學(xué)生的基礎(chǔ)信息喧笔,所以需要定義一個學(xué)生實體類對象Student.java:
public class Student {
/**學(xué)生id*/
private int id;
/**學(xué)生姓名*/
private String name;
/**學(xué)生性別 1:男 2:女*/
private int sex;
/**學(xué)生年齡*/
private int age;
/**學(xué)生學(xué)號*/
private int student_no;
/**學(xué)生出生年月*/
private String birthday;
/**學(xué)生創(chuàng)建時間*/
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;
}
}
四:調(diào)用HSSFWorkbook提供的方法將所需要導(dǎo)出的數(shù)據(jù)導(dǎo)出并生成文件
/**
* 導(dǎo)出數(shù)據(jù)生成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;
}
//文件名稱帽驯,客戶端傳來的參數(shù),防止中文文件名亂碼參數(shù)編碼因此這里需要解碼
String fileName = URLDecoder.decode(request.getParameter("fileName"),"UTF-8");
//創(chuàng)建Excel工作薄對象
HSSFWorkbook workbook = new HSSFWorkbook();
//創(chuàng)建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);
// 設(shè)置表頭字體樣式
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);
// 設(shè)置單元格的邊框為粗體
columnHeadStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
// 設(shè)置單元格的邊框顏色
columnHeadStyle.setBottomBorderColor(HSSFColor.BLACK.index);
// 設(shè)置單元格的背景顏色(單元格的樣式會覆蓋列或行的樣式)
columnHeadStyle.setFillForegroundColor(HSSFColor.WHITE.index);
// 設(shè)置普通單元格字體樣式
HSSFFont font = workbook.createFont();
font.setFontName("宋體");
font.setFontHeightInPoints((short) 10);
//創(chuàng)建Excel工作表第一行
HSSFRow row0 = sheet.createRow(0);
// 設(shè)置行高
row0.setHeight((short) 750);
HSSFCell cell = row0.createCell(0);
//設(shè)置單元格內(nèi)容
cell.setCellValue(new HSSFRichTextString("學(xué)生id"));
//設(shè)置單元格字體樣式
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("學(xué)號"));
cell.setCellStyle(columnHeadStyle);
cell = row0.createCell(5);
cell.setCellValue(new HSSFRichTextString("出生年月"));
cell.setCellStyle(columnHeadStyle);
cell = row0.createCell(6);
cell.setCellValue(new HSSFRichTextString("創(chuàng)建時間"));
cell.setCellStyle(columnHeadStyle);
// 循環(huán)寫入數(shù)據(jù)
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();
// 設(shè)定輸出文件頭
response.setHeader("Content-disposition",
"attachment; filename=" + new String(fileName.getBytes("GB2312"), "8859_1") + ".xls");
// 定義輸出類型
response.setContentType("application/msexcel");
workbook.write(os);
os.close();
return;
}
五:網(wǎng)頁調(diào)用導(dǎo)出excel接口
<a href="javascript:void(0)" onclick="outExcel()">導(dǎo)出學(xué)生信息</a>
<script>
function outExcel(){
var fileName ="學(xué)生信息表";
//編碼防止中文字符亂碼
window.location.href=encodeURI("studentInfoExcelOut?fileName="+encodeURIComponent(fileName));
}
</script>
六:導(dǎo)出excel截圖:
原文作者技術(shù)博客:http://www.reibang.com/u/ac4daaeecdfe
95后前端妹子一枚书闸,愛閱讀尼变,愛交友,將工作中遇到的問題記錄在這里梗劫,希望給每一個看到的你能帶來一點幫助享甸。
歡迎留言交流截碴。