利用Apache的poi把数据导出到excel是一件很简单的一件事,这里结合struts2进行做一个小例子,看看poi如何把数据导出到excel。
1.下载poi和struts2,这里用的是poi3.7和struts-2.2.1。
2.把poi和struts2的jar包加到lib目录下,下图所示。
3.struts2的配置文件 struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="default" extends="struts-default">
<action name="exportExcel" class="com.crd.action.ExportExcelAction">
<result name="success" type="stream">
<!-- 指定输出的为Excel文件 -->
<param name="contentType">application/vnd.ms-excel</param>
<!-- 类型是附件和指定下载时文件的默认名字 -->
<param name="contentDisposition">attachment;filename="Users.xls"</param>
<!-- 这里的inputName的属性要和action里相应的get方法的名字对应。例如action的对应的方法名是getDownloadFile
所以这里用downloadFile -->
<param name="inputName">downloadFile</param>
</result>
</action>
</package>
</struts>
4.关键部分,那就是下载的那部分代码。先讲讲poi导出到excel的原理
。poi的原理就是一个单元格一个单元格的画表格,先创建一个工作薄,再创建一个表格(因为一个工作薄有多个表格),然后再给表格添加行,给行添加单元格,同时设置单元格格式。
(1)声明一个工作薄
HSSFWorkbook wb=new HSSFWorkbook();
(2)创建一个表格
HSSFSheet sheet=wb.createSheet("表格名字");
(3)创建一个表格样式
HSSFCellStyle cellStyle = wb.createCellStyle();
给样式设置背景颜色等等
HSSFFont font = wb.createFont();
font.setFontHeightInPoints((short)10); // 字体高度
font.setColor(HSSFFont.COLOR_NORMAL); // 字体颜色
font.setFontName( "宋体" );
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); // 宽度
cellStyle.setFont(font);
(4)给表格创建一行(多行用for循环)
HSSFRow row=sheet.createRow(0);
(5)给行添加单元格
HSSFCell cell=row.createCell(i);
(6)给单元格设置格式
cell.setCellStyle(cellStyle);
(7)往单元格写数据
cell.setCellValue("序号");
(8)写出到excle
OutputStream os=new FileOutputStream(file);
wb.write(os);
os.close();
action的具体代码如下
@SuppressWarnings("serial")
public class ExportExcelAction extends ActionSupport{
public InputStream getDownloadFile() throws Exception{
return this.getInputStream();
}
public InputStream getInputStream() {
HSSFWorkbook wb=new HSSFWorkbook();
HSSFSheet sheet=wb.createSheet("用户列表");
// 设置表格样式
HSSFCellStyle cellStyle = wb.createCellStyle();
HSSFFont font = wb.createFont();
font.setFontHeightInPoints((short)10); // 字体高度
font.setColor(HSSFFont.COLOR_NORMAL); // 字体颜色
font.setFontName( "宋体" );
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); // 宽度
//font.setItalic( true ); // 是否使用斜体
//font.setStrikeout(true); // 是否使用划线
cellStyle.setFont(font);
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 水平布局:居中
cellStyle.setWrapText(false);
HSSFRow row=sheet.createRow(0);
HSSFCell cell=row.createCell(0);
cell.setCellStyle(cellStyle); // 设置单元格样式
cell.setCellValue("序号");
cell=row.createCell(1);
cell.setCellStyle(cellStyle); // 设置单元格样式
cell.setCellValue("姓名");
cell=row.createCell(2);
cell.setCellStyle(cellStyle); // 设置单元格样式
cell.setCellValue("年龄");
//如果是数据库的数据的话,用一个for循环就可以输出全部了
row=sheet.createRow(1);
cell=row.createCell(0);
cell.setCellValue(1);
cell=row.createCell(1);
cell.setCellValue("张三");
cell=row.createCell(2);
cell.setCellValue("22");
//String fileName=RandomStringUtils.randomAlphanumeric(10);
String fileName="Users";
fileName=new StringBuffer(fileName).append(".xls").toString();
File file=new File(fileName);
try {
OutputStream os=new FileOutputStream(file);
wb.write(os);
os.close();
InputStream is=new FileInputStream(file);
return is;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
public String execute() throws Exception {
return SUCCESS;
}
}
5.运行结果如下:
6.总结
是很简单吧,里面有些写得不好的地方。
比如说在action里直接写死了生成的excel的名字Users
//String fileName=RandomStringUtils.randomAlphanumeric(10);
String fileName="Users";
如果在同一时间有多人点击下载按钮,如果导出的数据不同时,可能会出错,可以改成随机取名字,但这样的话生成的临时的excel会有很多,要写个方法进行删除过期的excel,或者就不生成临时的excel,直接导出来就可以了,这样无疑是最好的(后面改进,或者有兴趣的读者改进)。以前做的时候用的是struts1,直接
OutputStream out=response.getOutputStream();就可以了。
资源下载链接http://download.csdn.net/detail/crd629277/3688404