文档章节

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

KavenSu
 KavenSu
发布于 2014/07/30 00:00
字数 733
阅读 1967
收藏 5

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

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

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

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.         //表头  

  16.         IRow header = sheet.GetRow(sheet.FirstRowNum);  

  17.         List<int> columns = new List<int>();  

  18.         for (int i = 0; i < header.LastCellNum; i++)  

  19.         {  

  20.             object obj = GetValueTypeForXLS(header.GetCell(i) as XLS.HSSFCell);  

  21.             if (obj == null || obj.ToString() == string.Empty)  

  22.             {  

  23.                 dt.Columns.Add(new DataColumn("Columns" + i.ToString()));  

  24.                 //continue;  

  25.             }  

  26.             else  

  27.                 dt.Columns.Add(new DataColumn(obj.ToString()));  

  28.             columns.Add(i);  

  29.         }  

  30.         //数据  

  31.         for (int i = sheet.FirstRowNum + 1; i <= sheet.LastRowNum; i++)  

  32.         {  

  33.             DataRow dr = dt.NewRow();  

  34.             bool hasValue = false;  

  35.             foreach (int j in columns)  

  36.             {  

  37.                 dr[j] = GetValueTypeForXLS(sheet.GetRow(i).GetCell(j) as XLS.HSSFCell);  

  38.                 if (dr[j] != null && dr[j].ToString() != string.Empty)  

  39.                 {  

  40.                     hasValue = true;  

  41.                 }  

  42.             }  

  43.             if (hasValue)  

  44.             {  

  45.                 dt.Rows.Add(dr);  

  46.             }  

  47.         }  

  48.     }  

  49.     return dt;  

  50. }  

  51.   

  52. /// <summary>  

  53. /// 将DataTable数据导出到Excel文件中(xls)  

  54. /// </summary>  

  55. /// <param name="dt"></param>  

  56. /// <param name="file"></param>  

  57. public static void TableToExcelForXLS(DataTable dt, string file)  

  58. {  

  59.     XLS.HSSFWorkbook hssfworkbook = new XLS.HSSFWorkbook();  

  60.     ISheet sheet = hssfworkbook.CreateSheet("Test");  

  61.   

  62.     //表头  

  63.     IRow row = sheet.CreateRow(0);  

  64.     for (int i = 0; i < dt.Columns.Count; i++)  

  65.     {  

  66.         ICell cell = row.CreateCell(i);  

  67.         cell.SetCellValue(dt.Columns[i].ColumnName);  

  68.     }  

  69.   

  70.     //数据  

  71.     for (int i = 0; i < dt.Rows.Count; i++)  

  72.     {  

  73.         IRow row1 = sheet.CreateRow(i + 1);  

  74.         for (int j = 0; j < dt.Columns.Count; j++)  

  75.         {  

  76.             ICell cell = row1.CreateCell(j);  

  77.             cell.SetCellValue(dt.Rows[i][j].ToString());  

  78.         }  

  79.     }  

  80.   

  81.     //转为字节数组  

  82.     MemoryStream stream = new MemoryStream();  

  83.     hssfworkbook.Write(stream);  

  84.     var buf = stream.ToArray();  

  85.   

  86.     //保存为Excel文件  

  87.     using (FileStream fs = new FileStream(file, FileMode.Create, FileAccess.Write))  

  88.     {  

  89.         fs.Write(buf, 0, buf.Length);  

  90.         fs.Flush();  

  91.     }  

  92. }  

  93.   

  94. /// <summary>  

  95. /// 获取单元格类型(xls)  

  96. /// </summary>  

  97. /// <param name="cell"></param>  

  98. /// <returns></returns>  

  99. private static object GetValueTypeForXLS(XLS.HSSFCell cell)  

  100. {  

  101.     if (cell == null)  

  102.         return null;  

  103.     switch (cell.CellType)  

  104.     {  

  105.         case CellType.BLANK: //BLANK:  

  106.             return null;  

  107.         case CellType.BOOLEAN: //BOOLEAN:  

  108.             return cell.BooleanCellValue;  

  109.         case CellType.NUMERIC: //NUMERIC:  

  110.             return cell.NumericCellValue;  

  111.         case CellType.STRING: //STRING:  

  112.             return cell.StringCellValue;  

  113.         case CellType.ERROR: //ERROR:  

  114.             return cell.ErrorCellValue;  

  115.         case CellType.FORMULA: //FORMULA:  

  116.         default:  

  117.             return "=" + cell.CellFormula;  

  118.     }  

  119. }  

  120. #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.         //表头  

  16.         IRow header = sheet.GetRow(sheet.FirstRowNum);  

  17.         List<int> columns = new List<int>();  

  18.         for (int i = 0; i < header.LastCellNum; i++)  

  19.         {  

  20.             object obj = GetValueTypeForXLSX(header.GetCell(i) as XSSFCell);  

  21.             if (obj == null || obj.ToString() == string.Empty)  

  22.             {  

  23.                 dt.Columns.Add(new DataColumn("Columns" + i.ToString()));  

  24.                 //continue;  

  25.             }  

  26.             else  

  27.                 dt.Columns.Add(new DataColumn(obj.ToString()));  

  28.             columns.Add(i);  

  29.         }  

  30.         //数据  

  31.         for (int i = sheet.FirstRowNum + 1; i <= sheet.LastRowNum; i++)  

  32.         {  

  33.             DataRow dr = dt.NewRow();  

  34.             bool hasValue = false;  

  35.             foreach (int j in columns)  

  36.             {  

  37.                 dr[j] = GetValueTypeForXLSX(sheet.GetRow(i).GetCell(j) as XSSFCell);  

  38.                 if (dr[j] != null && dr[j].ToString() != string.Empty)  

  39.                 {  

  40.                     hasValue = true;  

  41.                 }  

  42.             }  

  43.             if (hasValue)  

  44.             {  

  45.                 dt.Rows.Add(dr);  

  46.             }  

  47.         }  

  48.     }  

  49.     return dt;  

  50. }  

  51.   

  52. /// <summary>  

  53. /// 将DataTable数据导出到Excel文件中(xlsx)  

  54. /// </summary>  

  55. /// <param name="dt"></param>  

  56. /// <param name="file"></param>  

  57. public static void TableToExcelForXLSX(DataTable dt, string file)  

  58. {  

  59.     XSSFWorkbook xssfworkbook = new XSSFWorkbook();  

  60.     ISheet sheet = xssfworkbook.CreateSheet("Test");  

  61.   

  62.     //表头  

  63.     IRow row = sheet.CreateRow(0);  

  64.     for (int i = 0; i < dt.Columns.Count; i++)  

  65.     {  

  66.         ICell cell = row.CreateCell(i);  

  67.         cell.SetCellValue(dt.Columns[i].ColumnName);  

  68.     }  

  69.   

  70.     //数据  

  71.     for (int i = 0; i < dt.Rows.Count; i++)  

  72.     {  

  73.         IRow row1 = sheet.CreateRow(i + 1);  

  74.         for (int j = 0; j < dt.Columns.Count; j++)  

  75.         {  

  76.             ICell cell = row1.CreateCell(j);  

  77.             cell.SetCellValue(dt.Rows[i][j].ToString());  

  78.         }  

  79.     }  

  80.   

  81.     //转为字节数组  

  82.     MemoryStream stream = new MemoryStream();  

  83.     xssfworkbook.Write(stream);  

  84.     var buf = stream.ToArray();  

  85.   

  86.     //保存为Excel文件  

  87.     using (FileStream fs = new FileStream(file, FileMode.Create, FileAccess.Write))  

  88.     {  

  89.         fs.Write(buf, 0, buf.Length);  

  90.         fs.Flush();  

  91.     }  

  92. }  

  93.   

  94. /// <summary>  

  95. /// 获取单元格类型(xlsx)  

  96. /// </summary>  

  97. /// <param name="cell"></param>  

  98. /// <returns></returns>  

  99. private static object GetValueTypeForXLSX(XSSFCell cell)  

  100. {  

  101.     if (cell == null)  

  102.         return null;  

  103.     switch (cell.CellType)  

  104.     {  

  105.         case CellType.BLANK: //BLANK:  

  106.             return null;  

  107.         case CellType.BOOLEAN: //BOOLEAN:  

  108.             return cell.BooleanCellValue;  

  109.         case CellType.NUMERIC: //NUMERIC:  

  110.             return cell.NumericCellValue;  

  111.         case CellType.STRING: //STRING:  

  112.             return cell.StringCellValue;  

  113.         case CellType.ERROR: //ERROR:  

  114.             return cell.ErrorCellValue;  

  115.         case CellType.FORMULA: //FORMULA:  

  116.         default:  

  117.             return "=" + cell.CellFormula;  

  118.     }  

  119. }  


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

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

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


本文转载自:

KavenSu
粉丝 6
博文 66
码字总数 16605
作品 0
深圳
私信 提问
【C#常用方法】2.DataTable(或DataSet)与Excel文件之间的导出与导入(使用NPOI)

DataTable与Excel之间的互导 1.项目添加NPOI的引用  NPOI项目简介:   NPOI是一个开源的C#读写Excel、WORD等微软OLE2组件文档的项目,特点是可以在没有安装Office的情况下对Word或Excel文...

裤兜
11/04
0
0
PythonSNs(5)---20行代码爬取斗鱼平台房间数据(下)

在上一篇中,已经详细的讲解了如何获取数据,接下来是深度处理数据,这里调用库来制作Excel表格。 工具:Python3.6.5,Pycharm 1.模块介绍 XlsxWriter模块具有的功能: 100%兼容Excel的*.xls...

Mr_Wanggq
2018/05/23
0
0
Python---20行代码爬取斗鱼平台房间数据(下)

在上一篇中,已经详细的讲解了如何获取数据,接下来是深度处理数据,这里调用库来制作Excel表格。 工具:Python3.6.5,Pycharm 1.模块介绍 XlsxWriter模块具有的功能: 100%兼容Excel的*.xls...

wayne_dream
2018/05/23
0
0
POI - 读取Excel2003、Excel2007或更高级的兼容性问题

我们使用POI中的HSSFWorkbook来读取Excel数据。 上边代码,读取Excel2003(xls)的文件没问题,但是一旦读取的是Excel2007(xlsx)的文件,就会报异常:“The supplied data appears to be i...

技术小美
2017/11/14
0
0
Apache Poi获取各类文档内容。

poi版本3.9 操作之前获取文件输入流对象 1.获取word2003及以前版本内容。 2.获取word2007内容。 3.获取excel2003及以前版本内容。 4.获取excel2007内容。 5.获取ppt文件内容。 6. 获取pdf文件...

Jialy
2013/04/03
297
5

没有更多内容

加载失败,请刷新页面

加载更多

如何管stderr,而不是stdout?

我有一个要写入信息的程序stdout和stderr ,我需要grep通过什么是未来标准错误 ,而忽视标准输出 。 我当然可以分2步完成: command > /dev/null 2> temp.filegrep 'something' temp.file...

技术盛宴
27分钟前
5
0
centos7.5上通过docker安装并运行mysql5.7

1. docker pull mysql:5.7 2. docker run --name mysql5.7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7...

Ryub
30分钟前
6
0
什么是比赛条件?

在编写多线程应用程序时,遇到的最常见问题之一是竞争条件。 我对社区的问题是: 什么是比赛条件? 您如何检测到它们? 您如何处理它们? 最后,如何防止它们发生? #1楼 当设备或系统试图同...

javail
42分钟前
6
0
SpringMVC源码分析-DispatcherServlet-init方法分析

上一篇:SpringMVC源码分析-DispatcherServlet实例化干了些什么 先吐槽一下。。。写了两小时的博客突然被俺家小屁孩按了刷新,东西不见了,建议OSCHINA能够自动定时保存啊。让我先安静一下。...

特拉仔
49分钟前
7
0
python协程 生成器

协程,又称微线程,纤程。英文名Coroutine。 线程是系统级别的它们由操作系统调度,而协程则是程序级别的由程序根据需要自己调度。在一个线程中会有很多函数,我们把这些函数称为子程序,在子...

沙门行道
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部