1 应用场合 Flex+Asp.net
2 具体步骤:
Flex的DataGrid控件编程Xml数据;
Xml数据通过UrlRequest的Post方法上传到服务器;
服务器吧Xml转换为DataSet;
通过通用xls文件生成导出类导出xls文件。(Excel模板导出)
3 代码如下:
1 Flex Code
2 AshxCode
using System;
using System.Web;
using System.Data;
using System.Collections.Generic;
using ExcelOutputLib;
public class ExcelOut : IHttpHandler {
public void ProcessRequest (HttpContext context)
{
DataSet ds = new DataSet();
String UpLoadStr="";
String TemplateFilePath = "";
String TemplateFileName = "";
String FileName = "";
IList<String> ColumnNames = new List<String>();
DataTable dt = new DataTable();
try
{
//客户端上传Xml数据
UpLoadStr = HttpUtility.HtmlDecode(context.Request.Form["htmltable"]);
if (UpLoadStr.Trim() == "" || UpLoadStr == null)
{
return;
}
//客户端上传模板文件名
TemplateFileName = context.Request.QueryString["TemplateFileName"].ToString();
//获得模板文件路径
TemplateFilePath = context.Server.MapPath(@"~/ExcelTemplate/");
//导出Xls文件路径
FileName = context.Server.MapPath(@"~/ExcelFile/");
//Xml转DataSet
ds = new DataSet();
ds = XmlBaseCls.DataToXml.ConvertXMLToDataSet(UpLoadStr);
//追加Number列
ColumnNames.Add("Number");
foreach (DataColumn dc in ds.Tables[0].Columns)
{
ColumnNames.Add(dc.Caption);
}
foreach (string obj in ColumnNames)
dt.Columns.Add(obj);
int z=1;
DataRow Tempdr=null;
foreach (DataRow dr in ds.Tables[0].Rows)
{
Tempdr = dt.NewRow();
foreach (DataColumn dc in dt.Columns)
{
if (dc.Caption == "Number")
{
Tempdr["Number"] = z.ToString();
}
else
{
Tempdr[dc.Caption] = dr[dc.Caption];
}
}
dt.Rows.Add(Tempdr);
z++;
}
ds.Tables.Add(dt);
}
catch
{
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.ClearContent();
HttpContext.Current.Response.ClearHeaders();
HttpContext.Current.Response.Flush();
HttpContext.Current.Response.End();
return;
}
//导出xls文件全路径
FileName = FileName + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss") + ".xls";
TemplateFileName = TemplateFilePath + TemplateFileName;
ExcelOutputLib.ExcelHandler excelhandler = new ExcelHandler(TemplateFileName);
//excelhandler.DownExcelFile(@"D:/ExcelOutWeb/ExcelFile/2009-11-27-13-46-31.xls");
//导出Xls方法
lock ("string")
{
System.Threading.Thread.Sleep(1000);
if (excelhandler.ExportExcel(dt, "", FileName))
{
excelhandler.DownExcelFile(FileName);
}
else
{
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.ClearContent();
HttpContext.Current.Response.ClearHeaders();
HttpContext.Current.Response.Write(excelhandler.ErrMSG);
HttpContext.Current.Response.Flush();
HttpContext.Current.Response.End();
}
}
return;
}
public bool IsReusable {
get {
return false;
}
}
}
3 Excel通用模板(坐标计算)
namespace ExcelOutputLib
{
public class ExcelCoordinate
{
/// <summary>
/// 计算WorkSheet多表开始坐标
/// </summary>
/// <param name="workSheet"></param>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
public ExcelCoordinateData CalBeginCoordinate(Excel._Worksheet workSheet,Int32 x,Int32 y)
{
int i, j;
ExcelCoordinateData coord = new ExcelCoordinateData();
coord.p_X = -1;
coord.p_Y = -1;
for (i = 1; i < 4; i++)
{
for (j = 1; j < 4; j++)
{
if (""!=workSheet.Cells[i, j].ToString())
break;
}
if (j != 3)
{
coord.p_X = i;
coord.p_Y = j;
break;
}
else
continue;
}
return coord;
}
/// <summary>
/// 计算WorkSheet单表坐标
/// </summary>
/// <param name="workSheet">workSheet实例名称</param>
/// <returns>WorkSheet记录开始坐标</returns>
public ExcelCoordinateData CalBeginCoordinate(Excel._Worksheet workSheet)
{
int i,j;
ExcelCoordinateData coord = new ExcelCoordinateData();
coord.p_X = -1;
coord.p_Y = -1;
for (i = 1; i < 4; i++)
{
for (j = 1; j < 4; j++)
{
if (""!=((Excel.Range)workSheet.Cells[i, j]).Text.ToString().Trim())
break;
}
if (j != 4)
{
coord.p_X = i+1;
coord.p_Y = j;
break;
}
else
continue;
}
return coord;
}
/// <summary>
/// 计算WorkSheet结束坐标
/// </summary>
/// <param name="x">WorkSheet开始坐标X</param>
/// <param name="y">WorkSheet开始坐标Y</param>
/// <param name="dt">表格</param>
/// <returns>WorkSheet结束坐标</returns>
public ExcelCoordinateData CalEndCoordinate(int x,int y,DataTable dt)
{
ExcelCoordinateData coord = new ExcelCoordinateData();
coord.p_X = -1;
coord.p_Y = -1;
if (dt == null)
return coord;
else
{
coord.p_X = x + dt.Rows.Count - 1;
coord.p_Y = y + dt.Columns.Count-1;
}
return coord;
}
}
}
4 Excel通用模板(Excel导出)
namespace ExcelOutputLib
{
public class ExcelHandler:IDisposable
{
public ExcelFontInfo excelFontInfo = null; //Excel字体信息
public String ErrMSG = "";
private ExcelCoordinate excelRangeCoord = null; //Excel模板开始坐标计算
private Boolean disposed = false; //资源释放标记
private String ExcelTempfName = "";//Excel模板命名
private DateTime ExcelBeginTime = DateTime.Now;
private DateTime ExcelEndTime = DateTime.Now;
private System.Reflection.Missing miss = System.Reflection.Missing.Value;//保存文件默认参数
private Excel.Application app = null; //Excel进程
private Excel.Workbooks workbooks = null;//Excel工作簿
private Excel.Sheets sheets = null;//Excelsheet
private Excel._Worksheet worksheet = null;//当前Excel工作Sheet
private Excel._Workbook workbook = null; ////Excel工作簿
private Excel.Range range = null;
#region 构造方法
/// <summary>
/// 初始化ExcelHandler
/// </summary>
/// <param name="ExcelTemplateName">模板文件全路径</param>
public ExcelHandler()
{
excelFontInfo = new ExcelFontInfo();
excelRangeCoord = new ExcelCoordinate();
}
/// <summary>
/// 初始化ExcelHandler
/// </summary>
/// <param name="ExcelTemplateName">模板文件全路径</param>
public ExcelHandler(String ExcelTemplateName)
{
ExcelTempfName = ExcelTemplateName;
excelFontInfo = new ExcelFontInfo();
excelRangeCoord = new ExcelCoordinate();
}
/// <summary>
/// 初始化ExcelHandler
/// </summary>
/// <param name="ExcelTemplateName">模板文件全路径</param>
/// <param name="ExcelFontContext">导出Excel文件字体设定</param>
public ExcelHandler(String ExcelTemplateName, ExcelFontInfo ExcelFontContext)
{
ExcelTempfName = ExcelTemplateName;
excelFontInfo = ExcelFontContext;
excelRangeCoord = new ExcelCoordinate();
}
#endregion
#region Excel文件操作
/// <summary>
/// Excel文件输出
/// </summary>
/// <param name="Path">Excel模板路径</param>
public void DownExcelFile(String FileName)
{
try
{
//string fileName = Path.Combine(path, name);
FileInfo fileInfo = new FileInfo(FileName);
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.ClearContent();
HttpContext.Current.Response.ClearHeaders();
//HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(Path.GetFileName(FileName), System.Text.Encoding.UTF8));
HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=OperatorCal.xls");
HttpContext.Current.Response.AddHeader("Content-Length", fileInfo.Length.ToString());
HttpContext.Current.Response.AddHeader("Content-Transfer-Encoding", "binary");
//HttpContext.Current.Response.ContentType = "application/octet-stream";
HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";
HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.UTF8;
HttpContext.Current.Response.WriteFile(fileInfo.FullName);
HttpContext.Current.Response.Flush();
HttpContext.Current.Response.End();
}
catch (Exception ex)
{
ErrMSG = "6";
}
}
#region Excel文件生成
/// <summary>
/// Excel文件生成
/// </summary>
/// <param name="dt">导出文件内容</param>
/// <param name="ExcelTemplateName">Excel模板全路径</param>
/// <param name="ExportExcelFileName"></param>
/// <param name="ColumnNames"></param>
/// <returns></returns>
public Boolean ExportExcel(DataTable dt, string ExcelTemplateName, string ExportExcelFileName)
{
//如果导出文件大于65535行,则退出
if (IsMaxRowCount(dt) == false)
{
return false;
}
//如果导出文件大于65535行,则退出
ExcelCoordinateData BeginCoordData = new ExcelCoordinateData();
ExcelCoordinateData EndCoordData = new ExcelCoordinateData();
try
{
ExcelBeginTime = DateTime.Now;
//1 新建ExcelApplication进程
app = new Excel.Application();
if (app == null)
{
return false;
}
app.Visible = false;
app.UserControl = true;
//1 新建ExcelApplication进程
ExcelEndTime = DateTime.Now;
//2 调用模板工作簿到导出Xls文件内
workbooks = app.Workbooks;
if (ExcelTempfName.Trim() == "")
workbook = workbooks.Add(ExcelTemplateName);
else
workbook = workbooks.Add(ExcelTempfName);
sheets = workbook.Worksheets;
//2 调用模板工作簿到导出Xls文件内
//3 获得模板的sheet
worksheet = (Excel._Worksheet)sheets.get_Item(1);
if (worksheet == null)
{
return false;
}
//3 获得模板的sheet
//4 计算坐标点
BeginCoordData = excelRangeCoord.CalBeginCoordinate(worksheet);
if (BeginCoordData.p_X == -1)
{
return false;
}
EndCoordData = excelRangeCoord.CalEndCoordinate(BeginCoordData.p_X, BeginCoordData.p_Y, dt);
if (EndCoordData.p_Y == -1)
{
return false;
}
//4 计算坐标点
//5 向Xls文件加入数据
for (int i = 0; i < dt.Rows.Count; i++)
{
for (int j = 0; j < dt.Columns.Count; j++)
worksheet.Cells[i + BeginCoordData.p_X, j + BeginCoordData.p_Y] = dt.Rows[i][j].ToString();
}
//5 向Xls文件加入数据
//6 为Excle画线
range = app.get_Range(app.Cells[BeginCoordData.p_X, BeginCoordData.p_Y], app.Cells[EndCoordData.p_X, EndCoordData.p_Y]);
//app.Cells.EntireColumn.AutoFit();
range.Borders.LineStyle = 1;
range.HorizontalAlignment = Excel.Constants.xlCenter;
//6 为Excle画线
//7 设置字体
range.Cells.Font.Name = excelFontInfo.P_FontName;
range.Cells.Font.Size = excelFontInfo.P_FontSize;
//7 设置字体
//8 判断要保存Xls文件是否存在;如果存在则删除
if (File.Exists(ExportExcelFileName))
{
File.Delete(ExportExcelFileName);
}
//8 判断要保存Xls文件是否存在;如果存在则删除
//9 保存Xls文件
workbook.SaveAs(ExportExcelFileName, miss, miss, miss, miss, miss, Excel.XlSaveAsAccessMode.xlExclusive, miss, miss, miss, miss, miss);
//9 保存Xls文件
Dispose();
return true;
}
catch (Exception ex)
{
Dispose();
ErrMSG = ex.Message;
return false;
}
}
#endregion
#endregion
#region 私有方法
/// <summary>
/// 判断Excel文件最大值
/// </summary>
/// <param name="dt">表格内容</param>
/// <returns>true成功;flase失败</returns>
private Boolean IsMaxRowCount(DataTable dt)
{
try
{
if (dt.Rows.Count > 65535)
return false;
else
return true;
}
catch
{
return false;
}
}
#endregion
#region 资源释放
/// <summary>
/// 释放Excel资源
/// </summary>
public void Dispose()
{
this.Dispose(true);
//KillExcelProcess();
//GC.SuppressFinalize(this);
}
/// <summary>
/// 强制杀死Excel进程
/// </summary>
private void KillExcelProcess()
{
Process[] myProcesses;
DateTime startTime;
myProcesses = Process.GetProcessesByName("Excel");
//得不到Excel进程ID,暂时只能判断进程启动时间
foreach (Process myProcess in myProcesses)
{
try
{
startTime = myProcess.StartTime;
if (startTime > ExcelBeginTime && startTime < ExcelEndTime)
{
myProcess.Kill();
}
}
catch
{
}
}
}
/// <summary>
/// 释放资源
/// </summary>
/// <param name="disposing">第一次执行为True;否则为False</param>
private void Dispose(bool disposing)
{
// 检查dispose方法是否被调用,如果disposed=True,则Dispose方法已经被调用。
if (!this.disposed)
{
//disposing=True,清理托管资源
if (disposing)
{
//private Excel.Application app = null; //Excel进程
//private Excel.Workbooks workbooks = null;//Excel工作簿
//private Excel.Sheets sheets = null;//Excelsheet
//private Excel._Worksheet worksheet = null;//当前Excel工作Sheet
//private Excel._Workbook workbook = null; ////Excel工作簿
//private Excel.Range range = null;
workbook.Close(null, null, null);
workbooks.Close();
app.Quit();
worksheet = null;
workbook = null;
workbooks = null;
app = null;
range = null;
GC.Collect();
}
//调用合适方法,清理非托管资源
}
disposed = true;
}
#endregion
}
}