首页 新闻 赞助 找找看

使用NPOI导出数据量大时好像很慢,看看能不能帮忙优化下代码

0
[已解决问题] 解决于 2015-11-10 15:20
 1 /// <summary>  
 2         /// 导出Excel
 3         /// 纵排顺序是按实体类定义属性前后顺序
 4         /// </summary>  
 5         /// <param name="lists">数据集合</param>  
 6         /// <param name="sheetHead">中文列名对照("属性名","表头名");默认属性名</param>  
 7         /// <param name="workbookFile">保存路径</param>  
 8         public static byte[] ExportToExcel<T>(IList<T> lists, Hashtable sheetHead, string workbookFile)
 9         {
10             var workbook = new HSSFWorkbook();
11             var ms = new MemoryStream();
12             var sheet = workbook.CreateSheet() as HSSFSheet;
13             var headerRow = sheet.CreateRow(0) as HSSFRow;
14             var isHeadRow = true;
15             var rawStart = 1;
16             var type = typeof(T);
17             var properties = type.GetProperties();
18 
19             foreach (var item in lists)
20             {
21                 var dataRow = sheet.CreateRow(rawStart) as HSSFRow;
22                 var cellNum = 0;
23                 foreach (var column in properties)
24                 {
25                     if (isHeadRow)
26                     {
27                         // 若不存在,默认属性名
28                         if (headerRow != null)
29                             headerRow.CreateCell(cellNum).SetCellValue(sheetHead[column.Name] == null ? column.Name : sheetHead[column.Name].ToString());
30                         if (dataRow != null)
31                             dataRow.CreateCell(cellNum).SetCellValue(column.GetValue(item, null) == null ? "" : column.GetValue(item, null).ToString());
32                     }
33                     else
34                     {
35                         if (dataRow != null)
36                             dataRow.CreateCell(cellNum).SetCellValue(column.GetValue(item, null) == null ? "" : column.GetValue(item, null).ToString());
37                     }
38 
39                     //列宽自适应,只对英文和数字有效
40                     sheet.AutoSizeColumn(cellNum);
41                     cellNum++;
42                 }
43                 isHeadRow = false;
44                 rawStart++;
45             }
46 
47             workbook.Write(ms);
48             ms.Flush();
49             ms.Position = 0;
50             sheet = null;
51             headerRow = null;
52             workbook = null;
53             var data = ms.ToArray();
54 
55             if (!string.IsNullOrEmpty(workbookFile))
56             {
57                 var dic = Path.GetDirectoryName(workbookFile);
58 
59                 // 创建目录
60                 if (dic != null && !Directory.Exists(dic))
61                 {
62                     Directory.CreateDirectory(dic);
63                 }
64 
65                 FileStream fs = new FileStream(workbookFile, FileMode.Create, FileAccess.Write);
66                 fs.Write(data, 0, data.Length);
67                 fs.Flush();
68                 fs.Close();
69                 fs = null;
70             }
71 
72             ms = null;
73 
74             return data;
75         }
反骨仔的主页 反骨仔 | 菜鸟二级 | 园豆:444
提问于:2015-11-06 09:10
< >
分享
最佳答案
0

时间复杂度(n*n),不知道你里面的循环是什么需求,但是,注意数据量大了是会慢,你可以异步去处理,给用户一个自己下载的页面,不要把整个页面卡住

奖励园豆:5
稳稳的河 | 老鸟四级 |园豆:4216 | 2015-11-06 16:03

现在知道主要是读取数据库数据过慢导致

反骨仔 | 园豆:444 (菜鸟二级) | 2015-11-10 15:23
其他回答(3)
0

试试引入多线程

乐享程序员 | 园豆:930 (小虾三级) | 2015-11-07 12:14

现在知道主要是读取数据库数据过慢导致

支持(0) 反对(0) 反骨仔 | 园豆:444 (菜鸟二级) | 2015-11-10 15:24
0

数据多了是慢,现在npoi我基本只用来做导入了,导出用报表做,快很多。

清海扬波 | 园豆:825 (小虾三级) | 2015-11-09 09:46

现在知道主要是读取数据库数据过慢导致

支持(0) 反对(0) 反骨仔 | 园豆:444 (菜鸟二级) | 2015-11-10 15:24
0
sheet.AutoSizeColumn(cellNum);这个对性能影响挺大的
quan0zhou | 园豆:127 (初学一级) | 2020-07-29 14:47
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册