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);
}