最近项目中需要用到数据的导出与导入功能,我和我同事各负责一个, 我负责做导出这一块,比较简单。至于想看导入的同志们,我这里暂时是没有的,所以就不要浪费时间在这片文章上了。不过以后肯定会补上导入的功能。
鄙人看到一些博客上通过引用各种的util工具包,其实说白了还是利用apache的poi,在项目中直接导入poi包就可以。当然,你可以把代码都抽取出来成工具类,这里为了方便理解,就不抽取了,废话不多说。
1、首先准备一些poi的jar包,(这里就不多说了,需要的朋友可以在我的资源里寻找,等会我还会分享一下数据导出完整的源代码,里面也有jar包);
2、准备好jar包之后就可以写代码了,接下来我就把代码写简单,让大家都能看懂。至于你后面想用多么牛逼的代码实现它,都可以,只要原理懂了,其它的都不是事,对吧。
首先我要建一个实体类:Student.class
package testExport;
/**
*
* @author zsl
*
*/
public class Student {
private Integer id;
private String name;
private String sex;
public Student(Integer id, String name, String sex) {
this.id = id;
this.name = name;
this.sex = sex;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
这个不多说,接下来我还有一个类:ExportExcel.class
package testExport;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;
//下面是和数据导出有关的包
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;
public class ExportExcel {
public void Export(){
// 声明一个工作薄
HSSFWorkbook wb = new HSSFWorkbook();
//声明一个单子并命名
HSSFSheet sheet = wb.createSheet("学生表");
//给单子名称一个长度
sheet.setDefaultColumnWidth((short)15);
// 生成一个样式
HSSFCellStyle style = wb.createCellStyle();
//创建第一行(也可以称为表头)
HSSFRow row = sheet.createRow(0);
//样式字体居中
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
//给表头第一行一次创建单元格
HSSFCell cell = row.createCell((short) 0);
cell.setCellValue("学生编号");
cell.setCellStyle(style);
cell = row.createCell( (short) 1);
cell.setCellValue("学生姓名");
cell.setCellStyle(style);
cell = row.createCell((short) 2);
cell.setCellValue("学生性别");
cell.setCellStyle(style);
//添加一些数据,这里先写死,大家可以换成自己的集合数据
List<Student> list = new ArrayList<Student>();
list.add(new Student(111,"张三","男"));
list.add(new Student(111,"李四","男"));
list.add(new Student(111,"王五","女"));
//向单元格里填充数据
for (short i = 0; i < list.size(); i++) {
row = sheet.createRow(i + 1);
row.createCell(0).setCellValue(list.get(i)
.getId());
row.createCell(1).setCellValue(list.get(i)
.getName());
row.createCell(2).setCellValue(list.get(i)
.getSex());
}
try {
//默认导出到E盘下
FileOutputStream out = new FileOutputStream("E://学生表.xls");
wb.write(out);
out.close();
JOptionPane.showMessageDialog(null, "导出成功!");
} catch (FileNotFoundException e) {
JOptionPane.showMessageDialog(null, "导出失败!");
e.printStackTrace();
} catch (IOException e) {
JOptionPane.showMessageDialog(null, "导出失败!");
e.printStackTrace();
}
}
}
ok,上面这样就结束了。大家可以测试下,只要把上面字体标红部分的数据改成自己的数据集合即可。
下面看一下效果图:
下面附上源码一份:
附件源码:
Java利用POI实现数据Excel导出实例源码
当然有什么疑问,大家共同交流,共同进步。
注意
这样就完成了。只要自己抽取出一个公用类,非常方便,简单。当然你不抽取也是可以的。虽然抽取的时候比较麻烦,但是以后做多个表格的导出就方便了,磨刀还是不误砍柴工的。
package com.tspt.util;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.swing.JOptionPane;
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;
public class ExportExcelUtil<T> {
public void export(
String sheetName,
String[] headers, String[] columns,
List<T> lists,
HttpServletRequest request,
HttpServletResponse response) throws Exception
{
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet(sheetName);
sheet.setDefaultColumnWidth(15);
HSSFCellStyle style = wb.createCellStyle();
HSSFRow row = sheet.createRow(0);
style.setAlignment(HSSFCellStyle.ALIGN_LEFT);
for (int i = 0; i < headers.length; i++) {
HSSFCell headerCell = row.createCell(i);
headerCell.setCellValue(headers[i]);
headerCell.setCellStyle(style);
}
Iterator<T> it = lists.iterator();
int rowIndex = 0;
while (it.hasNext()) {
rowIndex++;
row = sheet.createRow(rowIndex);
T t = it.next();
Field[] fields = t.getClass()
.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
String fieldName = field.getName();
for (int j = 0; j < columns.length; j++) {
if (fieldName.equals(columns[j])) {
String getMethodName = "get" +
fieldName.substring(0, 1).
toUpperCase() + fieldName.
substring(1);
Class cls = t.getClass();
Method getMethod = cls.getMethod(
getMethodName, new Class[] {});
Object val = getMethod.invoke(
t, new Object[] {});
String textVal = null;
if (null != val) {
textVal = val.toString();
} else {
textVal = null;
}
row.createCell(j).
setCellValue(textVal);
}
}
}
}
//try {
//默认导出到E盘下
//FileOutputStream out = new FileOutputStream("E://学生表.xls");
//wb.write(out);
//out.close();
//JOptionPane.showMessageDialog(null, "导出成功!");
//} catch (Exception e) {
//JOptionPane.showMessageDialog(null, "导出失败!");
//e.printStackTrace();
//}
String filename = sheetName + ".xls";
String filepath = request.getRealPath("/") + filename;
FileOutputStream out = new FileOutputStream(filepath);
wb.write(out);
out.close();
downloadExcel(filepath, response);
}
/**
* 下载
*/
public static void downloadExcel(String filepath, HttpServletResponse response)
throws IOException {
File file = new File(filepath);
String fileName = file.getName();
response.setContentType("application/vnd.ms-excel;charset=utf-8");
response.addHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes("GBK"), "ISO8859-1"));
response.setCharacterEncoding("utf-8");
InputStream fis = new BufferedInputStream(new FileInputStream(file));
byte[] b = new byte[fis.available()];
fis.read(b);
response.getOutputStream().write(b);
fis.close();
}
}
首先一个随便创建任何一个实体类
package testExport;
/**
*
* @author zsl
*
*/
public class Student {
private Integer id;
private String name;
private String sex;
public Student(Integer id, String name, String sex) {
this.id = id;
this.name = name;
this.sex = sex;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
下面就是调用了。
//导出学生表
public String exportUser(HttpServletRequest request,HttpServletResponse response) throws Exception{
String sheetName = "student"; //导出的Excel名称
String [] headers = {"编号","姓名","性别"};
String [] columns = {"id","name","sex"};
//添加一些数据,大家可以从数据库里读取
/为了方便这里先写死,
List<Student> list = new ArrayList<Student>();
list.add(new Student(111,"张三","男"));
list.add(new Student(111,"李四","男"));
list.add(new Student(111,"王五","女"));
ExportExcelUtil<Student> util = new ExportExcelUtil<Student>();
util.export(sheetName,headers,columns,list,request,response);
}
注意:
1、这样就大功告成了,但是有些问题需要大家自己去解决,比如request 和response 在你们的项目里是怎么获取的;
因为这里把下载也包含了,所以程序里需要这两个参数,这里我就没有写;
如果大家想要简单测试一下,可以把request 和 response两个参数去掉,ExportExcelUtil类里面的注释放开,然后注释下面的代码注释掉就可以测试了;
3、需要导出哪些字段,只要在columns里对应该实体的字段即可;
4、该工具类适用于任何实体类的导出;
5、本人没有对字段类型进行判断,导出数据全部为字符串类型。(大家可以自己改进)
6、这种方式下载,不能用ajax调用导出,必须要使用window.location.href=”excel/export.do”
如果大家需求不同,可以自己在上面代码基础上再次进行封装优化。