|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
就安全性而言,Java已经远远低于VB.NET,更无法与安全性著称的C#相比。先看一下办法(个中略往了一些判别和扩大):
天生Excel老代码
复制代码代码以下:
///<summary>
///将一组工具导出成EXCEL
///</summary>
///<typeparamname="T">要导出工具的范例</typeparam>
///<paramname="objList">一组工具</param>
///<paramname="FileName">导出后的文件名</param>
///<paramname="columnInfo">列名信息</param>
publicstaticvoidExExcel<T>(List<T>objList,stringFileName,Dictionary<string,string>columnInfo)
{
if(columnInfo.Count==0){return;}
if(objList.Count==0){return;}
//天生EXCEL的HTML
stringexcelStr="";
TypemyType=objList[0].GetType();
//依据反射从传送出去的属性名信息失掉要显现的属性
List<PropertyInfo>myPro=newList<PropertyInfo>();
foreach(stringcNameincolumnInfo.Keys)
{
PropertyInfop=myType.GetProperty(cName);
if(p!=null)
{
myPro.Add(p);
excelStr+=columnInfo[cName]+" ";
}
}
//假如没有找到可用的属性则停止
if(myPro.Count==0){return;}
excelStr+="
";
foreach(TobjinobjList)
{
foreach(PropertyInfopinmyPro)
{
excelStr+=p.GetValue(obj,null)+" ";
}
excelStr+="
";
}
//输入EXCEL
HttpResponsers=System.Web.HttpContext.Current.Response;
rs.ContentEncoding=System.Text.Encoding.GetEncoding("GB2312");
rs.AppendHeader("Content-Disposition","attachment;filename="+FileName);
rs.ContentType="application/ms-excel";
rs.Write(excelStr);
rs.End();
}
到这个时分我想应当有伴侣能看出来成绩地点了。
这个办法天生Excel数据量不年夜的时分不会呈现成绩,当数据质变年夜以后成绩就出来了。由于办法内里界说了一个string范例的变量,将必要添补到Excel的内容叠加。关于string范例的数据利用+=操纵相称于利用string.Concat办法毗连字符串。每当举行一次+=操纵的时分就会天生一个新字符串。一定会启示一块内存,如许的操纵一多就会把内存耗尽,发生一个OutOfMemoryException。
晓得了成绩地点,改善起来也很简单,那就是使用StringBuilder叠加必要添补到Excel的内容,改善后的代码以下:
改善后天生Excel的代码
复制代码代码以下:
///<summary>
///将一组工具导出成EXCEL
///</summary>
///<typeparamname="T">要导出工具的范例</typeparam>
///<paramname="objList">一组工具</param>
///<paramname="FileName">导出后的文件名</param>
///<paramname="columnInfo">列名信息</param>
publicstaticvoidExExcel<T>(List<T>objList,stringFileName,Dictionary<string,string>columnInfo)
{
if(columnInfo.Count==0){return;}
if(objList.Count==0){return;}
//天生EXCEL的HTML
StringBuilderexcelStr=newStringBuilder(objList.Count*columnInfo.Count);
TypemyType=objList[0].GetType();
//依据反射从传送出去的属性名信息失掉要显现的属性
List<PropertyInfo>myPro=newList<PropertyInfo>();
foreach(stringcNameincolumnInfo.Keys)
{
PropertyInfop=myType.GetProperty(cName);
if(p!=null)
{
myPro.Add(p);
excelStr.Append(columnInfo[cName]).Append(" ");
}
}
//假如没有找到可用的属性则停止
if(myPro.Count==0){return;}
excelStr.Append("
");
foreach(TobjinobjList)
{
foreach(PropertyInfopinmyPro)
{
excelStr.Append(p.GetValue(obj,null)).Append(" ");
}
excelStr.Append("
");
}
//输入EXCEL
HttpResponsers=System.Web.HttpContext.Current.Response;
rs.ContentEncoding=System.Text.Encoding.GetEncoding("GB2312");
rs.AppendHeader("Content-Disposition","attachment;filename="+FileName);
rs.ContentType="application/ms-excel";
rs.Write(excelStr);
rs.End();
}
}
在实例化StringBuilderexcelStr=newStringBuilder(objList.Count*columnInfo.Count);时分预分派入手下手巨细,如许能更好的利用StringBuilder。至此,改善完成。
别的,假如您以为反射会影响功能,那末能够改成表达式树的体例,大概利用limit。据说很厉害,甚至可以把C#也干掉^_^,不过也很复杂,本来C++已经够复杂的。有人甚至还提出把这个东东引进标准,我觉得基本上不可能的。 |
|