您的位置:首页 > 编程语言 > Delphi

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

2012-07-15 15:15 411 查看
先说问题:

效率问题:一般用Excel来操作,大多是要实现导入导出或者生成报表的功能,必然会遇到大数据量的情况,如何快速将数据导入到数据库中呢,比如1万条数据,客户能接受的时间范围是多少。如何在传统方式下提速。

Excel1900时间系统的Bug,坑死爹不偿命:excel1900的时间系统有问题,因为它把1900-2-29当成了有效时间,根据闰年算法,能被四整除但是不能被100整除的才是闰年,所以没有1900-2-29这一天存在。问题导致在1900-1-1至1900-2-28中取出的时间都会比实际少一天。如1900-1-1会变成1899-12-31.

释放资源

至于一般操作,具体参见/article/5787434.html。不再赘述。

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

1.效率:

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

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


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

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

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


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

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


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

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

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


3.释放(C#)。  

Excel.Application oXL;
Excel._Workbook oWB;
Excel._Worksheet oSheet;

GC.Collect();// clean up any other excel guys hangin' around...

oXL = new Excel.Application();
oWB = (Excel._Workbook)(oXL.Workbooks.Add( Missing.Value ));
oSheet = (Excel._Worksheet)oWB.ActiveSheet;

// this part will actually be filling in the values into the sheet
fillValues(oSheet);

// Need all following code to clean up and extingush all references!!!
oWB.Close(null,null,null);
oXL.Workbooks.Close();
oXL.Quit();

System.Runtime.InteropServices.Marshal.ReleaseComObject (oXL);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oSheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oWB);

oSheet=null;
oWB=null;
oXL = null;

GC.Collect(); // force final cleanup!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: