DataTable与Excel之间的互导

1.项目添加NPOI的引用 


  • NPOI项目简介:
  NPOI是一个开源的C#读写Excel、WORD等微软OLE2组件文档的项目,特点是可以在没有安装Office的情况下对Word或Excel文档进行读写操作。并且对老版本Office(2003-)与新版本Office(2007+)均有较好的支持。NPOI功能非常强大,可以操作Excel或Word文档的各个细节,如果你对NPOI想进行细致的学习,淘宝上有专门有书来讲NPOI,当然也可以访问NPOI的官方网站查看他们的文档与Demo。
  • 关于Excel扩展名.xls与.xlsx简介:
  .xls是Excel2003及以前的版本所保存的文件格式,老版本及新版本的Excel对其均可兼容,.xlsx是Excel2007及以后的Excel版本所默认保存的文件格式,这种格式只能被Excel2007及以后的版本所兼容,老版本Excel无法打开。
  • NPOI项目的引用:

  使用VisualStudio,打开NuGet包管理器,搜索NPOI,并添加到当前项目。

  

2.将Excel文件导入到DataSet(DataTable)中


  因为一个Excel文件可以有多个sheet页,所以C#方法最好使用与Excel文档结构相对应的DataSet类,即将DataSet(可以包含多个DataTable)导出为Excel,DataSet中的每个DataTabel对应一个Excel中的Sheet页。

  

  方法解释:此方法将一个Excel文件导入为一个DataSet,Excel中每个Sheet页都会生成一个DataTable存放在导入的DataSet中,并且每个DataTable的TableName与每个Sheet的SheetName一一对应。参数isFirstLineColumnName用来表示Excel文件各表第一行是否为表头。

  代码如下:

  1. /// <summary>
  2. /// 读取Execl数据到DataTable(DataSet)中
  3. /// </summary>
  4. /// <param name="filePath">指定Execl文件路径</param>
  5. /// <param name="isFirstLineColumnName">设置第一行是否是列名</param>
  6. /// <returns>返回一个DataTable数据集</returns>
  7. public static DataSet ExcelToDataSet(string filePath, bool isFirstLineColumnName)
  8. {
  9. DataSet dataSet = new DataSet();
  10. int startRow = ;
  11. try
  12. {
  13. using (FileStream fs = File.OpenRead(filePath))
  14. {
  15. IWorkbook workbook = null;
  16. // 如果是2007+的Excel版本
  17. if (filePath.IndexOf(".xlsx") > )
  18. {
  19. workbook = new XSSFWorkbook(fs);
  20. }
  21. // 如果是2003-的Excel版本
  22. else if (filePath.IndexOf(".xls") > )
  23. {
  24. workbook = new HSSFWorkbook(fs);
  25. }
  26. if (workbook != null)
  27. {
  28. //循环读取Excel的每个sheet,每个sheet页都转换为一个DataTable,并放在DataSet中
  29. for (int p = ; p < workbook.NumberOfSheets; p++)
  30. {
  31. ISheet sheet = workbook.GetSheetAt(p);
  32. DataTable dataTable = new DataTable();
  33. dataTable.TableName = sheet.SheetName;
  34. if (sheet != null)
  35. {
  36. int rowCount = sheet.LastRowNum;//获取总行数
  37. if (rowCount > )
  38. {
  39. IRow firstRow = sheet.GetRow();//获取第一行
  40. int cellCount = firstRow.LastCellNum;//获取总列数
  41.  
  42. //构建datatable的列
  43. if (isFirstLineColumnName)
  44. {
  45. startRow = ;//如果第一行是列名,则从第二行开始读取
  46. for (int i = firstRow.FirstCellNum; i < cellCount; ++i)
  47. {
  48. ICell cell = firstRow.GetCell(i);
  49. if (cell != null)
  50. {
  51. if (cell.StringCellValue != null)
  52. {
  53. DataColumn column = new DataColumn(cell.StringCellValue);
  54. dataTable.Columns.Add(column);
  55. }
  56. }
  57. }
  58. }
  59. else
  60. {
  61. for (int i = firstRow.FirstCellNum; i < cellCount; ++i)
  62. {
  63. DataColumn column = new DataColumn("column" + (i + ));
  64. dataTable.Columns.Add(column);
  65. }
  66. }
  67.  
  68. //填充行
  69. for (int i = startRow; i <= rowCount; ++i)
  70. {
  71. IRow row = sheet.GetRow(i);
  72. if (row == null) continue;
  73.  
  74. DataRow dataRow = dataTable.NewRow();
  75. for (int j = row.FirstCellNum; j < cellCount; ++j)
  76. {
  77. ICell cell = row.GetCell(j);
  78. if (cell == null)
  79. {
  80. dataRow[j] = "";
  81. }
  82. else
  83. {
  84. //CellType(Unknown = -1,Numeric = 0,String = 1,Formula = 2,Blank = 3,Boolean = 4,Error = 5,)
  85. switch (cell.CellType)
  86. {
  87. case CellType.Blank:
  88. dataRow[j] = "";
  89. break;
  90. case CellType.Numeric:
  91. short format = cell.CellStyle.DataFormat;
  92. //对时间格式(2015.12.5、2015/12/5、2015-12-5等)的处理
  93. if (format == || format == || format == || format == )
  94. dataRow[j] = cell.DateCellValue;
  95. else
  96. dataRow[j] = cell.NumericCellValue;
  97. break;
  98. case CellType.String:
  99. dataRow[j] = cell.StringCellValue;
  100. break;
  101. }
  102. }
  103. }
  104. dataTable.Rows.Add(dataRow);
  105. }
  106. }
  107. }
  108. dataSet.Tables.Add(dataTable);
  109. }
  110.  
  111. }
  112. }
  113. return dataSet;
  114. }
  115. catch (Exception)
  116. {
  117. return null;
  118. }
  119. }

3.将DataSet(DataTable)导出为一个Excel文件


  代码解释:我们可以将要导出的DataTable都放入一个DataSet中,将DataSet导出为Excel文件,方法参数OutPath用来传入导出Excel文件的路径,路径可以加Excel的扩展名(.xls或.xlsx),也可以不加,不加默认导出Excel文件扩展名为.xls。  

  1. /// <summary>
  2. /// 将DataTable(DataSet)导出到Execl文档
  3. /// </summary>
  4. /// <param name="dataSet">传入一个DataSet</param>
  5. /// <param name="Outpath">导出路径(可以不加扩展名,不加默认为.xls)</param>
  6. /// <returns>返回一个Bool类型的值,表示是否导出成功</returns>
  7. /// True表示导出成功,Flase表示导出失败
  8. public static bool DataTableToExcel(DataSet dataSet, string Outpath)
  9. {
  10. bool result = false;
  11. try
  12. {
  13. if (dataSet == null || dataSet.Tables == null || dataSet.Tables.Count == || string.IsNullOrEmpty(Outpath))
  14. throw new Exception("输入的DataSet或路径异常");
  15. int sheetIndex = ;
  16. //根据输出路径的扩展名判断workbook的实例类型
  17. IWorkbook workbook = null;
  18. string pathExtensionName = Outpath.Trim().Substring(Outpath.Length - );
  19. if (pathExtensionName.Contains(".xlsx"))
  20. {
  21. workbook = new XSSFWorkbook();
  22. }
  23. else if(pathExtensionName.Contains(".xls"))
  24. {
  25. workbook = new HSSFWorkbook();
  26. }
  27. else
  28. {
  29. Outpath = Outpath.Trim() + ".xls";
  30. workbook = new HSSFWorkbook();
  31. }
  32. //将DataSet导出为Excel
  33. foreach (DataTable dt in dataSet.Tables)
  34. {
  35. sheetIndex++;
  36. if (dt != null && dt.Rows.Count > )
  37. {
  38. ISheet sheet = workbook.CreateSheet(string.IsNullOrEmpty(dt.TableName) ? ("sheet" + sheetIndex) : dt.TableName);//创建一个名称为Sheet0的表
  39. int rowCount = dt.Rows.Count;//行数
  40. int columnCount = dt.Columns.Count;//列数
  41.  
  42. //设置列头
  43. IRow row = sheet.CreateRow();//excel第一行设为列头
  44. for (int c = ; c < columnCount; c++)
  45. {
  46. ICell cell = row.CreateCell(c);
  47. cell.SetCellValue(dt.Columns[c].ColumnName);
  48. }
  49.  
  50. //设置每行每列的单元格,
  51. for (int i = ; i < rowCount; i++)
  52. {
  53. row = sheet.CreateRow(i + );
  54. for (int j = ; j < columnCount; j++)
  55. {
  56. ICell cell = row.CreateCell(j);//excel第二行开始写入数据
  57. cell.SetCellValue(dt.Rows[i][j].ToString());
  58. }
  59. }
  60. }
  61. }
  62. //向outPath输出数据
  63. using (FileStream fs = File.OpenWrite(Outpath))
  64. {
  65. workbook.Write(fs);//向打开的这个xls文件中写入数据
  66. result = true;
  67. }
  68. return result;
  69. }
  70. catch (Exception ex)
  71. {
  72. return false;
  73. }
  74. }
  75. }

4.上面两个方法的使用方法 


  将上面两个方法都定义在ExcelHelper类中,使用如下代码使用:

  1. DataSet set = ExcelHelper.ExcelToDataTable("test.xlsx", true);//Excel导入
  2. bool b = ExcelHelper.DataTableToExcel(set, "test2.xlsx");//导出Excel

【C#常用方法】2.DataTable(或DataSet)与Excel文件之间的导出与导入(使用NPOI)的更多相关文章

  1. java使用POI操作excel文件,实现批量导出,和导入

    一.POI的定义 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel.而poi可以操作Exc ...

  2. csv,txt,excel文件之间的转换,perl脚本

    最近接触一些需要csv,txt,excel文件之间的转换,根据一些网上搜索加上自己的改动,实现自己想要的结果为主要目的,代码的出处已经找不到了,还请见谅,以下主要是针对csv&excel 和t ...

  3. MATLAB导入txt和excel文件技巧汇总:批量导入、单个导入

    在使用MATLAB的时候,想必各位一定会遇到导入数据的问题.如果需要导入的数据其数据量巨大的话,那么在MATLAB编辑器中将这些数据复制粘贴进来,显然会在编辑器中占据巨大的篇幅,这是不明智的. 一般来 ...

  4. 将mysql数据库数据以Excel文件的形式导出

    最近在工作中,领导让从数据库中导出一些数据并存放到Excel表格中,网上有许多教程,下面是我总结的其中俩种方法. 从数据库管理工具中导出(navicat) 在navicat导出数据导Excel中还是比 ...

  5. JS前端创建CSV或Excel文件并浏览器导出下载

    长期以来,在做文件下载功能的时候都是前端通过ajax把需要生成的文件的内容参数传递给后端,后端通过Java语言将文件生成在服务器,然后返回一个文件下载的连接地址url.前端通过location.hre ...

  6. excel文件使用html导出

    <table><tr><td>1</td></tr><tr><td>2</td></tr>& ...

  7. Excel文件处理Demo

    1.BLL业务逻辑代码 /// <summary> /// 处理“店铺竞品销售数据”导入文件 /// </summary> /// <param name="f ...

  8. .Net应用导入、导出Excel文件

    本次阐述的导入和导出都围绕此Demo进行

  9. C# excel文件导入导出

    欢迎关注微信公众号 C#编程大全 这里有更多入门级实例帮你快速成长 在C#交流群里,看到很多小伙伴在excel数据导入导出到C#界面上存在疑惑,所以今天专门做了这个主题,希望大家有所收获! 环境:wi ...

随机推荐

  1. X264-libx264编码库

    X264编码库libx264实现真正的视频编解码,该编解码算法是基于块的混合编码技术,即帧内/帧间预测,然后对预测值变换.量化,最后熵编码所得. 编码帧的类型分为I帧(x264_type_i).P帧( ...

  2. jmeter中websocket接口测试

    一.Websocket协议简介 Websocket是一个持久化的协议,相对于HTTP这种非持久的协议来说: HTTP协议: HTTP的生命周期通过 Request 来界定,也就是一个 Request  ...

  3. Python从零开始——模块与包

    一:Python模块知识概览 二:Python模块的定义与引入 三:模块的搜素与命名空间 四:深入模块 五:模块管理——包的定义与引入

  4. vim 自定义设置格式

    在centos 6.9 或 7.3 环境下 可以在自己账户的主目录下新建一个.vimrc 的文件,放入一下代码: syntax on "即设置语法检测,当编辑C或者Shell脚本时,关键字会 ...

  5. kali下ll命令无法使用

    重装了系统之后,使用ll命令竟然发现报错了. bash: ll:未找到命令   果断解决一波: vim ~/.bashrc   将alias ll=’ls -l‘前面的注释符号#删掉 运行   问题完 ...

  6. springboot整合邮件

    一.邮件相关知识补充 SMTP(Simple Mail Transfer Protocol) 即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式.SMTP协议属 ...

  7. CF261E Maxim and Calculator

    CF261E Maxim and Calculator 洛谷评测传送门 题目描述 Maxim has got a calculator. The calculator has two integer ...

  8. 一些开源cdc框架以及工具

    以下是一些cdc工具,没有包含商业软件的 zendesk maxwell 参考地址 https://github.com/zendesk/maxwell 功能 mysql 2 json 的kafaa ...

  9. [LeetCode] 880. Decoded String at Index 在位置坐标处解码字符串

    An encoded string S is given.  To find and write the decoded string to a tape, the encoded string is ...

  10. thinkphp5.0学习(九):TP5.0视图和模板

    原文地址:http://blog.csdn.net/fight_tianer/article/details/78602711 一.视图 1.加载页面 1.继承系统控制器类 return $this- ...