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:
这种方式很慢,当你有上完条数据的时候会慢到令人发指的地步。
可以先把你要写入的数据存到一个二维数组,然后一次性填充:
1.2.读取,与写入类似,不要再单个单元格读取,可以用以下方式,注意null值:
2.其实问题2好解决,如果涉及到这个范围的时间,加个判断就可以避免。
偷懒的方法也有,直接取Text。用过Excel的都知道,如果一列不够宽,那么内容会以***显示,直接取Text得到的也会是*,可以手动设置列宽,所以这个方法不推荐,不稳当。
3.释放(C#)。
效率问题:一般用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!
相关文章推荐
- .net操作Excel出错解决
- 引用 Delphi操作EXCEL
- DELPHI文件操作建议(reset打开只读文件处理)
- delphi操作Excel
- .net对excel的操作
- 给 .net C# 初学者几点建议
- .net操作EXCEL
- .Net操作excel(使用NPOI)
- .NET平台下的Excel编程|C#操作Excel|Application和ApplicationClass的联系和区别
- 使用开源免费类库在.net中操作Excel
- 税务催缴催报信息打印程序开发-Delphi读取Excel文件及操作
- .net操作excel
- delphi 操作 EXcel
- Delphi操作Excel的方法详解
- delphi下excel的操作
- 给从pb到.net 的人的几点建议
- 操作excel需要注意几点
- Delphi对Excel的所有操作
- Delphi通过VBA操作Excel的两个问题
- Delphi关于Excel的操作