Java poi Excel 通用导出
2016-03-22 16:39
441 查看
最近项目中需要用到数据的导出与导入功能,我和我同事各负责一个, 我负责做导出这一块,比较简单。至于想看导入的同志们,我这里暂时是没有的,所以就不要浪费时间在这片文章上了。不过以后肯定会补上导入的功能。
鄙人看到一些博客上通过引用各种的util工具包,其实说白了还是利用apache的poi,在项目中直接导入poi包就可以。当然,你可以把代码都抽取出来成工具类,这里为了方便理解,就不抽取了,废话不多说。
1、首先准备一些poi的jar包,(这里就不多说了,需要的朋友可以在我的资源里寻找,等会我还会分享一下数据导出完整的源代码,里面也有jar包);
2、准备好jar包之后就可以写代码了,接下来我就把代码写简单,让大家都能看懂。至于你后面想用多么牛逼的代码实现它,都可以,只要原理懂了,其它的都不是事,对吧。
首先我要建一个实体类:Student.class
这个不多说,接下来我还有一个类:ExportExcel.class
ok,上面这样就结束了。大家可以测试下,只要把上面字体标红部分的数据改成自己的数据集合即可。
下面看一下效果图:
下面附上源码一份:
附件源码:
Java利用POI实现数据Excel导出实例源码
当然有什么疑问,大家共同交流,共同进步。
注意
这样就完成了。只要自己抽取出一个公用类,非常方便,简单。当然你不抽取也是可以的。虽然抽取的时候比较麻烦,但是以后做多个表格的导出就方便了,磨刀还是不误砍柴工的。
首先一个随便创建任何一个实体类
下面就是调用了。
//导出学生表
注意:
1、这样就大功告成了,但是有些问题需要大家自己去解决,比如request 和response 在你们的项目里是怎么获取的;
因为这里把下载也包含了,所以程序里需要这两个参数,这里我就没有写;
如果大家想要简单测试一下,可以把request 和 response两个参数去掉,ExportExcelUtil类里面的注释放开,然后注释下面的代码注释掉就可以测试了;
3、需要导出哪些字段,只要在columns里对应该实体的字段即可;
4、该工具类适用于任何实体类的导出;
5、本人没有对字段类型进行判断,导出数据全部为字符串类型。(大家可以自己改进)
6、这种方式下载,不能用ajax调用导出,必须要使用window.location.href=”excel/export.do”
如果大家需求不同,可以自己在上面代码基础上再次进行封装优化。
鄙人看到一些博客上通过引用各种的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”
如果大家需求不同,可以自己在上面代码基础上再次进行封装优化。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- mysql load data 导出、导入 csv
- PropertyChangeListener简单理解
- 使用Python生成Excel格式的图片
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序