C#导入导出与处理Excel文件
2016-11-21 10:44
344 查看
前一段时间接了一个小项目,使用C#写一个Winform客户端。主要功能就是根据客户提供的文件标准,按照一定的规则和算法,转换DBF文件和Excel文件(后缀名xlsx为主)。这个客户端的功能并不复杂,但是细节很多,前前后后从框架到交付大约用了三周的时间。我先阐述使用C#语言处理Excel文件的一些实践结论。
由于我处理的是后缀名为xlsx文件,再次就主讲此类文件了。在Excel文件的输入中,使用的就是度娘一找一大片的OleDB。
OleDB是微软的战略性的通向不同的数据源的低级应用程序接口。支持很多种数据库,此客户端中DBF文件的输入输出也是使用了此数据库API。使用OleDB记得添加上命名空间:
xlsx文件的输入:
xlsx文件的中间处理过程因需求而异,在此不再赘述处理方式。在输入过程中,将文件中的数据转化成了Datatable数据类型的格式,它是一个临时保存数据的网格虚拟表,处理非常方便。
xlsx文件的输出:xlsx文件的输出过程并不是很顺利,先后使用了三种方式。
第一种方式自然就是OleDB了,有始有终嘛。但是真正使用的过程中发现此方式不仅要求程序运行本机必须安装Excel,而且对Excel版本要求非常高,如果删注册表很容易弄巧成拙,我改注册表就直接玩坏了Excel。事实上我们并不能保证客户的机器上一定安装了对应版本的Excel,所以如果使用OleDB输出文件,此客户端的兼容性将非常的低劣。
经过一番沟通和挣扎决定还是换一种方式,决定改用第三方组件。由于JAVA方使用的是POI,所以这边直接使用POI项目的.NET版本,NPOI。网上教程很多,很好实现,但是经过测试之后,此种方式对大文件的输入输出支持的不是很好,处理DEMO文件没有问题,但是换成了真正客户提供的十万行级甚至百万行级的文件,客户端直接在输出的过程中崩掉。
查询资料后,网友们对于大文件都建议使用EPPlus。教程也是一抓一大把,我没有继续加大文件大小测试,不过客户给我们提供的十来个文件全部测试通过,基本上都是百万级以下的。
上代码吧:
由于我处理的是后缀名为xlsx文件,再次就主讲此类文件了。在Excel文件的输入中,使用的就是度娘一找一大片的OleDB。
OleDB是微软的战略性的通向不同的数据源的低级应用程序接口。支持很多种数据库,此客户端中DBF文件的输入输出也是使用了此数据库API。使用OleDB记得添加上命名空间:
using System.Data.OleDb;
xlsx文件的输入:
private void inputXlsx() { string strConn2; string filePath = inPath; FileInfo fileInfo = new FileInfo(filePath); string directory = fileInfo.DirectoryName; strConn2 = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source='{0}';Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;';"; string strConnection = string.Format(strConn2, inPath); OleDbConnection conn = new OleDbConnection(strConnection); try { conn.Open(); String tableName = null; DataTable dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); tableName = dt.Rows[0][2].ToString().Trim(); OleDbDataAdapter oada = new OleDbDataAdapter("select * from [" + tableName + "]", strConnection); oada.Fill(dtOld); conn.Close(); } catch (Exception ex) { conn.Close(); } }
xlsx文件的中间处理过程因需求而异,在此不再赘述处理方式。在输入过程中,将文件中的数据转化成了Datatable数据类型的格式,它是一个临时保存数据的网格虚拟表,处理非常方便。
xlsx文件的输出:xlsx文件的输出过程并不是很顺利,先后使用了三种方式。
第一种方式自然就是OleDB了,有始有终嘛。但是真正使用的过程中发现此方式不仅要求程序运行本机必须安装Excel,而且对Excel版本要求非常高,如果删注册表很容易弄巧成拙,我改注册表就直接玩坏了Excel。事实上我们并不能保证客户的机器上一定安装了对应版本的Excel,所以如果使用OleDB输出文件,此客户端的兼容性将非常的低劣。
经过一番沟通和挣扎决定还是换一种方式,决定改用第三方组件。由于JAVA方使用的是POI,所以这边直接使用POI项目的.NET版本,NPOI。网上教程很多,很好实现,但是经过测试之后,此种方式对大文件的输入输出支持的不是很好,处理DEMO文件没有问题,但是换成了真正客户提供的十万行级甚至百万行级的文件,客户端直接在输出的过程中崩掉。
查询资料后,网友们对于大文件都建议使用EPPlus。教程也是一抓一大把,我没有继续加大文件大小测试,不过客户给我们提供的十来个文件全部测试通过,基本上都是百万级以下的。
上代码吧:
private void outputXlsx() { FileInfo newFile = new FileInfo(dtNew.TableName + ".xlsx"); if (newFile.Exists) { newFile.Delete(); newFile = new FileInfo(dtNew.TableName + ".xlsx"); } using (ExcelPackage package = new ExcelPackage(newFile)) { ExcelWorksheet worksheet = package.Workbook.Worksheets.Add(dtNew.TableName);//创建worksheet for (int m = 0; m < dtNew.Columns.Count; m++) { worksheet.Cells[1, m + 1].Value = dtNew.Columns[m]; } int i = 1; foreach (DataRow dr in dtNew.Rows) { for (int j = 0; j < dtNew.Columns.Count; j++) { worksheet.Cells[i + 1, j + 1].Value = dr[j]; } i++; } package.Save();//保存excel } }
相关文章推荐
- (C#)利用Aspose.Cells组件导入导出excel文件
- NPOI 操作数据库中数据的导入导出(Excel.xls文件) 和null数据的处理。
- 用NODEJS处理EXCEL文件导入导出
- 用C#.net编写导入导出EXCEL文件的代码。编绎运行后,错误提示: 找不到可安装的ISAM
- C# 导入导出excel文件案例
- c# .Net :Excel NPOI导入导出操作教程之数据库表信息数据导出到一个Excel文件并写到磁盘示例分享
- c# Winform程序实现多sheet的Excel文件导入与导出
- c#操作excel全攻略(导入导出) excel表增删改 以及常见问题的处理
- C# Excel导入导出数据(二)——客户端上传文件到服务器
- C#语言的Excel文件导入导出
- C#之Excel文件导入导出
- C#之Excel文件导入导出
- 用NODEJS处理EXCEL文件导入导出,文件上传
- C#导入导出EXCEL文件的代码实例
- C#,Excel数据的导入、处理、导出
- C# 导出excel文件处理科学计数法办法
- C# .Net :Excel NPOI导入导出操作教程之将Excel文件读取并写到数据库表,示例分享
- c# .Net :Excel NPOI导入导出操作教程之List集合的数据写到一个Excel文件并导出
- [Excel] CsvHelper---C#关于CSV文件的导入和导出以及转化 (转载)
- 用NODEJS处理EXCEL文件导入导出,文件上传