一、下载引用

下载需要引用的dll,即:NPOI.dll,NPOI.OOXML.dll,NPOI.OpenXml4Net.dll,ICSharpCode.SharpZipLib.dll(office2007版需要此dll)。

二、excel转datatable类

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

三、结果

四、写入excel类

  1. public static bool DataTableToExcel(DataTable dt)
  2. {
  3. bool result = false;
  4. IWorkbook workbook = null;
  5. FileStream fs = null;
  6. IRow row = null;
  7. ISheet sheet = null;
  8. ICell cell = null;
  9. try
  10. {
  11. if (dt != null && dt.Rows.Count > 0)
  12. {
  13. workbook = new HSSFWorkbook();
  14. sheet = workbook.CreateSheet("Sheet0");//创建一个名称为Sheet0的表
  15. int rowCount = dt.Rows.Count;//行数
  16. int columnCount = dt.Columns.Count;//列数
  17. //设置列头
  18. row = sheet.CreateRow(0);//excel第一行设为列头
  19. for (int c = 0; c < columnCount; c++)
  20. {
  21. cell = row.CreateCell(c);
  22. cell.SetCellValue(dt.Columns[c].ColumnName);
  23. }
  24. //设置每行每列的单元格,
  25. for (int i = 0; i <rowCount; i++)
  26. {
  27. row = sheet.CreateRow(i+1);
  28. for (int j = 0; j < columnCount; j++)
  29. {
  30. cell = row.CreateCell(j);//excel第二行开始写入数据
  31. cell.SetCellValue(dt.Rows[i][j].ToString());
  32. }
  33. }
  34. using (fs = File.OpenWrite(@"D:/myxls.xls"))
  35. {
  36. workbook.Write(fs);//向打开的这个xls文件中写入数据
  37. result = true;
  38. }
  39. }
  40. return result;
  41. }
  42. catch (Exception ex)
  43. {
  44. if (fs != null)
  45. {
  46. fs.Close();
  47. }
  48. return false;
  49. }
  50. }

结果如下:

源码地址:http://download.csdn.net/detail/coderk2014/9328779

C#中NPOI操作excel之读取和写入excel数据的更多相关文章

  1. C#中创建、打开、读取、写入、保存Excel的一般性代码

    ---转载:http://hi.baidu.com/zhaocbo/item/e840bcf941932d15fe358228 1. Excel对象微软的Excel对象模型包括了128个不同的对象,从 ...

  2. Java使用POI读取和写入Excel指南

    Java使用POI读取和写入Excel指南 做项目时经常有通过程序读取Excel数据,或是创建新的Excel并写入数据的需求: 网上很多经验教程里使用的POI版本都比较老了,一些API在新版里已经废弃 ...

  3. Java使用POI读取和写入Excel指南(转)

    做项目时经常有通过程序读取Excel数据,或是创建新的Excel并写入数据的需求: 网上很多经验教程里使用的POI版本都比较老了,一些API在新版里已经废弃,这里基于最新的Apache POI 4.0 ...

  4. C#中npoi操作Excel[版本2.0.1读写2003、2007格式]

    下载npoi2.0.1dll文件:http://download.csdn.net/detail/pukuimin1226/5851747 public static void test1()     ...

  5. 一个I/O线程可以并发处理N个客户端连接和读写操作 I/O复用模型 基于Buf操作NIO可以读取任意位置的数据 Channel中读取数据到Buffer中或将数据 Buffer 中写入到 Channel 事件驱动消息通知观察者模式

    Tomcat那些事儿 https://mp.weixin.qq.com/s?__biz=MzI3MTEwODc5Ng==&mid=2650860016&idx=2&sn=549 ...

  6. 读取、写入excel数据

    在实际项目中,不可避免的会操作excel表格.一直以来都是读取excel表格,可今天为了写入excel表格,可是煞费苦心,终于完成,记录下来以便后续使用. 1.读取excel表格的数据 读取excel ...

  7. Java 使用Apache POI读取和写入Excel表格

    1,引入所用的包 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxm ...

  8. Python3 读取和写入excel

    https://blog.csdn.net/weixin_43094965/article/details/82226263一.Excel 1.Excel文件三个对象 workbook: 工作簿,一个 ...

  9. MATLAB读取和写入Excel文件

    1. 读取Excel文件 (a) 命令方式xlsread:  读取命令:[data,text]  = xlsread(FileName, SheetName, Range); data保存的是数据单元 ...

随机推荐

  1. telnet命令的使用方法

    大家都知道,Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式.它为用户提供了在本地计算机上完成远程主机工作的能力.在终端使用者的电脑上使用telnet程 ...

  2. 【CF888E】Maximum Subsequence 折半搜索

    [CF888E]Maximum Subsequence 题意:给你一个序列{ai},让你从中选出一个子序列,使得序列和%m最大. n<=35,m<=10^9 题解:不小心瞟了一眼tag就一 ...

  3. 【转】常用html转义符,JavaScript转义符

    HTML字符实体(Character Entities),转义字符串(Escape Sequence) 为什么要用转义字符串? HTML中<,>,&等有特殊含义(<,> ...

  4. [分布式系统学习] 6.824 LEC1 MapReduce 笔记

    什么是Map-Reduce呢? Map指的是一个形如下面定义的函数. def Map(k, v): //return [(k1, v1), (k2, v2), (k3, v3), ...] pass ...

  5. PAT-GPLT L2-027 - 名人堂与代金券 - [简单模拟]

    题目链接:https://www.patest.cn/contests/gplt/L2-027 对于在中国大学MOOC(http://www.icourse163.org/)学习“数据结构”课程的学生 ...

  6. 11.23CSS笔记

    每一步的编写过程都在代码里面书写了,暂且记录下来 <!DOCTYPE html> <html lang="en"> <head> <met ...

  7. Crontab '2>&1 &' 含义

    Crontab '2>&1 &' 含义 - dosttyy - 博客园 https://www.cnblogs.com/dosttyy/p/4810026.html

  8. Why should we typedef a struct so often in C? - Stack Overflow

    https://stackoverflow.com/questions/252780/why-should-we-typedef-a-struct-so-often-in-c As Greg Hewg ...

  9. SpringBoot 统一响应格式

    -Spring Boot返回数据及异常统一封装 -企业实战之spring项目<接口响应体格式统一封装> -Spring Boot fastjson替换jackson -java web项目 ...

  10. 【Python接口测试】简单系统登录接口测试实例

    我们可以用Jmeter做接口测试,但是呢个人觉得那个有点局限性,用python就灵活很多, 可以按自己的思路来构建比较灵活,下面给大家介绍一个简单的接口测试实例. 一.我们的思路如下: 首先我们要弄清 ...