Flex Excel下载
最近做Flex里的Excel下载,用as3xls进行Excel导出后,Excel修改编辑后老出现:不能以当前格式保存。。。若要保存所做的更改,请单击“确定”,然后将其另存为最新的格式。
最后通过JAVA的POI实现Excel下载的,具体实现思路:
1.DataGrid数据传到服务器。
2.打开Excel模板。
3.向模板写入数据。
4.客户端下载写好的Excel。
前台Flex代码
- public function ToExcel(dg:AdvancedDataGrid,name:String)
- {
- var url:String="http://localhost:8080/Demo/servlet/ExcelServlet";
- var variables:URLVariables = new URLVariables();
- variables.head = convertDGHead(dg);
- variables.data = convertDGData(dg);
- var request:URLRequest = new URLRequest(url);
- request.method = URLRequestMethod.POST;
- request.data = variables;
- var fileReference:FileReference=new FileReference();
- fileReference.download(request,name+".xls");
- fileReference.addEventListener(Event.COMPLETE,doEvent);
- }
- private function doEvent(evt:Event):void {
- Alert.show("下载完成");
- }
- //表头转为字符串,用";"隔开
- private function convertDGHead(dg:AdvancedDataGrid):String {
- var str:String = '';
- for(var i:int = 0;i<dg.columns.length;i++) {
- if(dg.columns[i].headerText != undefined) {
- str+=dg.columns[i].headerText+";";
- } else {
- str+=dg.columns[i].dataField+";";
- }
- }
- return str;
- }
- //表内容转为字符串,用";"隔开
- private function convertDGData(dg:AdvancedDataGrid):String {
- var str:String = '';
- for(var j:int =0;j<dg.dataProvider.length;j++)
- {
- for(var k:int=0; k < dg.columns.length; k++) {
- if(dg.dataProvider.getItemAt(j) != undefined && dg.dataProvider.getItemAt(j) != null) {
- if(dg.columns[k].labelFunction != undefined) {
- str += dg.columns[k].labelFunction(dg.dataProvider.getItemAt(j),dg.columns[k].dataField)+";";
- } else {
- str += dg.dataProvider.getItemAt(j)[dg.columns[k].dataField]+";";
- }
- }
- }
- }
- return str;
- }
web.xml中增加:
- <servlet>
- <servlet-name>ExcelServlet</servlet-name>
- <servlet-class>com.test.ExcelServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>ExcelServlet</servlet-name>
- <url-pattern>/servlet/ExcelServlet</url-pattern>
- </servlet-mapping>
后台JAVA代码:
- package com.test;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.IOException;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- 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.HSSFRow;
- import org.apache.poi.hssf.usermodel.HSSFSheet;
- import org.apache.poi.hssf.usermodel.HSSFWorkbook;
- import org.apache.poi.poifs.filesystem.POIFSFileSystem;
- public class ExcelServlet extends HttpServlet {
- private static final long serialVersionUID = 1L;
- public ExcelServlet() {
- super();
- }
- public void destroy() {
- super.destroy(); // Just puts "destroy" string in log
- // Put your code here
- }
- public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- doMainDispatch(request, response);
- }
- public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- doMainDispatch(request, response);
- }
- public void init() throws ServletException {
- // Put your code here
- }
- protected void doMainDispatch(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- String filename = "excel.xls";
- resp.reset();
- req.setCharacterEncoding("UTF-8");
- resp.setCharacterEncoding("UTF-8");
- resp.setContentType("application/vnd.ms-excel");
- resp.addHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
- String head = req.getParameter("head");
- String data = req.getParameter("data");
- HSSFWorkbook wb = generateExcel(head,data);
- wb.write(resp.getOutputStream());
- resp.getOutputStream().flush();
- resp.getOutputStream().close();
- req.getInputStream().close();
- }
- private HSSFWorkbook generateExcel(String head, String data) throws IOException {
- String tmp = (new File("")).getCanonicalPath();
- //如果不是只有一级 如:"d:\tomcat6\bin"
- if(tmp.indexOf("bin") != -1)
- {
- tmp = tmp.substring(0, tmp.lastIndexOf("\\"))
- + "\\webapps\\Demo\\model\\Model.xls";
- }
- else //只有一级 如:"d:\tomcat6"
- {
- tmp += "\\webapps\\Demo\\model\\Model.xls";
- }
- //创建输出数据文件
- File modelFile =new File(tmp);
- // 路径下不存在此模板文件
- if (!modelFile.getParentFile().exists()) {
- return null;
- }
- else{
- FileInputStream fileinputstream = new FileInputStream(tmp);
- POIFSFileSystem poifsfilesystem = new POIFSFileSystem(fileinputstream);
- HSSFWorkbook wb = new HSSFWorkbook(poifsfilesystem);
- HSSFSheet sheet = wb.getSheetAt(0);
- String[] headArr = head.split(";");
- String[] dataArr = data.split(";");
- for(int rowNum=0; rowNum<=dataArr.length/headArr.length; rowNum++)
- {
- HSSFRow row = sheet.getRow(rowNum);
- HSSFCellStyle rowstyle=null;
- if(row == null) //如果模板中没有这一行,则新建
- {
- row = sheet.createRow(rowNum);
- }
- else //如果有这一行,获取样式
- {
- rowstyle = row.getRowStyle();
- }
- for(int colNum=0; colNum<headArr.length; colNum++)
- {
- HSSFCell cell = row.getCell(colNum);
- HSSFCellStyle cellstyle=null;
- if(cell == null){
- cell = row.createCell(colNum);
- }else{
- cellstyle = cell.getCellStyle();
- }
- if(cellstyle != null)
- cell.setCellStyle(cellstyle);
- else if(rowstyle != null)
- cell.setCellStyle(rowstyle);
- }
- }
- return wb;
- }
- }
- }
注:
1.给Servlet传值时HTTP有参数长度的限制,参数超过时必须指定为POST方法,此次传Excel文件内容,不能用GET方法,因此要加上request.method = URLRequestMethod.POST;
2.flex中隐含为utf-8编码,因此必须含有request.setCharacterEncoding("UTF-8")语句来编码接收的数据,也必须含有response.setCharacterEncoding("UTF-8");语句以编码输出数据,否则会出现汉字乱码。
3、tomcat6在默认状态下最大的post请求是2M ,以此要在server.xml文件中设maxPostSize属性
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" maxPostSize="0" />
maxPostSize: 0 表示不限制 单位为:byte
本文参考链接:http://pufan53.iteye.com/blog/903468
POST相关限制文章:http://blog.csdn.net/jackyren007/article/details/3715444
http://www.iteye.com/topic/1129186
Flex Excel下载的更多相关文章
- DevExpress中GridView Excel下载
DevExpress中GridView提供了许多Excel下载的方法,如gridView.ExportToExcelOld(sfdExcelDown.FileName); 在修改Bug时,遇到这样问题 ...
- ASP.NET Excel下载方法一览
方法一 通过GridView(简评:方法比较简单,但是只适合生成格式简单的Excel,且无法保留VBA代码),页面无刷新 aspx.cs部分 using System; using System.Co ...
- JS JQuery 操作: Json转 Excel 下载文件
方法的调用 var json = '[' + '{"申请流水号":"123456","保险公司":"测试数据",&quo ...
- 自己挖的坑自己填--jxl进行Excel下载堆内存溢出问题
今天在进行使用 jxl 进行 Excel 下载时,由于数据量大(4万多条接近5万条数据的下载),数据结构过于负责,存在大量大对象(虽然在对象每次用完都设置为null,但还是存在内存溢出问题),加上本地 ...
- PHP Excel 下载数据,并分页下载
直接上代码: 调用下载Excel: $total=$duoduo->count(MOD.' as a',$where); $objExcel= SelfExcelObject(); //导出 i ...
- SpringMVC生成Excel下载
SpringMVC controller里的方法: @RequestMapping(value="/notify/download",produces = {"appli ...
- C# MVC 自定义ActionResult实现EXCEL下载
前言 在WEB中,经常要使用到将数据转换成EXCEL,并进行下载.这里整理资料并封装了一个自定义ActionResult类,便于使用.如果文章对你有帮助,请点个赞. 话不多少,这里转换EXCEL使用的 ...
- excel 下载
public string CreateExcel(string SelectedBizType, string strReportDate, DropDownList ddlYQ, DropDown ...
- 将页面内容转为Excel下载
使用:method1(table); 说明:参数table为table元素的ID; var idTmr; function getExplorer() { var explorer = window. ...
随机推荐
- C#winform调用外部程序,等待外部程序执行完毕才执行下面代码
1.简单调用外部程序文件(exe文件,批处理等),只需下面一行代码即可 System.Diagnostics.Process.Start(“应用程序文件全路径”); 2.如果要等待调用外部程序执行完毕 ...
- 深入理解Spark RDD
RDD是什么? RDD,全称是Reslilient Distributed Datasets,是一个容错的,并行的数据结构,可以让用户显式地将数据存储到磁盘和内存中,并能控制数据的分区.同时,RDD还 ...
- 在windows下新建maven项目
1.拷贝settings到.m2文件下 2.修改文件 3.新建Project项目 4.转换为maven项目 config下转换 5.拷贝pom文件 6.新建目录 src/main/java src/m ...
- jquery中.attr('value')和.val()的区别
.val() 能够取到 针对text,hidden可输入的文本框的value值. 而 .attr('value') 可以取到html元素中所设置的属性 value的值,不能获取动态的如input ty ...
- 周记:Linux下C编程
也啥都没干,计划一个都没干.吼吼-- 周六去看[21天学通Linux_C编程]笔记: 突然都对这本书没信心了.刚开始,就出现的不满如下:1.创建vim启动器时候,类型要选择[终端下的应用程序]没说,虽 ...
- 【C语言学习笔记】存储类、链接和内存管理
因为对内存管理部分一直没有很清楚的思路,所以一直在找资料想系统看一下这部分的内容.在C primer plus里看到了这一章,虽然大多都是心知肚明的东西,但是还是很多概念性系统性的东西让我眼前一亮,把 ...
- JMeter学习-007-JMeter 断言实例之一 - 响应断言
之前的文章中已经对如何录制 web 的请求进行了详细的描述,敬请参阅:JMeter学习-004-WEB脚本入门实战 同时,我们的手机应用(例如:京东.天猫.唯品会.携程.易迅 等等 App)所发出的请 ...
- RML Utilities for SQL Server
很早以前有看到过关于使用RML Utilities工具分析SQL Trace(.trc)的文章,但一直没有具体实践.最近接管一台数据库服务器,跟踪出一批高消耗的语句,老大需要跟踪分析报表,罗列出过程( ...
- [SLAM]2D激光线特征提取
Nguyen, V., et al. (2007)."A comparison of line extraction algorithms using 2D range data for i ...
- excel转换日期格式,将yyyymmdd类型日期转换成yyyy-mm-dd等日期类型方法
源数据日期格式:例如: 20160420 20160422 目标日期格式类型: 2016-4-20 2016-4-22 或 2016/04/20 2016/04/22 方法: 一.选中相应数据的单元格 ...