`
pufan53
  • 浏览: 44103 次
  • 性别: Icon_minigender_2
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

Flex按模板导出Excel

阅读更多
    Flex前端+Java后台,要将Flex界面中AdvancedDataGrid的数据按Excel模板导出Excel文件。
    前台as3xls对Excel模板样式的获取不足,因此选择在Java后台使用POI。
实现思路:
1.DataGrid数据传到服务器。
2.打开Excel模板。
3.向模板写入数据。
4.客户端下载写好的Excel。

AS代码:
public static function ToExcel(dg:AdvancedDataGrid,name:String)
{		      
    url="http://localhost:8080/XXX/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");
			
}

//表头转为字符串,用";"隔开
private static 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 static 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.Export.ExcelServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>ExcelServlet</servlet-name>
    <url-pattern>/servlet/ExcelServlet</url-pattern>
</servlet-mapping>


ExcelServlet.java:
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\\XXX\\model\\Model.xls";
        }
        else //只有一级 如:"d:\tomcat6"
        {
            tmp += "\\webapps\\XXX\\model\\Model.xls";
        }
	    
        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);
				
                if(rowNum == 0)  {  //表头 
                    cell.setCellValue(headArr[colNum]);
                }else{
                    cell.setCellValue(dataArr[colNum+headArr.length*(rowNum-1)]);
                }
            }
        }
        return wb;
    }

}


要注意的问题:
1.给Servlet传值时HTTP有参数长度的限制,大约120个字符,参数超过时必须指定为POST方法,即加上此句:request.method = URLRequestMethod.POST;
2.flex中隐含为utf-8编码,因此必须含有request.setCharacterEncoding("UTF-8")语句来编码接收的数据,也必须含有response.setCharacterEncoding("UTF-8");语句以编码输出数据,否则会出现汉字乱码。
分享到:
评论
3 楼 sxm2017 2012-12-07  
谢谢,写的真不错,谢谢分享。。。。
2 楼 pufan53 2011-08-06  
liuwenfeng554 写道
AdvancedDataGrid 请问一下你前台是怎么调用的

AdvancedDataGrid中的数据最开始也是从java传来的,显示出来后,要导出的时候才用到上面所说的,再把AdvancedDataGrid的数据传回到java
1 楼 liuwenfeng554 2011-08-03  
AdvancedDataGrid 请问一下你前台是怎么调用的

相关推荐

    flex导出复杂excel

    AdvancedDataGrid导出复杂表头excel

    flex前台直接导出excel

    "flex前台直接导出excel"这个话题,指的是在使用Adobe Flex这一前端框架时,如何直接在客户端生成并导出Excel文件,而不需要通过服务器端如JSP或Java进行处理。这种方式可以避免因为字符编码问题导致的乱码,同时也...

    flex air 导出 excel

    然而,需要注意的是,Flex Air原生并不直接支持导出包含中文字符的Excel文件,这可能是由于早期版本的Excel文件格式处理上的限制。 要实现Flex Air导出Excel的功能,通常需要借助第三方库或者服务。一种常见的方法...

    Flex 导出Excel FlextoExcel

    Flex利用JSP导出Excel Flex利用JSP导出Excel

    flex中dataGrid导出数据到excel中

    flex中dataGrid导出数据到excel中,不存在乱码问题

    flex air 导出 excel 支持中文

    在Flex Air应用中导出Excel并支持中文是一项常见的需求,特别是在数据可视化和报表生成的场景下。Flex Air是Adobe提供的一款基于Flash Player的桌面应用程序开发框架,它允许开发者创建具有丰富用户界面的桌面应用...

    Flex的DataGrid导出Excel

    而“Flex的DataGrid导出Excel”这个主题涉及到的是如何将DataGrid中的数据显示到Microsoft Excel文件中,以便用户可以进一步处理、分析或共享这些数据。这个过程通常分为几个关键步骤: 1. **数据准备**:首先,你...

    Flex3ReadWriteExcel(flex3导入导出excel表格)

    在描述中提到的示例,就是通过Flex3的APIs来实现DataGrid中的数据导入到Excel以及从Excel导出数据的功能。这一过程涉及到两个关键步骤:数据的读取和数据的写入。 1. 数据读取: - 使用Flex3中的FileReference类,...

    将flex页面数据导出到excel

    本篇将详细讲解如何在Flex页面上实现数据导出到Excel的功能。 Flex是一种基于Adobe Flash Player运行时的开放源代码框架,主要用于构建富互联网应用程序(RIA)。它允许开发者创建具有丰富用户体验的交互式应用,但...

    flex导出excel

    5. `src`:这是源代码目录,很可能包含了ActionScript类文件,其中可能有实现Excel导出功能的代码。 6. `scripts`:这个目录可能包含了与项目相关的脚本文件,可能包括用于数据处理或与服务器交互的ActionScript...

    Flex导出Excel

    1. `FlexExcel.as`: 这可能是自定义的ActionScript类,用于处理Excel导出逻辑。它可能包含了创建CSV或XML文件的方法,以及将数据转换为适合Excel的格式的代码。 2. `FlexExportUtil.as`: 另一个可能的工具类,包含了...

    flex 多层表头advancegrid 导出excel

    这个类可能会使用Adobe的Flex SDK中的PDF和Excel导出库,如PDFWriter和ExcelWriter。这些库允许我们以编程方式创建PDF和Excel文件,包括设置单元格的样式、合并单元格以及插入数据。 在处理多层表头时,我们需要在...

    FLEX导出EXCEL支持合并隐藏单元格

    `ExportExcel`类包含了一系列与Excel导出相关的功能,例如设置单元格宽度、处理数据格式等。值得注意的是,`ExportExcel`类还提供了处理单元格数据长度过长问题的解决方案,通过设置单元格宽度比例`WIDTHSCALE`,...

    Flex air 导入 导出 excel 打开图片等

    通过flex air 程序,使用as3xls,直接在air程序中导入excel 2003 版本,自动生成列头并显示,界面操作后可以导出excel文件 也可以导入image 直接显示 本列子为自己写的一个demo

    将Flex DataGrid数据导出到Excel中

    本教程将详细介绍如何实现从Flex DataGrid导出数据到Excel的功能。 首先,让我们了解Flex DataGrid。它是一个强大的组件,用于显示二维数据集,通常包含可排序和可分页的列。DataGrid可以绑定到各种数据源,包括...

    flex导出Excel

    使用as3xls-1.0.1.SWC包做的Flex界面DateGrid数据导出Excel表格。

    Flex导出excel文件例子

    在Flex开发中,导出数据到Excel文件是常见的需求,特别是在数据展示和分析场景中。...通过熟悉as3xls库和Flex的数据绑定机制,你可以创建功能丰富的Excel导出功能,满足用户对数据管理和分析的需求。

    Flex中组件datagrid导出Excel

    本主题将深入探讨如何在Flex中实现组件DataGrid的数据导出功能,使其能够生成Excel文件供用户下载和处理。 DataGrid是Flex中常用的一个组件,它用于展示结构化数据,通常用于表格形式的展示。在Flex中,我们可以...

    flex 导出excel工具

    flex 导出excel工具包 用法如下: import com.as3xls.xls.ExcelFile; import com.as3xls.xls.Sheet; import mx.collections.ArrayCollection; import mx.controls.DataGrid; import mx.controls.dataGridClasses....

    flex导出excel的代码

    &lt;![CDATA[ import mx.controls.CheckBox; import mx.controls.Alert;... 导出" click="onCreate()"/&gt; (data as Object)} " /&gt; &lt;/mx:DataGridColumn&gt; &lt;/mx:WindowedApplication&gt;

Global site tag (gtag.js) - Google Analytics