使用NPOI完全脫離excel的導出二,批量數據導出性能優化。


使用完全脫離excel的導出中的方法導出excel,使用了一段時間后,發現問題不少,尤其是數據量特別大的時候,例如上萬的數據,經常需要好幾分鍾。於是自己就開始進行優化。


經過觀察代碼,發現能優化的地方。1使用反射的地方 2類型判斷的地方3是設置單元的值


1使用反射的地方

 PropertyInfo pinfo = typeof(TModel).GetProperty(column.Key); 

使用了反射,性能必然會有影響,但如何減少反射呢?

我想到了如果我把這些信息提前准備好,是不是就可以避免每一次循環都反射呢?

解決方法如下:使用字典提前把反射的信息保存下來,避免每一次循環都反射

 Dictionary<string, PropertyInfo> FieldNamesPropertyInfoDic = new Dictionary<string, PropertyInfo>();            if (list.Count > 0)            {                foreach (KeyValuePair<string, string> column in FieldNames)                {                    string key = column.Key;                    PropertyInfo pinfo = typeof(Titem).GetProperty(key);                    if (pinfo != null)                    {                        if (!FieldNamesPropertyInfoDic.ContainsKey(key))                        {                            FieldNamesPropertyInfoDic.Add(key, pinfo);                        }                    }                    else                    {                        throw new Exception("未找到關聯的屬性" + column.Key + "");                    }                }            }            else            {                return sheet;            }    

使用時,這樣直接從字典中取:

 PropertyInfo pinfo = FieldNamesPropertyInfoDic[column.Key];/

2類型判斷的地方和設置單元格值得方法修改如下:

把最常用的類型放在最前邊,使用return直接返回

public static void SetCellValue(Type modePropertyType, ICell newCell,string drValue)    {        if (string.IsNullOrEmpty(drValue))        {            return;        }                if (modePropertyType == typeof(string))        {            newCell.SetCellValue(drValue);            return;        }        else if (modePropertyType == typeof(DateTime))        {            newCell.SetCellValue(Convert.ToDateTime(drValue));            return;        }        else if (modePropertyType == typeof(DateTime?))        {            newCell.SetCellValue(Convert.ToDateTime(drValue));            return;        }        else if (modePropertyType == typeof(float?))        {            newCell.SetCellValue(Convert.ToSingle(drValue));            return;        }        else if (modePropertyType == typeof(decimal?))        {            newCell.SetCellValue(Convert.ToDouble(drValue));            return;        }        else if (modePropertyType == typeof(double?))        {            newCell.SetCellValue(Convert.ToDouble(drValue));            return;        }        else if (modePropertyType == typeof(int?))        {            newCell.SetCellValue(Convert.ToInt32(drValue));            return;        }        else if (modePropertyType == typeof(int))        {            newCell.SetCellValue(Convert.ToInt32(drValue));            return;        }        else if (modePropertyType == typeof(float))        {            newCell.SetCellValue(Convert.ToSingle(drValue));            return;        }        else if (modePropertyType == typeof(double))        {            newCell.SetCellValue(Convert.ToDouble(drValue));            return;        }        else if (modePropertyType == typeof(decimal))        {            newCell.SetCellValue(Convert.ToDouble(drValue));            return;        }        else if (modePropertyType == typeof(sbyte))        {            newCell.SetCellValue(Convert.ToSByte(drValue));            return;        }        else if (modePropertyType == typeof(sbyte?))        {            newCell.SetCellValue(Convert.ToSByte(drValue));            return;        }        else if (modePropertyType == typeof(byte))        {            newCell.SetCellValue(Convert.ToByte(drValue));            return;        }        else if (modePropertyType == typeof(byte?))        {            newCell.SetCellValue(Convert.ToByte(drValue));            return;        }        else if (modePropertyType == typeof(short))        {            newCell.SetCellValue(Convert.ToInt16(drValue));            return;        }        else if (modePropertyType == typeof(short?))        {            newCell.SetCellValue(Convert.ToInt16(drValue));            return;        }        else if (modePropertyType == typeof(ushort))        {            newCell.SetCellValue(Convert.ToUInt16(drValue));            return;        }        else if (modePropertyType == typeof(ushort?))        {            newCell.SetCellValue(Convert.ToUInt16(drValue));            return;        }        else if (modePropertyType == typeof(uint))        {            newCell.SetCellValue(Convert.ToUInt32(drValue));            return;        }        else if (modePropertyType == typeof(uint?))        {            newCell.SetCellValue(Convert.ToUInt32(drValue));            return;        }        else if (modePropertyType == typeof(long))        {            newCell.SetCellValue(Convert.ToInt64(drValue));            return;        }        else if (modePropertyType == typeof(long?))        {            newCell.SetCellValue(Convert.ToInt64(drValue));            return;        }        else if (modePropertyType == typeof(ulong))        {            newCell.SetCellValue(Convert.ToUInt64(drValue));            return;        }        else if (modePropertyType == typeof(ulong?))        {            newCell.SetCellValue(Convert.ToUInt64(drValue));            return;        }        else if (modePropertyType == typeof(bool))        {            newCell.SetCellValue(Convert.ToBoolean(drValue));            return;        }        else if (modePropertyType == typeof(bool?))        {            newCell.SetCellValue(Convert.ToBoolean(drValue));            return;        }        else if (modePropertyType == typeof(char))        {            newCell.SetCellValue(Convert.ToChar(drValue));            return;        }        else if (modePropertyType == typeof(char?))        {            newCell.SetCellValue(Convert.ToChar(drValue));            return;        }        else        {            newCell.SetCellValue(drValue);        }    }  


這樣修改以后,性能確實有改善,能提高百分之二十左右吧。改善不明顯,想想是不是反射影響的。於是自己不使用反射,直接使用datatable,發現沒有大的改善。於是自己再加日志,判斷到底滿載什么地方。竟然發現慢的地方不在自己的考慮范圍內。

 for (int i = 0; i < FieldNames.Count; i++)            {                sheet.AutoSizeColumn(i, true);            }

竟然是這幾行,太不起眼了。去掉了后,發現幾分鍾馬上變成了幾秒鍾。真是太想不到了!!!






注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com