在C#中使用NPOI2.0操作Excel2003和Excel2007

http://blog.csdn.net/halym/article/details/9235823

Excel2003:

[csharp] view plaincopy

  1. #region Excel2003
  2. /// <summary>
  3. /// 将Excel文件中的数据读出到DataTable中(xls)
  4. /// </summary>
  5. /// <param name="file"></param>
  6. /// <returns></returns>
  7. public static DataTable ExcelToTableForXLS(string file)
  8. {
  9. DataTable dt = new DataTable();
  10. using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read))
  11. {
  12. XLS.HSSFWorkbook hssfworkbook = new XLS.HSSFWorkbook(fs);
  13. ISheet sheet = hssfworkbook.GetSheetAt(0);
  14. //表头
  15. IRow header = sheet.GetRow(sheet.FirstRowNum);
  16. List<int> columns = new List<int>();
  17. for (int i = 0; i < header.LastCellNum; i++)
  18. {
  19. object obj = GetValueTypeForXLS(header.GetCell(i) as XLS.HSSFCell);
  20. if (obj == null || obj.ToString() == string.Empty)
  21. {
  22. dt.Columns.Add(new DataColumn("Columns" + i.ToString()));
  23. //continue;
  24. }
  25. else
  26. dt.Columns.Add(new DataColumn(obj.ToString()));
  27. columns.Add(i);
  28. }
  29. //数据
  30. for (int i = sheet.FirstRowNum + 1; i <= sheet.LastRowNum; i++)
  31. {
  32. DataRow dr = dt.NewRow();
  33. bool hasValue = false;
  34. foreach (int j in columns)
  35. {
  36. dr[j] = GetValueTypeForXLS(sheet.GetRow(i).GetCell(j) as XLS.HSSFCell);
  37. if (dr[j] != null && dr[j].ToString() != string.Empty)
  38. {
  39. hasValue = true;
  40. }
  41. }
  42. if (hasValue)
  43. {
  44. dt.Rows.Add(dr);
  45. }
  46. }
  47. }
  48. return dt;
  49. }
  50. /// <summary>
  51. /// 将DataTable数据导出到Excel文件中(xls)
  52. /// </summary>
  53. /// <param name="dt"></param>
  54. /// <param name="file"></param>
  55. public static void TableToExcelForXLS(DataTable dt, string file)
  56. {
  57. XLS.HSSFWorkbook hssfworkbook = new XLS.HSSFWorkbook();
  58. ISheet sheet = hssfworkbook.CreateSheet("Test");
  59. //表头
  60. IRow row = sheet.CreateRow(0);
  61. for (int i = 0; i < dt.Columns.Count; i++)
  62. {
  63. ICell cell = row.CreateCell(i);
  64. cell.SetCellValue(dt.Columns[i].ColumnName);
  65. }
  66. //数据
  67. for (int i = 0; i < dt.Rows.Count; i++)
  68. {
  69. IRow row1 = sheet.CreateRow(i + 1);
  70. for (int j = 0; j < dt.Columns.Count; j++)
  71. {
  72. ICell cell = row1.CreateCell(j);
  73. cell.SetCellValue(dt.Rows[i][j].ToString());
  74. }
  75. }
  76. //转为字节数组
  77. MemoryStream stream = new MemoryStream();
  78. hssfworkbook.Write(stream);
  79. var buf = stream.ToArray();
  80. //保存为Excel文件
  81. using (FileStream fs = new FileStream(file, FileMode.Create, FileAccess.Write))
  82. {
  83. fs.Write(buf, 0, buf.Length);
  84. fs.Flush();
  85. }
  86. }
  87. /// <summary>
  88. /// 获取单元格类型(xls)
  89. /// </summary>
  90. /// <param name="cell"></param>
  91. /// <returns></returns>
  92. private static object GetValueTypeForXLS(XLS.HSSFCell cell)
  93. {
  94. if (cell == null)
  95. return null;
  96. switch (cell.CellType)
  97. {
  98. case CellType.BLANK: //BLANK:
  99. return null;
  100. case CellType.BOOLEAN: //BOOLEAN:
  101. return cell.BooleanCellValue;
  102. case CellType.NUMERIC: //NUMERIC:
  103. return cell.NumericCellValue;
  104. case CellType.STRING: //STRING:
  105. return cell.StringCellValue;
  106. case CellType.ERROR: //ERROR:
  107. return cell.ErrorCellValue;
  108. case CellType.FORMULA: //FORMULA:
  109. default:
  110. return "=" + cell.CellFormula;
  111. }
  112. }
  113. #endregion

Excel2007:

[csharp] view plaincopy

  1. #region Excel2007
  2. /// <summary>
  3. /// 将Excel文件中的数据读出到DataTable中(xlsx)
  4. /// </summary>
  5. /// <param name="file"></param>
  6. /// <returns></returns>
  7. public static DataTable ExcelToTableForXLSX(string file)
  8. {
  9. DataTable dt = new DataTable();
  10. using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read))
  11. {
  12. XSSFWorkbook xssfworkbook = new XSSFWorkbook(fs);
  13. ISheet sheet = xssfworkbook.GetSheetAt(0);
  14. //表头
  15. IRow header = sheet.GetRow(sheet.FirstRowNum);
  16. List<int> columns = new List<int>();
  17. for (int i = 0; i < header.LastCellNum; i++)
  18. {
  19. object obj = GetValueTypeForXLSX(header.GetCell(i) as XSSFCell);
  20. if (obj == null || obj.ToString() == string.Empty)
  21. {
  22. dt.Columns.Add(new DataColumn("Columns" + i.ToString()));
  23. //continue;
  24. }
  25. else
  26. dt.Columns.Add(new DataColumn(obj.ToString()));
  27. columns.Add(i);
  28. }
  29. //数据
  30. for (int i = sheet.FirstRowNum + 1; i <= sheet.LastRowNum; i++)
  31. {
  32. DataRow dr = dt.NewRow();
  33. bool hasValue = false;
  34. foreach (int j in columns)
  35. {
  36. dr[j] = GetValueTypeForXLSX(sheet.GetRow(i).GetCell(j) as XSSFCell);
  37. if (dr[j] != null && dr[j].ToString() != string.Empty)
  38. {
  39. hasValue = true;
  40. }
  41. }
  42. if (hasValue)
  43. {
  44. dt.Rows.Add(dr);
  45. }
  46. }
  47. }
  48. return dt;
  49. }
  50. /// <summary>
  51. /// 将DataTable数据导出到Excel文件中(xlsx)
  52. /// </summary>
  53. /// <param name="dt"></param>
  54. /// <param name="file"></param>
  55. public static void TableToExcelForXLSX(DataTable dt, string file)
  56. {
  57. XSSFWorkbook xssfworkbook = new XSSFWorkbook();
  58. ISheet sheet = xssfworkbook.CreateSheet("Test");
  59. //表头
  60. IRow row = sheet.CreateRow(0);
  61. for (int i = 0; i < dt.Columns.Count; i++)
  62. {
  63. ICell cell = row.CreateCell(i);
  64. cell.SetCellValue(dt.Columns[i].ColumnName);
  65. }
  66. //数据
  67. for (int i = 0; i < dt.Rows.Count; i++)
  68. {
  69. IRow row1 = sheet.CreateRow(i + 1);
  70. for (int j = 0; j < dt.Columns.Count; j++)
  71. {
  72. ICell cell = row1.CreateCell(j);
  73. cell.SetCellValue(dt.Rows[i][j].ToString());
  74. }
  75. }
  76. //转为字节数组
  77. MemoryStream stream = new MemoryStream();
  78. xssfworkbook.Write(stream);
  79. var buf = stream.ToArray();
  80. //保存为Excel文件
  81. using (FileStream fs = new FileStream(file, FileMode.Create, FileAccess.Write))
  82. {
  83. fs.Write(buf, 0, buf.Length);
  84. fs.Flush();
  85. }
  86. }
  87. /// <summary>
  88. /// 获取单元格类型(xlsx)
  89. /// </summary>
  90. /// <param name="cell"></param>
  91. /// <returns></returns>
  92. private static object GetValueTypeForXLSX(XSSFCell cell)
  93. {
  94. if (cell == null)
  95. return null;
  96. switch (cell.CellType)
  97. {
  98. case CellType.BLANK: //BLANK:
  99. return null;
  100. case CellType.BOOLEAN: //BOOLEAN:
  101. return cell.BooleanCellValue;
  102. case CellType.NUMERIC: //NUMERIC:
  103. return cell.NumericCellValue;
  104. case CellType.STRING: //STRING:
  105. return cell.StringCellValue;
  106. case CellType.ERROR: //ERROR:
  107. return cell.ErrorCellValue;
  108. case CellType.FORMULA: //FORMULA:
  109. default:
  110. return "=" + cell.CellFormula;
  111. }
  112. }

注意:操作Excel2003与操作Excel2007使用的是不同的命名空间下的内容

使用NPOI.HSSF.UserModel空间下的HSSFWorkbook操作Excel2003

使用NPOI.XSSF.UserModel空间下的XSSFWorkbook操作Excel2007

在C#中使用NPOI2.0操作Excel2003和Excel2007

时间: 2024-12-06 13:40:13

在C#中使用NPOI2.0操作Excel2003和Excel2007的相关文章

使用.NET 4.0+ 操作64位系统中的注册表

一.64位系统中的注册表 以 LocalMachine 中的启动项为例: 64位应用的注册表位置还是在: SOFTWARE\Microsoft\Windows\CurrentVersion\Run 而 32位应用的注册表位置却是在: SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run 二.在.NET4.0以前(不含4.0)操作注册表的方法 RegistryKey hklm = Registry.LocalMachine; Regis

EF5.0中的跨数据库操作

以前在用MVC + EF 的项目中,都是一个数据库,一个DbContext,因此一直没有考虑过在MVC+EF的环境下对于多个数据库的操作问题.等到要使用时,才发现这个问题也不小(关键是有个坑).直接说这个问题的解决流程吧: 1)由以往的经验:在ADO.NET中,要操作多个数据库,那就多写两个SqlHelper吧,或封装下,能动态的修改链接字符串.因此想到在这里能不能建多个ADO.NET实体数据模型呢?于是乎就有了这样两个文件:SealDBModel.edmx及UcmsDBModel.edmx.

Python中列表list常见操作

主要涉及知识点 列表是我们python里面最常见的数据类型,我们主要有以下的操作. 1.索引 2.切片 3.追加 4.删除 5.长度 6.循环 (也称遍历) 7.包含 8.嵌套 例如定义列表: List2=['openstack','python','linux',"docker","zabbix","nginx","linux","linux","123","ww33##&q

Android中SQLite事务的操作

1.创建一个数据库帮助类. package com.wzw.sqllitedemo.db; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; import android.

javascript中对字符串的操作总结

没听过一句话吗?程序员的世界,不处理字符串就是处理数组.这是群里的一位前辈和我说的,显然这和我之前理解的DOM是javascript的核心的不同的,看了几个面试题的内容,感觉前辈说的话非常的有道理,因此总结下,javascript中对字符串的操作. String类型 首先字符串类型是基本类型,但是在这里我们所说的是字符串的对象包装类型.因为只有引用类型才会有属性和方法.实际上每读取一个基本类型的同时都会创建一个对应的基本包装类型,从而让我们能够调用一些方法来操作数据.1.charAt() 和 c

【转】《深入理解计算机系统》C程序中常见的内存操作有关的典型编程错误

原文地址:http://blog.csdn.net/slvher/article/details/9150597 对C/C++程序员来说,内存管理是个不小的挑战,绝对值得慎之又慎,否则让由上万行代码构成的模块跑起来后才出现内存崩溃,是很让人痛苦的.因为崩溃的位置在时间和空间上,通常是在距真正的错误源一段距离之后才表现出来.前几天线上模块因堆内存写越界1个字节引起各种诡异崩溃,定位问题过程中的折腾仍历历在目,今天读到<深入理解计算机系统>第9章-虚拟存储器,发现书中总结了C程序中常见的内存操作有

iOS中对文件的操作

转自:http://marshal.easymorse.com/archives/3340 iOS中对文件的操作 因为应用是在沙箱(sandbox)中的,在文件读写权限上受到限制,只能在几个目录下读写文件: Documents:应用中用户数据可以放在这里,iTunes备份和恢复的时候会包括此目录 tmp:存放临时文件,iTunes不会备份和恢复此目录,此目录下文件可能会在应用退出后删除 Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除 在Do

JavaScript中常见的数组操作函数及用法

昨天写了个帖子,汇总了下常见的JavaScript中的字符串操作函数及用法.今天正好有时间,也去把JavaScript中常见的数组操作函数及用法总结一下,这样方便大家准备参考.如果恰好你也在准备各种笔试,希望对你有所帮助.同时,也欢迎补充. 1.数组创建 创建数组应该是最简单的了,有用数组字面量创建和数组构造函数两种方法,见下: var array1 = new Array(); var array2 = []; 上面是创建数组的最常见的两种方法,其中第二种方法因为简单直观而被开发者推崇.其中,

C 语言中有趣第指针操作(转)

http://blog.csdn.net/ghevinn/article/details/37651149(反汇编题目需要分析) 4.取出内存区域的值 在取某内存地址开始的一个区域的值的时候,取出的值取决于用来取值的类型,譬如int为4个byte,char为1个byte,程序如: void main(){ int a[2] = {261,0}; int *pi = a; char *p = (char*)pi; cout << *(int *)p++ << endl;  //取出p