简单OA项目笔记(5):生成、下载excel格式的动态表格(POI)
2012-11-13 20:54
736 查看
把动态表格生成excel用的库叫POI,从数据库提取出数据之后,利用POI可以产生一个stream。
大体步骤:
步骤一:从数据库读信息
步骤二:数据组装成excel
步骤三:用InputStream发回浏览器
数据流:
vnd.ms-excel:文件类型是tomcat提供的
"contentDisposition">filename="AllUsers.xls":配置下载全都是附件形式,文件名以配置为准
"inputName">downloadFile:需要具体action中的get“downloadFile”
attachment;
临时文件“打开时”创建两次(下载时创建一次)tomcat/bin下:两个临时文件
要配置action:contentDisposition 要配成attachment(点开下载时,无论什么文件都会弹窗提示下载)
生成excel的过程是
1.创建sheet
2.由sheet创建:行
3.表头:short表示0号格
设置中文
4.迭代创建表格:
5.把表格写进 ByteArrayOutputStream 对象,再转换成InputStream 对象返还给action
这种方法比较麻烦,首先是下载的文件名不能重复,否则多线程情况下就该互相覆盖掉了
而且产生的随机文件名的临时文件,还要自己估摸一个时间延迟删除:
如果没删掉还有靠其他方法比如servlet启动时删除:
这个比较恶心,目前来看还是用第一种说的 在内存里 ByteArrayOutputStream 完成吧,内存很紧张的时候可能才会用临时文件吧。
大体步骤:
步骤一:从数据库读信息
步骤二:数据组装成excel
步骤三:用InputStream发回浏览器
数据流:
1.struts.xml中action配置
result:是“stream”vnd.ms-excel:文件类型是tomcat提供的
"contentDisposition">filename="AllUsers.xls":配置下载全都是附件形式,文件名以配置为准
"inputName">downloadFile:需要具体action中的get“downloadFile”
<action name="generateExcel" class="generateExcelAction"> <result name="success" type="stream"><!-- result是“stream”--> <param name="contentType">application/vnd.ms-excel</param> <!--文件类型是tomcat提供的--> <param name="contentDisposition">attachment;filename="AllUsers.xls"</param> <!--配置下载全都是附件形式,文件名以配置为准--> <param name="inputName">downloadFile</param> <!--需要具体action中的get“downloadFile”--> </result> </action>
attachment;
临时文件“打开时”创建两次(下载时创建一次)tomcat/bin下:两个临时文件
要配置action:contentDisposition 要配成attachment(点开下载时,无论什么文件都会弹窗提示下载)
2.GenerateExcelAction
这个getter和上边"inputName">downloadFile 一致public InputStream getDownloadFile() { return this.service.getInputStream(); }
3.UserServiceImpl
这里边是生成excel的核心代码,组装好之后,要把生成的excel转换成InputStream类型还给action。action根据下载配置,把文件用附件的形式发给客户端,完成下载。生成excel的过程是
1.创建sheet
2.由sheet创建:行
3.表头:short表示0号格
设置中文
4.迭代创建表格:
5.把表格写进 ByteArrayOutputStream 对象,再转换成InputStream 对象返还给action
public InputStream getInputStream() { HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb.createSheet("sheet1"); HSSFRow row = sheet.createRow(0); HSSFCell cell = row.createCell((short) 0); cell.setEncoding(HSSFCell.ENCODING_UTF_16); cell.setCellValue("序号"); cell = row.createCell((short) 1); cell.setEncoding(HSSFCell.ENCODING_UTF_16); cell.setCellValue("姓"); cell = row.createCell((short) 2); cell.setEncoding(HSSFCell.ENCODING_UTF_16); cell.setCellValue("名"); cell = row.createCell((short) 3); cell.setEncoding(HSSFCell.ENCODING_UTF_16); cell.setCellValue("年龄"); List<User> list = this.findAll(); for (int i = 0; i < list.size(); ++i) { User user = list.get(i); row = sheet.createRow(i + 1); cell = row.createCell((short) 0); cell.setEncoding(HSSFCell.ENCODING_UTF_16); cell.setCellValue(i + 1); cell = row.createCell((short) 1); cell.setEncoding(HSSFCell.ENCODING_UTF_16); cell.setCellValue(user.getFirstname()); cell = row.createCell((short) 2); cell.setEncoding(HSSFCell.ENCODING_UTF_16); cell.setCellValue(user.getLastname()); cell = row.createCell((short) 3); cell.setEncoding(HSSFCell.ENCODING_UTF_16); cell.setCellValue(user.getAge()); } ByteArrayOutputStream os = new ByteArrayOutputStream(); try { wb.write(os); } catch (IOException e) { e.printStackTrace(); } byte[] content = os.toByteArray(); InputStream is = new ByteArrayInputStream(content); return is; }
4.用另一种思路:产生临时文件
上边产生excel的的方式没有用到临时文件,直接在内存里就都完成了。还有一种方法是利用临时文件保存excel表信息。这种方法比较麻烦,首先是下载的文件名不能重复,否则多线程情况下就该互相覆盖掉了
String fileName = RandomStringUtils.randomAlphanumeric(10); fileName = new StringBuffer(fileName).append(".xls").toString(); final File file = new File(fileName); try { OutputStream os = new FileOutputStream(file); wb.write(os); os.close(); } catch (Exception e) { e.printStackTrace(); } InputStream is = null; try { is = new FileInputStream(file); } catch (FileNotFoundException e) { e.printStackTrace(); } new Thread(new Runnable() { public void run() { try { Thread.sleep(15000); } catch (InterruptedException e) { e.printStackTrace(); } file.delete();//删除临时文件 } }).start(); return is;
而且产生的随机文件名的临时文件,还要自己估摸一个时间延迟删除:
new Thread(new Runnable() { public void run() { try { Thread.sleep(15000); } catch (InterruptedException e) { e.printStackTrace(); } file.delete();//删除临时文件 } }).start();
如果没删掉还有靠其他方法比如servlet启动时删除:
public void init() throws ServletException { File file = new File("."); File[] subFiles = file.listFiles(new FileFilter() { public boolean accept(File pathname) { if(pathname.getName().endsWith("xls")) { return true; } return false; } } ); for(File f : subFiles) { f.delete(); } }
这个比较恶心,目前来看还是用第一种说的 在内存里 ByteArrayOutputStream 完成吧,内存很紧张的时候可能才会用临时文件吧。
相关文章推荐
- OA (ssh) 基本实现(poi 生成 Excel , struts2动态下载 mysql) 学习笔记(含源代码)
- OA (ssh) 基本实现(poi 生成 Excel , struts2动态下载 mysql数据库文件) 学习笔记(含源代码)
- 【学习笔记二】struts2的动态下载,使用Apache PoI生成excel表格,将用户信息以xls文件格式供用户下载
- JavaWeb项目动态导出Excel可弹出下载(基于POI和java反射机制,可选择导出项,读取数据库注释作为表头,可合计)
- Struts2 + poi 动态生成Excel 下载
- 关于poi导出大数据量EXCEL导出缓慢的解决方案--生成xml格式的表格文件(注意xls格式为03 07下格式会不一样)
- 使用jxl,Servlet,JSP 动态生成excel文件并提示下载的简单方法
- Servlet,JSP 动态生成excel文件并提示下载的简单方法
- java鬼混笔记:用Spring的ResponseEntity和poi进行excel生成和下载
- apache POI学习(三)——生成带格式的excel表格
- UE编辑器下简单把 excel格式的表格转换为wiki支持的表格
- 使用POI生成Excel并进行流下载
- POI在一个excel中动态生成多个sheet工作薄
- 基于JXL的通用Excel动态导出过程/可以在Servlet/JSP生成Excel并下载
- Ajax简单示例之改变下拉框动态生成表格
- Ajax简单示例之改变下拉框动态生成表格
- 简单OA项目笔记(1):MyEclipse添加SSH支持
- 项目中使用POI导出Excel的一些心得(包含复杂表头和动态页数与列数)
- java 动态生成多个excel文件打成zip包供用户下载
- 项目中使用POI导出Excel的一些心得(包含复杂表头和动态页数与列数)