Delphi和.NET下操作Excel的几点建议

先说问题:

  1. 效率问题:一般用Excel来操作,大多是要实现导入导出或者生成报表的功能,必然会遇到大数据量的情况,如何快速将数据导入到数据库中呢,比如1万条数据,客户能接受的时间范围是多少。如何在传统方式下提速。
  2. Excel1900时间系统的Bug,坑死爹不偿命:excel1900的时间系统有问题,因为它把1900-2-29当成了有效时间,根据闰年算法,能被四整除但是不能被100整除的才是闰年,所以没有1900-2-29这一天存在。问题导致在1900-1-1至1900-2-28中取出的时间都会比实际少一天。如1900-1-1会变成1899-12-31.
  3. 释放资源

 

至于一般操作,具体参见http://www.cnblogs.com/brightsea/archive/2011/06/21/2085673.html。不再赘述。

 

下面看以上问题的解决方案(基于上述网址中的操作):

1.效率:

1.1.写入:一般赋值会用循环然后直接写入Excel的Worksheet:

1  worksheet.Cells[i , j] = data[i];

这种方式很慢,当你有上完条数据的时候会慢到令人发指的地步。

可以先把你要写入的数据存到一个二维数组,然后一次性填充:

1  string[,]data= new string[rowCount, colCount];
2   //...为data赋值
3   Excel.Range range;
4   range = worksheet.get_Range("A1", "C5"));
5   range.Formula = data;

 

1.2.读取,与写入类似,不要再单个单元格读取,可以用以下方式,注意null值:

1   object[,]data= new object[rowCount, colCount];
2   Excel.Range range;
3   range = worksheet.get_Range("A1", "C5"));
4   data = range.Value2;
5   //或者
6   data = range.Value;//区别在于value2是针对数字的

 

2.其实问题2好解决,如果涉及到这个范围的时间,加个判断就可以避免。

偷懒的方法也有,直接取Text。用过Excel的都知道,如果一列不够宽,那么内容会以***显示,直接取Text得到的也会是*,可以手动设置列宽,所以这个方法不推荐,不稳当。

1 //直接取Text
2 Excel.Range range;
3 range = worksheet.get_Range("A1", "C5"));
4 //range.ColumnWidth = 20;
5 data = range.Text;

 

3.释放(C#)。  

 1 Excel.Application oXL;
 2 Excel._Workbook oWB;
 3 Excel._Worksheet oSheet;
 4 
 5 GC.Collect();// clean up any other excel guys hangin' around...
 6 
 7 oXL = new Excel.Application();
 8 oWB = (Excel._Workbook)(oXL.Workbooks.Add( Missing.Value ));
 9 oSheet = (Excel._Worksheet)oWB.ActiveSheet;
10 
11 // this part will actually be filling in the values into the sheet
12 fillValues(oSheet);
13 
14 // Need all following code to clean up and extingush all references!!!
15 oWB.Close(null,null,null);
16 oXL.Workbooks.Close();
17 oXL.Quit();
18 
19 System.Runtime.InteropServices.Marshal.ReleaseComObject (oXL);
20 System.Runtime.InteropServices.Marshal.ReleaseComObject (oSheet);
21 System.Runtime.InteropServices.Marshal.ReleaseComObject (oWB);
22 
23 oSheet=null;
24 oWB=null;
25 oXL = null;
26 
27 GC.Collect(); // force final cleanup!

 

转载于:https://www.cnblogs.com/sleekay/archive/2012/07/15/2592350.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值