最近在项目开发过程中,实现了一个excel表格导入数据到数据库,最近又在开发一个功能就是把数据库的数据导出来到excel表格中,觉得这个功能不错,便写出来和大家分享一下,
第一步:导入所需要的poi的jar包,这些jar包有网上整理好的,直接去网上下载就好,先创建一个功能类,用来设置excel表格的形式,和导出数据的功能实现代码,在这里附上我测试成功的代码
package com.oracle.match.util;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFHeader;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.struts2.ServletActionContext;
import com.oracle.match.po.Sign;
import com.oracle.match.service.SignService;
public class ExportUtil {
/*因为我这里这个函数要在action类里调用,下面要导出的数据要在数据库里先查询出来,所以里面的函数要传过来一个service对象,也就是业务逻辑类的对象,以用来实现相应的业务逻辑*/
public String export(SignService signService)throws Exception
{
List<Sign> SignList=new ArrayList<Sign>();
System.out.println(signService);
SignList=signService.querysignById(1);
/*设置表头:对Excel每列取名
*(必须根据你取的数据编写)
*/
String []tableHeader={"学号","姓名","赛事名","性别","班级","比赛时间"};
/*
*下面的都可以拷贝不用编写
*/
short cellNumber=(short)tableHeader.length;//表的列数
HSSFWorkbook workbook = new HSSFWorkbook(); //创建一个excel
HSSFCell cell = null; //Excel的列
HSSFRow row = null; //Excel的行
HSSFCellStyle style = workbook.createCellStyle(); //设置表头的类型
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
HSSFCellStyle style1 = workbook.createCellStyle(); //设置数据类型
style1.setAlignment(HSSFCellStyle.ALIGN_CENTER);
HSSFFont font = workbook.createFont(); //设置字体
HSSFSheet sheet = workbook.createSheet("sheet1"); //创建一个sheet
HSSFHeader header = sheet.getHeader();//设置sheet的头
try { /**
*根据是否取出数据,设置header信息
*
*/
if(SignList.size() < 1 ){
header.setCenter("查无资料");
}else{
header.setCenter("学生表");
row = sheet.createRow(0);
row.setHeight((short)400);
for(int k = 0;k < cellNumber;k++){
cell = row.createCell(k);//创建第0行第k列
cell.setCellValue(tableHeader[k]);//设置第0行第k列的值
sheet.setColumnWidth(k,8000);//设置列的宽度
font.setColor(HSSFFont.COLOR_NORMAL); // 设置单元格字体的颜色.
font.setFontHeight((short)350); //设置单元字体高度
style1.setFont(font);//设置字体风格
cell.setCellStyle(style1);
}
/*
* // 给excel填充数据这里需要编写
*
*/
for(int i = 0 ;i < SignList.size() ;i++){
Sign sign = (Sign)SignList.get(i);//获取sign对象
row = sheet.createRow((short) (i + 1));//创建第i+1行
row.setHeight((short)400);//设置行高
if(sign.getStunum() != null){
cell = row.createCell(0);//创建第i+1行第0列
cell.setCellValue(sign.getStunum());//设置第i+1行第0列的值
cell.setCellStyle(style);//设置风格
}
if(sign.getUname() != null){
cell = row.createCell(1); //创建第i+1行第1列
cell.setCellValue(sign.getUname());//设置第i+1行第1列的值
cell.setCellStyle(style); //设置风格
}
//由于下面的和上面的基本相同,就不加注释了
if(sign.getMatchname() != null){
cell = row.createCell(2);
cell.setCellValue(sign.getMatchname());
cell.setCellStyle(style);
}
if(sign.getUsex()!= null){
cell = row.createCell(3);
cell.setCellValue(sign.getUsex());
cell.setCellStyle(style);
}
if(sign.getSclass() != null){
cell = row.createCell(4);
cell.setCellValue(sign.getSclass());
cell.setCellStyle(style);
}
if(sign.getMdate()!= null){
cell = row.createCell(5);
cell.setCellValue(sign.getMdate());
cell.setCellStyle(style);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
/*
*下面的可以不用编写,直接拷贝
*
*/
HttpServletResponse response = null;//创建一个HttpServletResponse对象
OutputStream out = null;//创建一个输出流对象
try {
response = ServletActionContext.getResponse();//初始化HttpServletResponse对象
out = response.getOutputStream();//
response.setHeader("Content-disposition","attachment; filename="+"student"+SignList.get(0).getUsex()+SignList.get(0).getMatchname()+".xls");//filename是下载的xls的名,建议最好用英文
response.setContentType("application/msexcel;charset=UTF-8");//设置类型
response.setHeader("Pragma","No-cache");//设置头
response.setHeader("Cache-Control","no-cache");//设置头
response.setDateHeader("Expires", 0);//设置日期头
workbook.write(out);
out.flush();
workbook.write(out);
} catch (IOException e) {
e.printStackTrace();
}finally{
try{
if(out!=null){
out.close();
}
}catch(IOException e){
e.printStackTrace();
}
}
return null;
}
}
上面的功能类是根据我需要导出的数据库的表里的字段设计的,大家在用的时候可以根据自己的需要,在更改
第二步:编写完功能类之后,要在action里调用,同时传过去一个service对象,代码如下:
public String export()
{
ExportUtil Export=new ExportUtil();
try {
Export.export(signService);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("导出数据有误");
}
return "export";
}
最后在需要把action在struts.xml文件里配置,最后只需要在前台调用就可以了,希望上面说的那些对你们会有帮助。。。。。