近期的两个项目都有关于NPOI的功能,经过了一点学习,自己也摸索了一会,感觉还有点意思。现在将部分代码分享一下。一部分是C#代码,一部分是VB.Net的,懒得修改了,基本上都是从项目文件中copy出来的。如果错漏,请指教。

概述:

1、整个Excel表格:WorkBook(工作薄),包含的叫页(工作表):Sheet;行:Row;单元格Cell。

2、NPOI是POI的C#版本,NPOI的行和列的index都是从0开始

3、POI读取Excel有两种格式一个是HSSF,另一个是XSSF。 HSSF和XSSF的区别如下: 
HSSF is the POI Project's pure Java implementation of the Excel '97(-2007) file format. 
XSSF is the POI Project's pure Java implementation of the Excel 2007 OOXML (.xlsx) file format. 
即:HSSF适用2007以前的版本,XSSF适用2007版本及其以上的。

4、NPOI能够在没有安装微软Office的情况下读写Office文件,支持的文件格式包括xls, doc, ppt等。

引用:

Manage NuGet packages -> NPOI

读取excel:

1、Asp.Net使用FileUpload控件上传excel文件(VB.Net代码):

  1. Dim fileOriginalPath As String = excelUploader.PostedFile.FileName
  2. Dim fileName As String = excelUploader.FileName
  3. Dim extension = Path.GetExtension(fileOriginalPath).ToLower()
  4.  
  5. Dim workbook As IWorkbook
  6. If (extension = ".xlsx") Then 'excel 2007
  7. workbook = New XSSFWorkbook(excelUploader.PostedFile.InputStream)
  8. Else 'excel 2003
  9. workbook = New HSSFWorkbook(excelUploader.PostedFile.InputStream)
  10. End If

  2、WPF读取本地excel文件:

  1. using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read))
  2. {
  3. hssfworkbook = new HSSFWorkbook(file);
  4. }
  5.  
  6. //其实HSSFWorkbook/XSSFWorkbook的构造方法可以直接传入FileInfo做参数

  3、WPF读取嵌入在资源文件的excel表格

  1. public XSSFWorkbook ReadDemoExcel()
  2. {
  3. MemoryStream ms = new MemoryStream(Properties.Resources.QNetTimesheet);
  4. ms.Position = ;
  5.  
  6. XSSFWorkbook book = new XSSFWorkbook(ms);
  7. return book;
  8. }

获取表(sheet)、行(row)、单元格(cell):

  1. ISheet sheet = book.GetSheetAt() //除了根据index,还可以根据名字获取:book.GetSheet("da")
  2.  
  3. IRow row = sheet.GetRow();
  4.  
  5. ICell cell = row.GetCell(); //row.Cells(i)方法也可以获取单元格, 但是此方法会跳过null的单元格。譬如,如果cell0跟cell3之间有一个单元格是null,那么row.Cells(3)就不会是你想要的那个cell...Please use row.GetCell(i)!!!!!
  6.  
  7. book.SetSheetName(, "新名字");//修改sheet名字
  8.  
  9. IRow newRow = sheet.CreateRow(i);//创建新行
  10.  
  11. int rowIndex = sheet.LastRowNum;//最后一行的index

单元格的相关操作:

  1. ICell dateCell = row.CreateCell();
  2. dateCell.SetCellValue(cardInfoList[i].Date);
  3.  
  4. ICell dayCell = row.CreateCell();
  5. dayCell.CellFormula = string.Format("WEEKDAY(A{0})", row.RowNum + );//设置公式, 并不需要“=”号
  6.  
  7. ICell totalHoursCell = row.CreateCell();
  8. totalHoursCell.CellFormula = string.Format("SUM(G{0}:G{1})", x, y);//设置公式

设置单元格样式(CellStyle):

  1. private ICellStyle GetCellDataStyle(IWorkbook book)
  2. {
  3. ICellStyle cs = book.CreateCellStyle();
  4. cs.BorderBottom = BorderStyle.Thin;
  5. cs.BorderLeft = BorderStyle.Thin;
  6. cs.BorderRight = BorderStyle.Thin;
  7. cs.BorderTop = BorderStyle.Thin;
  8.  
  9. cs.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.LightYellow.Index;//单元格背景色
  10. cs.FillPattern = FillPattern.SolidForeground;
  11.  
  12. cs.DataFormat = ;//在excel中可以Format Cells->Caregory->Custom设置Type使得单元格对数据显示不同的格式,比如可以设置显示成整形、金额、浮点数或者星期几等等等,可以看下面的“DataFormat”部分
  13. cs.Alignment = HorizontalAlignment.Center;//水平对齐
  14.  
  15. return cs;
  16. }
  17.  
  18. cell.CellStyle = GetCellDataStyle(book);//赋值

单元格的DataFormat:

可以看到,对同一个单元格,设置不同的DataFormat,最终显示的内容是不同的。在NPOI中,我们可以通过对单元格设置其DataFormat属性来达到我们的目的。

此属性是int类型,网上的例子不齐全。现实中,我们可以先创建一个excel表并且在excel中操作单元格使得其达到我们的要求,然后用NPOI读取得知其DataFormat。

嗯,第一张截图显示Wednesday是我用公式=WEEKDAY(A7)根据日期计算并显示的,DataFormat是185

  1. /*
  2. 0, "General"
  3. 1, "0"
  4. 2, "0.00"
  5. 3, "#,##0"
  6. 4, "#,##0.00"
  7. 5, "($#,##0_);($#,##0)"
  8. 6, "($#,##0_);[Red]($#,##0)"
  9. 7, "($#,##0.00);($#,##0.00)"
  10. 8, "($#,##0.00_);[Red]($#,##0.00)"
  11. 9, "0%"
  12. 0xa, "0.00%"
  13. 0xb, "0.00E+00"
  14. 0xc, "# ?/?"
  15. 0xd, "# ??/??"
  16. 0xe, "m/d/yy"
  17. 0xf, "d-mmm-yy"
  18. 0x10, "d-mmm"
  19. 0x11, "mmm-yy"
  20. 0x12, "h:mm AM/PM"
  21. 0x13, "h:mm:ss AM/PM"
  22. 0x14, "h:mm"
  23. 0x15, "h:mm:ss"
  24. 0x16, "m/d/yy h:mm"
  25. // 0x17 - 0x24 reserved for international and undocumented 0x25, "(#,##0_);(#,##0)"
  26. 0x26, "(#,##0_);[Red](#,##0)"
  27. 0x27, "(#,##0.00_);(#,##0.00)"
  28. 0x28, "(#,##0.00_);[Red](#,##0.00)"
  29. 0x29, "_(*#,##0_);_(*(#,##0);_(* \"-\"_);_(@_)"
  30. 0x2a, "_($*#,##0_);_($*(#,##0);_($* \"-\"_);_(@_)"
  31. 0x2b, "_(*#,##0.00_);_(*(#,##0.00);_(*\"-\"??_);_(@_)"
  32. 0x2c, "_($*#,##0.00_);_($*(#,##0.00);_($*\"-\"??_);_(@_)"
  33. 0x2d, "mm:ss"
  34. 0x2e, "[h]:mm:ss"
  35. 0x2f, "mm:ss.0"
  36. 0x30, "##0.0E+0"
  37. 0x31, "@" - This is text format.
  38. 0x31 "text" - Alias for "@"
  39. */

将excel内容转换为DataTable(VB.Net代码):

  1. Private Function GetDataTableFromExcel(workbook As IWorkbook) As DataTable
  2. Dim sheet = workbook.GetSheetAt()
  3. Dim rows = sheet.GetRowEnumerator()
  4. Dim dt = New DataTable()
  5. Dim j As Int16
  6.  
  7. Dim headerRow = sheet.GetRow()
  8. For j = To headerRow.Cells.Count - 'headerRow.LastCellNum - 1
  9. Dim columnName As String = headerRow.Cells(j).ToString()
  10. If Not (j = headerRow.Cells.Count - And String.IsNullOrEmpty(columnName)) Then
  11. dt.Columns.Add(columnName)
  12. End If
  13. Next
  14.  
  15. rows.MoveNext()
  16. While rows.MoveNext()
  17. Dim row As IRow
  18. row = rows.Current
  19. Dim isRowEmpty As Boolean = IsEmptyRow(row)
  20. If isRowEmpty Then
  21. Continue While 'do not add empty row to data table
  22. End If
  23.  
  24. Dim dr As DataRow
  25. dr = dt.NewRow()
  26. Dim i As Int16
  27. For i = To dt.Columns.Count -
  28. Dim cell As ICell
  29. cell = row.GetCell(i) 'row.Cells(i), this method will ignore the null column automatically...Please use row.GetCell(i)!!!!!
  30. If cell Is Nothing Then
  31. dr(i) = ""
  32. Else
  33. Try
  34. Select Case cell.CellType
  35. Case CellType.Blank
  36. dr(i) = ""
  37. Case CellType.String
  38. dr(i) = cell.StringCellValue
  39. Case CellType.Numeric
  40. If DateUtil.IsCellDateFormatted(cell) Then
  41. dr(i) = cell.DateCellValue
  42. Else
  43. dr(i) = cell.NumericCellValue
  44. End If
  45. Case Else
  46. dr(i) = cell.ToString()
  47. End Select
  48. Catch ex As Exception
  49. dr(i) = ""
  50. End Try
  51. End If
  52. Next
  53. dt.Rows.Add(dr)
  54. End While
  55.  
  56. Return dt
  57. End Function
  58.  
  59. Private Function IsEmptyRow(row As IRow) As Boolean
  60. Dim isEmpty As Boolean = True
  61. Dim i As Int16
  62. For i = To row.Cells.Count -
  63. Dim cell As ICell
  64. cell = row.GetCell(i)
  65. If cell IsNot Nothing Then
  66. If cell.CellType <> CellType.Blank Then
  67. isEmpty = False
  68. Exit For
  69. End If
  70. End If
  71. Next
  72. Return isEmpty
  73. End Function

将NPOI生成的excel内容保存为文件:

  1、WPF程序将excel内容保存为本地文件:

  1. XSSFWorkbook excelBook = npoiHelper.CreateExcel();
  2. using (MemoryStream MS = new MemoryStream())
  3. {
  4. excelBook.Write(MS);
  5. byte[] excelBytes = MS.ToArray();
  6. string excelPath = "C:\Users\test.xlsx";
  7. using (FileStream fs = new FileStream(excelPath, FileMode.Create, FileAccess.Write))
  8. {
  9. fs.Write(excelBytes, , excelBytes.Length);
  10. }
  11. }

  2、Asp.net服务器返回文件让用户保存(VB.Net代码):

  1. Dim response As HttpResponse = HttpContext.Current.Response
  2.  
  3. response.Clear()
  4. response.ClearHeaders()
  5. response.ClearContent()
  6. response.Charset = ""
  7.  
  8. response.ContentType = "application/vnd.ms-excel"
  9. response.AddHeader("Content-Disposition", String.Format("attachment; filename={0}.xls", HttpUtility.UrlEncode(title + "_" + DateTime.Now.ToString("yyyy-MM-dd HH-mm"), System.Text.Encoding.UTF8)))
  10.  
  11. Dim MS = New MemoryStream()
  12. book.Write(MS)
  13. response.BinaryWrite(MS.ToArray())
  14. response.End()
  15. response.Flush()
  16. MS.Close()
  17. MS.Dispose()

参考:

Class HSSFDataFormat

Net操作Excel(终极方法NPOI)

NPOI读写Excel

.Net操作Excel —— NPOI的更多相关文章

  1. 免费高效实用的.NET操作Excel组件NPOI(.NET组件介绍之六)

    很多的软件项目几乎都包含着对文档的操作,前面已经介绍过两款操作文档的组件,现在介绍一款文档操作的组件NPOI. NPOI可以生成没有安装在您的服务器上的Microsoft Office套件的Excel ...

  2. C#通过NPOI操作Excel

    参考页面: http://www.yuanjiaocheng.net/webapi/create-crud-api-1-post.html http://www.yuanjiaocheng.net/w ...

  3. NPOI操作EXCEL(六)——矩阵类表头EXCEL模板的解析

    哈哈~~~很高兴还活着.总算加班加点的把最后一类EXCEL模板的解析做完了... 前面几篇文章介绍了博主最近项目中对于复杂excel表头的解析,写得不好,感谢园友们的支持~~~ 今天再简单讲诉一下另一 ...

  4. NPOI操作Excel辅助类

    /// <summary> /// NPOI操作excel辅助类 /// </summary> public static class NPOIHelper { #region ...

  5. NPOI操作EXCEL(一)——npoi基础

    去年项目有一个子模块需要解析上百张不一样的excel表格入库,当时用的NPOI,做了很久...也尝试想把代码分享到oschina,结果没坚持两篇就放弃了. 赶巧的是,昨天运营那边提出要录入一些基础数据 ...

  6. c# .Net :Excel NPOI导入导出操作教程之读取Excel文件信息及输出

    c# .Net :Excel NPOI导入导出操作教程之读取Excel文件信息及输出 using NPOI.HSSF.UserModel;using NPOI.SS.UserModel;using S ...

  7. NPOI操作excel之写入数据到excel表

    在上一篇<NPOI操作excel之读取excel数据>我们把excel数据写入了datatable中,本篇就讲如何把datatable数据写入excel中. using System; u ...

  8. C#开发中使用Npoi操作excel实例代码

    C#开发中使用Npoi操作excel实例代码 出处:西西整理 作者:西西 日期:2012/11/16 9:35:50 [大 中 小] 评论: 0 | 我要发表看法 Npoi 是什么? 1.整个Exce ...

  9. [Solution] NPOI操作Excel

    NPOI 是 POI 项目的 .NET 版本.POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目.使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 ...

随机推荐

  1. B2242 [SDOI2011]计算器

    这个题就是把三个数论基础合在了一起,算是一道比较全面的题. 1的时候就是快速幂 2的时候是exgcd求逆元,特殊的,只有两数互质才有逆元. 3就是bsgs啦,还是不太熟 题干: Description ...

  2. mst

    https://www.zybuluo.com/ysner/note/1245941 题面 给一个\(n\)点完全图,点权均小于\(2^m\).定义边权等于两端点点权的与和(即\(a_i\&b ...

  3. openstack封装待调试

  4. 51nod 1222 莫比乌斯反演

    思路: yhx找的反演题 题解已经烂大街了 #pragma GCC optimize("O3") //By SiriusRen #include <bits/stdc++.h ...

  5. ACM_他和她(最大生成树+最短路径)

    他和她 Time Limit: 2000/1000ms (Java/Others) Problem Description: 大二上学期刚过完,平时成绩不错的小V参加了一个小型编程比赛,遇到一道题,虽 ...

  6. [LeetCode]152. Maximum Product Subarray

    This a task that asks u to compute the maximum product from a continue subarray. However, you need t ...

  7. RabbitMQ~消息的产生和管理(15672)

    上一讲说了rabbitmq在windows环境的部署,而今天主要说一下消息在产生后,如何去查看消息,事实上,rabbitmq为我们提供了功能强大的管理插件,我们只要开启这个插件即可,它也是一个网站,端 ...

  8. 深入理解async和await的作用及各种适用场景和用法

    https://www.cnblogs.com/yaopengfei/archive/2018/07/02/9249390.html https://www.cnblogs.com/xianyudot ...

  9. Android传递中文参数方法(之一)

    最近在做app,用的volley传参,有一个地方传中文参数不行(貌似是get方式),我又试了下post方式,成功了,记录下,以后有用! RequestQueue requestQueue = Voll ...

  10. mysql中的各种concat

    引用:http://www.cnblogs.com/appleat/archive/2012/09/03/2669033.html 一.CONCAT()函数CONCAT()函数用于将多个字符串连接成一 ...