最近做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下载的更多相关文章

  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. python logging 配置

    python logging 配置 在python中,logging由logger,handler,filter,formater四个部分组成,logger是提供我们记录日志的方法:handler是让 ...

  2. ios-WKWebView 拨打电话

    -(void)webView:(WKWebView* )webView didStartProvisionalNavigation:(WKNavigation* )navigation { NSStr ...

  3. 常用的不熟的sql语句

    1.select * from dbo.Consum_AccountPaymentLog Where CHARINDEX(',1,',','+RelatedUserIDs+',')>0 char ...

  4. MyEclipse 8.5整合Git,并在Github上发布项目【转】

    最近Git火得如日中天,而且速度体验和团队模式都很不错.手头正好有个学生实训项目,时间紧任务重,而且学校内网管理太紧,所以就想借助于Internet的分布式开发,因此想到了Github. 经过一天的调 ...

  5. java线程生命周期及其对应方法

    http://blog.sina.com.cn/s/blog_a8aa82cc0101ktrm.html http://wenku.baidu.com/view/c242df69011ca300a6c ...

  6. jquery设置checkbox状态,设置dropdownlist选中值,隐藏某控件,给某控件追加东西

    jquery设置checkbox状态 $("[ID$=chkType]").attr("checked", true); jquery设置dropdownlis ...

  7. Linux环境下apache性能测试工具ab使用详解

    网站性能压力测试是服务器网站性能调优过程中必不可缺少的一环.只有让服务器处在高压情况下,才能真正体现出软件.硬件等各种设置不当所暴露出的问题. 性能测试工具目前最常见的有以下几种:ab.http_lo ...

  8. JAVA Math类

    public class MathTest{ public static void main(String[] args)  {  /*---------下面是三角运算---------*/  //将 ...

  9. SQL Nexus

    在前面的SQLdiag系列中有提到SQLNexus,当时我们用SQLNexus查看了Perfmon Summary(性能计数器).ReadTrace Reports(跟踪文件)两项报表.SQLNexu ...

  10. ios-自定义alertView提示框

    先上图,弹框的背景色,按钮背景色,提示的消息的字体颜色都可以改变 利用单例实现丰富的自定义接口 // // PBAlertController.h // PBAlertDemo // // Creat ...