最近做Flex里的Excel下载,用as3xls进行Excel导出后,Excel修改编辑后老出现:不能以当前格式保存。。。若要保存所做的更改,请单击“确定”,然后将其另存为最新的格式。

最后通过JAVA的POI实现Excel下载的,具体实现思路:
1.DataGrid数据传到服务器。
2.打开Excel模板。
3.向模板写入数据。
4.客户端下载写好的Excel。

前台Flex代码

  1. public function ToExcel(dg:AdvancedDataGrid,name:String)
  2. {
  3. var url:String="http://localhost:8080/Demo/servlet/ExcelServlet";
  4. var variables:URLVariables = new URLVariables();
  5. variables.head = convertDGHead(dg);
  6. variables.data = convertDGData(dg);
  7.  
  8. var request:URLRequest = new URLRequest(url);
  9. request.method = URLRequestMethod.POST;
  10. request.data = variables;
  11.  
  12. var fileReference:FileReference=new FileReference();
  13. fileReference.download(request,name+".xls");
  14. fileReference.addEventListener(Event.COMPLETE,doEvent);
  15.  
  16. }
  17. private function doEvent(evt:Event):void {
  18. Alert.show("下载完成");
  19. }
  20. //表头转为字符串,用";"隔开
  21. private function convertDGHead(dg:AdvancedDataGrid):String {
  22. var str:String = '';
  23. for(var i:int = 0;i<dg.columns.length;i++) {
  24. if(dg.columns[i].headerText != undefined) {
  25. str+=dg.columns[i].headerText+";";
  26. } else {
  27. str+=dg.columns[i].dataField+";";
  28. }
  29. }
  30. return str;
  31. }
  32.  
  33. //表内容转为字符串,用";"隔开
  34. private function convertDGData(dg:AdvancedDataGrid):String {
  35. var str:String = '';
  36. for(var j:int =0;j<dg.dataProvider.length;j++)
  37. {
  38. for(var k:int=0; k < dg.columns.length; k++) {
  39. if(dg.dataProvider.getItemAt(j) != undefined && dg.dataProvider.getItemAt(j) != null) {
  40. if(dg.columns[k].labelFunction != undefined) {
  41. str += dg.columns[k].labelFunction(dg.dataProvider.getItemAt(j),dg.columns[k].dataField)+";";
  42. } else {
  43. str += dg.dataProvider.getItemAt(j)[dg.columns[k].dataField]+";";
  44. }
  45. }
  46. }
  47. }
  48. return str;
  49. }

web.xml中增加:

  1.       <servlet>
  2. <servlet-name>ExcelServlet</servlet-name>
  3. <servlet-class>com.test.ExcelServlet</servlet-class>
  4. </servlet>
  5.  
  6. <servlet-mapping>
  7. <servlet-name>ExcelServlet</servlet-name>
  8. <url-pattern>/servlet/ExcelServlet</url-pattern>
  9. </servlet-mapping>

后台JAVA代码:

  1. package com.test;
  2.  
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.IOException;
  6.  
  7. import javax.servlet.ServletException;
  8. import javax.servlet.http.HttpServlet;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11.  
  12. import org.apache.poi.hssf.usermodel.HSSFCell;
  13. import org.apache.poi.hssf.usermodel.HSSFCellStyle;
  14. import org.apache.poi.hssf.usermodel.HSSFRow;
  15. import org.apache.poi.hssf.usermodel.HSSFSheet;
  16. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  17. import org.apache.poi.poifs.filesystem.POIFSFileSystem;
  18.  
  19. public class ExcelServlet extends HttpServlet {
  20. private static final long serialVersionUID = 1L;
  21.  
  22. public ExcelServlet() {
  23. super();
  24. }
  25.  
  26. public void destroy() {
  27. super.destroy(); // Just puts "destroy" string in log
  28. // Put your code here
  29. }
  30.  
  31. public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  32. doMainDispatch(request, response);
  33. }
  34.  
  35. public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  36. doMainDispatch(request, response);
  37. }
  38.  
  39. public void init() throws ServletException {
  40. // Put your code here
  41. }
  42.  
  43. protected void doMainDispatch(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  44. String filename = "excel.xls";
  45. resp.reset();
  46. req.setCharacterEncoding("UTF-8");
  47. resp.setCharacterEncoding("UTF-8");
  48. resp.setContentType("application/vnd.ms-excel");
  49. resp.addHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
  50. String head = req.getParameter("head");
  51. String data = req.getParameter("data");
  52. HSSFWorkbook wb = generateExcel(head,data);
  53. wb.write(resp.getOutputStream());
  54. resp.getOutputStream().flush();
  55. resp.getOutputStream().close();
  56. req.getInputStream().close();
  57. }
  58.  
  59. private HSSFWorkbook generateExcel(String head, String data) throws IOException {
  60. String tmp = (new File("")).getCanonicalPath();
  61. //如果不是只有一级 如:"d:\tomcat6\bin"
  62. if(tmp.indexOf("bin") != -1)
  63. {
  64. tmp = tmp.substring(0, tmp.lastIndexOf("\\"))
  65. + "\\webapps\\Demo\\model\\Model.xls";
  66. }
  67. else //只有一级 如:"d:\tomcat6"
  68. {
  69. tmp += "\\webapps\\Demo\\model\\Model.xls";
  70. }
  71.  
  72. //创建输出数据文件
  73. File modelFile =new File(tmp);
  74. // 路径下不存在此模板文件
  75. if (!modelFile.getParentFile().exists()) {
  76. return null;
  77. }
  78. else{
  79. FileInputStream fileinputstream = new FileInputStream(tmp);
  80. POIFSFileSystem poifsfilesystem = new POIFSFileSystem(fileinputstream);
  81. HSSFWorkbook wb = new HSSFWorkbook(poifsfilesystem);
  82. HSSFSheet sheet = wb.getSheetAt(0);
  83.  
  84. String[] headArr = head.split(";");
  85. String[] dataArr = data.split(";");
  86.  
  87. for(int rowNum=0; rowNum<=dataArr.length/headArr.length; rowNum++)
  88. {
  89. HSSFRow row = sheet.getRow(rowNum);
  90. HSSFCellStyle rowstyle=null;
  91. if(row == null) //如果模板中没有这一行,则新建
  92. {
  93. row = sheet.createRow(rowNum);
  94. }
  95. else //如果有这一行,获取样式
  96. {
  97. rowstyle = row.getRowStyle();
  98. }
  99.  
  100. for(int colNum=0; colNum<headArr.length; colNum++)
  101. {
  102. HSSFCell cell = row.getCell(colNum);
  103. HSSFCellStyle cellstyle=null;
  104. if(cell == null){
  105. cell = row.createCell(colNum);
  106. }else{
  107. cellstyle = cell.getCellStyle();
  108. }
  109.  
  110. if(cellstyle != null)
  111. cell.setCellStyle(cellstyle);
  112. else if(rowstyle != null)
  113. cell.setCellStyle(rowstyle);
  114. }
  115. }
  116. return wb;
  117. }
  118. }
  119. }

注:
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下载的更多相关文章

  1. DevExpress中GridView Excel下载

    DevExpress中GridView提供了许多Excel下载的方法,如gridView.ExportToExcelOld(sfdExcelDown.FileName); 在修改Bug时,遇到这样问题 ...

  2. ASP.NET Excel下载方法一览

    方法一 通过GridView(简评:方法比较简单,但是只适合生成格式简单的Excel,且无法保留VBA代码),页面无刷新 aspx.cs部分 using System; using System.Co ...

  3. JS JQuery 操作: Json转 Excel 下载文件

    方法的调用 var json = '[' + '{"申请流水号":"123456","保险公司":"测试数据",&quo ...

  4. 自己挖的坑自己填--jxl进行Excel下载堆内存溢出问题

    今天在进行使用 jxl 进行 Excel 下载时,由于数据量大(4万多条接近5万条数据的下载),数据结构过于负责,存在大量大对象(虽然在对象每次用完都设置为null,但还是存在内存溢出问题),加上本地 ...

  5. PHP Excel 下载数据,并分页下载

    直接上代码: 调用下载Excel: $total=$duoduo->count(MOD.' as a',$where); $objExcel= SelfExcelObject(); //导出 i ...

  6. SpringMVC生成Excel下载

    SpringMVC controller里的方法: @RequestMapping(value="/notify/download",produces = {"appli ...

  7. C# MVC 自定义ActionResult实现EXCEL下载

    前言 在WEB中,经常要使用到将数据转换成EXCEL,并进行下载.这里整理资料并封装了一个自定义ActionResult类,便于使用.如果文章对你有帮助,请点个赞. 话不多少,这里转换EXCEL使用的 ...

  8. excel 下载

    public string CreateExcel(string SelectedBizType, string strReportDate, DropDownList ddlYQ, DropDown ...

  9. 将页面内容转为Excel下载

    使用:method1(table); 说明:参数table为table元素的ID; var idTmr; function getExplorer() { var explorer = window. ...

随机推荐

  1. C#winform调用外部程序,等待外部程序执行完毕才执行下面代码

    1.简单调用外部程序文件(exe文件,批处理等),只需下面一行代码即可 System.Diagnostics.Process.Start(“应用程序文件全路径”); 2.如果要等待调用外部程序执行完毕 ...

  2. 深入理解Spark RDD

    RDD是什么? RDD,全称是Reslilient Distributed Datasets,是一个容错的,并行的数据结构,可以让用户显式地将数据存储到磁盘和内存中,并能控制数据的分区.同时,RDD还 ...

  3. 在windows下新建maven项目

    1.拷贝settings到.m2文件下 2.修改文件 3.新建Project项目 4.转换为maven项目 config下转换 5.拷贝pom文件 6.新建目录 src/main/java src/m ...

  4. jquery中.attr('value')和.val()的区别

    .val() 能够取到 针对text,hidden可输入的文本框的value值. 而 .attr('value') 可以取到html元素中所设置的属性 value的值,不能获取动态的如input ty ...

  5. 周记:Linux下C编程

    也啥都没干,计划一个都没干.吼吼-- 周六去看[21天学通Linux_C编程]笔记: 突然都对这本书没信心了.刚开始,就出现的不满如下:1.创建vim启动器时候,类型要选择[终端下的应用程序]没说,虽 ...

  6. 【C语言学习笔记】存储类、链接和内存管理

    因为对内存管理部分一直没有很清楚的思路,所以一直在找资料想系统看一下这部分的内容.在C primer plus里看到了这一章,虽然大多都是心知肚明的东西,但是还是很多概念性系统性的东西让我眼前一亮,把 ...

  7. JMeter学习-007-JMeter 断言实例之一 - 响应断言

    之前的文章中已经对如何录制 web 的请求进行了详细的描述,敬请参阅:JMeter学习-004-WEB脚本入门实战 同时,我们的手机应用(例如:京东.天猫.唯品会.携程.易迅 等等 App)所发出的请 ...

  8. RML Utilities for SQL Server

    很早以前有看到过关于使用RML Utilities工具分析SQL Trace(.trc)的文章,但一直没有具体实践.最近接管一台数据库服务器,跟踪出一批高消耗的语句,老大需要跟踪分析报表,罗列出过程( ...

  9. [SLAM]2D激光线特征提取

    Nguyen, V., et al. (2007)."A comparison of line extraction algorithms using 2D range data for i ...

  10. excel转换日期格式,将yyyymmdd类型日期转换成yyyy-mm-dd等日期类型方法

    源数据日期格式:例如: 20160420 20160422 目标日期格式类型: 2016-4-20 2016-4-22 或 2016/04/20 2016/04/22 方法: 一.选中相应数据的单元格 ...