struts2 poi 把数据导出到excel

利用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







  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值