Flex,actionscript3,Java 导出

flex+java 导出方案

1,flex第三方as3xls.swc导出,很久没维护,而且导出只能excel2003打开。很痛苦。

2,纯后台导出,方案很多,缺点是无法做到页面所见即所得。比如flex端DataGrid列设置了visable,设置了labelfunction。后台都无法获得。

3,把前端的DataGrid,表头和数据通过String ,post到后端,进行导出。【本文章主要阐述】

直接上代码Flex端:ExportDataGrid类


	import mx.controls.AdvancedDataGrid;
	import mx.controls.DataGrid;
	import mx.controls.dataGridClasses.DataGridColumn;

	public class ExportDataGrid
	{
		public function ExportDataGrid()
		{
		}
		public static const splitTag:String="^";
		//表头转为字符串,用"^"隔开  
		private static function convertADGHead(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+splitTag;  
				} else {  
					str+=dg.columns[i].dataField+splitTag;  
				}  
			}  
			return str;  
		}  
		
		//表内容转为字符串,用"^"隔开  
		private static function convertADGData(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)+splitTag;  
						} else {  
							str += dg.dataProvider.getItemAt(j)[dg.columns[k].dataField]+splitTag;  
						}  
					}  
				}  
			}  
			return str;  
		}
		
		//表内容转为字符串,用"^"隔开  
		public static function convertDGHead(dg:DataGrid):String {  
			var str:String = '';
			var column:DataGridColumn;
			for(var i:int = 0;i<dg.columns.length;i++) {
				column=dg.columns[i] as DataGridColumn;
				if(!column.visible){
					continue;
				}
//				if(column.dataField==null){
//					continue;
//				}
				if(column.headerText != undefined) {  
					str+=column.headerText+splitTag;  
				} else {  
					str+=" "+splitTag;
				}  
			}  
			return str;  
		}  
		
		
		public static function convertDGData(dg:DataGrid):String {  
			var str:String = '';
			var column:DataGridColumn;
			for(var j:int =0;j<dg.dataProvider.length;j++){
				for(var k:int=0; k < dg.columns.length; k++) {
					column=dg.columns[k] as DataGridColumn;
					if(!column.visible){
						continue;
					}
//					if(column.dataField==null){
//						continue;
//					}
				
					if(dg.dataProvider.getItemAt(j) != undefined && dg.dataProvider.getItemAt(j) != null) {
						
						if(column.labelFunction != undefined) {  
							str += column.labelFunction(dg.dataProvider.getItemAt(j),column)+splitTag;  
						} else {  
							if(column.dataField==null){//操作列
								str+=" "+splitTag;
							}else{
								if(dg.dataProvider.getItemAt(j)[column.dataField] == null){
									str += " "+splitTag;
								}else{
									str += dg.dataProvider.getItemAt(j)[column.dataField]+splitTag;  
								}
							}
						}
					}
				}
				//每换行一次多加一个分隔符
				if(j!=dg.dataProvider.length-1){
					str +=splitTag;
				}
			}
			return str;  
		}  
	}

Java端ExcelUtils


import org.apache.commons.lang.StringUtils;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.Workbook;

import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;

public class ExcelUtils {
    
    public static void exportExcel(String head, String data, HttpServletResponse response)throws Exception{
        HSSFWorkbook wb = generateExcel(head,data);
        downLoadExcel("",response,wb);

    }
    private static void downLoadExcel(String fileName, HttpServletResponse response, Workbook 
workbook) {
        try {
            response.setCharacterEncoding("UTF-8");
            response.setHeader("content-Type", "application/vnd.ms-excel");
            response.setHeader("Content-Disposition",
                    "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
            workbook.write(response.getOutputStream());
        } catch (IOException e) {
           throw new Exception(e.getMessage());
        }
    }
    public static HSSFWorkbook generateExcel(String head, String data) throws Exception {
        HSSFWorkbook wb = new HSSFWorkbook();
        wb.createSheet();
        HSSFSheet sheet = wb.getSheetAt(0);
        //-1防止最后一列数据为空,导致数组length缺失
        String[] headArr = head.split("\\^",-1);
        String[] dataArr = data.split("\\^",-1);
        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;
    }

  
}

实际应用:

dataGrid 为表格组件DataGrid的id

/*导出*/
			public var downloadFile:FileReference;
			public function export():void{
				downloadFile=new FileReference();
				downloadFile.addEventListener(IOErrorEvent.IO_ERROR,ioError);
				downloadFile.addEventListener(Event.COMPLETE,completeHandle);
//url写自己的后端接口地址
				var downloadURL:URLRequest = new URLRequest("http://localhost:8081/server/export");
				var variables:URLVariables = new URLVariables();
				variables.head = ExportDataGrid.convertDGHead(dataGrid);  
				variables.data = ExportDataGrid.convertDGData(dataGrid);
				downloadURL.method="post";
				downloadURL.data=variables;
				downloadFile.download(downloadURL,"列表.xls");
			}
			private function ioError(e:IOErrorEvent):void{
				Alert.show("导出失败","错误"+e.errorID);
			}
			protected function completeHandle(e:Event):void{
				Alert.show("操作成功!");
			}

后端

@RequestMapping(value = "/export",method = RequestMethod.POST)
    public void excelExport(@RequestParam(value = "data") String data,
                            @RequestParam(value = "head") String head, HttpServletResponse response) throws Exception {
        ExcelUtils.exportExcel(head,data,response);


    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值