.Net操作Excel —— NPOI
近期的两个项目都有关于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代码):
- Dim fileOriginalPath As String = excelUploader.PostedFile.FileName
- Dim fileName As String = excelUploader.FileName
- Dim extension = Path.GetExtension(fileOriginalPath).ToLower()
- Dim workbook As IWorkbook
- If (extension = ".xlsx") Then 'excel 2007
- workbook = New XSSFWorkbook(excelUploader.PostedFile.InputStream)
- Else 'excel 2003
- workbook = New HSSFWorkbook(excelUploader.PostedFile.InputStream)
- End If
2、WPF读取本地excel文件:
- using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read))
- {
- hssfworkbook = new HSSFWorkbook(file);
- }
- //其实HSSFWorkbook/XSSFWorkbook的构造方法可以直接传入FileInfo做参数
3、WPF读取嵌入在资源文件的excel表格
- public XSSFWorkbook ReadDemoExcel()
- {
- MemoryStream ms = new MemoryStream(Properties.Resources.QNetTimesheet);
- ms.Position = ;
- XSSFWorkbook book = new XSSFWorkbook(ms);
- return book;
- }
获取表(sheet)、行(row)、单元格(cell):
- ISheet sheet = book.GetSheetAt() //除了根据index,还可以根据名字获取:book.GetSheet("da")
- IRow row = sheet.GetRow();
- ICell cell = row.GetCell(); //row.Cells(i)方法也可以获取单元格, 但是此方法会跳过null的单元格。譬如,如果cell0跟cell3之间有一个单元格是null,那么row.Cells(3)就不会是你想要的那个cell...Please use row.GetCell(i)!!!!!
- book.SetSheetName(, "新名字");//修改sheet名字
- IRow newRow = sheet.CreateRow(i);//创建新行
- int rowIndex = sheet.LastRowNum;//最后一行的index
单元格的相关操作:
- ICell dateCell = row.CreateCell();
- dateCell.SetCellValue(cardInfoList[i].Date);
- ICell dayCell = row.CreateCell();
- dayCell.CellFormula = string.Format("WEEKDAY(A{0})", row.RowNum + );//设置公式, 并不需要“=”号
- ICell totalHoursCell = row.CreateCell();
- totalHoursCell.CellFormula = string.Format("SUM(G{0}:G{1})", x, y);//设置公式
设置单元格样式(CellStyle):
- private ICellStyle GetCellDataStyle(IWorkbook book)
- {
- ICellStyle cs = book.CreateCellStyle();
- cs.BorderBottom = BorderStyle.Thin;
- cs.BorderLeft = BorderStyle.Thin;
- cs.BorderRight = BorderStyle.Thin;
- cs.BorderTop = BorderStyle.Thin;
- cs.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.LightYellow.Index;//单元格背景色
- cs.FillPattern = FillPattern.SolidForeground;
- cs.DataFormat = ;//在excel中可以Format Cells->Caregory->Custom设置Type使得单元格对数据显示不同的格式,比如可以设置显示成整形、金额、浮点数或者星期几等等等,可以看下面的“DataFormat”部分
- cs.Alignment = HorizontalAlignment.Center;//水平对齐
- return cs;
- }
- cell.CellStyle = GetCellDataStyle(book);//赋值
单元格的DataFormat:
可以看到,对同一个单元格,设置不同的DataFormat,最终显示的内容是不同的。在NPOI中,我们可以通过对单元格设置其DataFormat属性来达到我们的目的。
此属性是int类型,网上的例子不齐全。现实中,我们可以先创建一个excel表并且在excel中操作单元格使得其达到我们的要求,然后用NPOI读取得知其DataFormat。
嗯,第一张截图显示Wednesday是我用公式=WEEKDAY(A7)根据日期计算并显示的,DataFormat是185
- /*
- 0, "General"
- 1, "0"
- 2, "0.00"
- 3, "#,##0"
- 4, "#,##0.00"
- 5, "($#,##0_);($#,##0)"
- 6, "($#,##0_);[Red]($#,##0)"
- 7, "($#,##0.00);($#,##0.00)"
- 8, "($#,##0.00_);[Red]($#,##0.00)"
- 9, "0%"
- 0xa, "0.00%"
- 0xb, "0.00E+00"
- 0xc, "# ?/?"
- 0xd, "# ??/??"
- 0xe, "m/d/yy"
- 0xf, "d-mmm-yy"
- 0x10, "d-mmm"
- 0x11, "mmm-yy"
- 0x12, "h:mm AM/PM"
- 0x13, "h:mm:ss AM/PM"
- 0x14, "h:mm"
- 0x15, "h:mm:ss"
- 0x16, "m/d/yy h:mm"
- // 0x17 - 0x24 reserved for international and undocumented 0x25, "(#,##0_);(#,##0)"
- 0x26, "(#,##0_);[Red](#,##0)"
- 0x27, "(#,##0.00_);(#,##0.00)"
- 0x28, "(#,##0.00_);[Red](#,##0.00)"
- 0x29, "_(*#,##0_);_(*(#,##0);_(* \"-\"_);_(@_)"
- 0x2a, "_($*#,##0_);_($*(#,##0);_($* \"-\"_);_(@_)"
- 0x2b, "_(*#,##0.00_);_(*(#,##0.00);_(*\"-\"??_);_(@_)"
- 0x2c, "_($*#,##0.00_);_($*(#,##0.00);_($*\"-\"??_);_(@_)"
- 0x2d, "mm:ss"
- 0x2e, "[h]:mm:ss"
- 0x2f, "mm:ss.0"
- 0x30, "##0.0E+0"
- 0x31, "@" - This is text format.
- 0x31 "text" - Alias for "@"
- */
将excel内容转换为DataTable(VB.Net代码):
- Private Function GetDataTableFromExcel(workbook As IWorkbook) As DataTable
- Dim sheet = workbook.GetSheetAt()
- Dim rows = sheet.GetRowEnumerator()
- Dim dt = New DataTable()
- Dim j As Int16
- Dim headerRow = sheet.GetRow()
- For j = To headerRow.Cells.Count - 'headerRow.LastCellNum - 1
- Dim columnName As String = headerRow.Cells(j).ToString()
- If Not (j = headerRow.Cells.Count - And String.IsNullOrEmpty(columnName)) Then
- dt.Columns.Add(columnName)
- End If
- Next
- rows.MoveNext()
- While rows.MoveNext()
- Dim row As IRow
- row = rows.Current
- Dim isRowEmpty As Boolean = IsEmptyRow(row)
- If isRowEmpty Then
- Continue While 'do not add empty row to data table
- End If
- Dim dr As DataRow
- dr = dt.NewRow()
- Dim i As Int16
- For i = To dt.Columns.Count -
- Dim cell As ICell
- cell = row.GetCell(i) 'row.Cells(i), this method will ignore the null column automatically...Please use row.GetCell(i)!!!!!
- If cell Is Nothing Then
- dr(i) = ""
- Else
- Try
- Select Case cell.CellType
- Case CellType.Blank
- dr(i) = ""
- Case CellType.String
- dr(i) = cell.StringCellValue
- Case CellType.Numeric
- If DateUtil.IsCellDateFormatted(cell) Then
- dr(i) = cell.DateCellValue
- Else
- dr(i) = cell.NumericCellValue
- End If
- Case Else
- dr(i) = cell.ToString()
- End Select
- Catch ex As Exception
- dr(i) = ""
- End Try
- End If
- Next
- dt.Rows.Add(dr)
- End While
- Return dt
- End Function
- Private Function IsEmptyRow(row As IRow) As Boolean
- Dim isEmpty As Boolean = True
- Dim i As Int16
- For i = To row.Cells.Count -
- Dim cell As ICell
- cell = row.GetCell(i)
- If cell IsNot Nothing Then
- If cell.CellType <> CellType.Blank Then
- isEmpty = False
- Exit For
- End If
- End If
- Next
- Return isEmpty
- End Function
将NPOI生成的excel内容保存为文件:
1、WPF程序将excel内容保存为本地文件:
- XSSFWorkbook excelBook = npoiHelper.CreateExcel();
- using (MemoryStream MS = new MemoryStream())
- {
- excelBook.Write(MS);
- byte[] excelBytes = MS.ToArray();
- string excelPath = "C:\Users\test.xlsx";
- using (FileStream fs = new FileStream(excelPath, FileMode.Create, FileAccess.Write))
- {
- fs.Write(excelBytes, , excelBytes.Length);
- }
- }
2、Asp.net服务器返回文件让用户保存(VB.Net代码):
- Dim response As HttpResponse = HttpContext.Current.Response
- response.Clear()
- response.ClearHeaders()
- response.ClearContent()
- response.Charset = ""
- response.ContentType = "application/vnd.ms-excel"
- 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)))
- Dim MS = New MemoryStream()
- book.Write(MS)
- response.BinaryWrite(MS.ToArray())
- response.End()
- response.Flush()
- MS.Close()
- MS.Dispose()
参考:
.Net操作Excel —— NPOI的更多相关文章
- 免费高效实用的.NET操作Excel组件NPOI(.NET组件介绍之六)
很多的软件项目几乎都包含着对文档的操作,前面已经介绍过两款操作文档的组件,现在介绍一款文档操作的组件NPOI. NPOI可以生成没有安装在您的服务器上的Microsoft Office套件的Excel ...
- C#通过NPOI操作Excel
参考页面: http://www.yuanjiaocheng.net/webapi/create-crud-api-1-post.html http://www.yuanjiaocheng.net/w ...
- NPOI操作EXCEL(六)——矩阵类表头EXCEL模板的解析
哈哈~~~很高兴还活着.总算加班加点的把最后一类EXCEL模板的解析做完了... 前面几篇文章介绍了博主最近项目中对于复杂excel表头的解析,写得不好,感谢园友们的支持~~~ 今天再简单讲诉一下另一 ...
- NPOI操作Excel辅助类
/// <summary> /// NPOI操作excel辅助类 /// </summary> public static class NPOIHelper { #region ...
- NPOI操作EXCEL(一)——npoi基础
去年项目有一个子模块需要解析上百张不一样的excel表格入库,当时用的NPOI,做了很久...也尝试想把代码分享到oschina,结果没坚持两篇就放弃了. 赶巧的是,昨天运营那边提出要录入一些基础数据 ...
- c# .Net :Excel NPOI导入导出操作教程之读取Excel文件信息及输出
c# .Net :Excel NPOI导入导出操作教程之读取Excel文件信息及输出 using NPOI.HSSF.UserModel;using NPOI.SS.UserModel;using S ...
- NPOI操作excel之写入数据到excel表
在上一篇<NPOI操作excel之读取excel数据>我们把excel数据写入了datatable中,本篇就讲如何把datatable数据写入excel中. using System; u ...
- C#开发中使用Npoi操作excel实例代码
C#开发中使用Npoi操作excel实例代码 出处:西西整理 作者:西西 日期:2012/11/16 9:35:50 [大 中 小] 评论: 0 | 我要发表看法 Npoi 是什么? 1.整个Exce ...
- [Solution] NPOI操作Excel
NPOI 是 POI 项目的 .NET 版本.POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目.使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 ...
随机推荐
- B2242 [SDOI2011]计算器
这个题就是把三个数论基础合在了一起,算是一道比较全面的题. 1的时候就是快速幂 2的时候是exgcd求逆元,特殊的,只有两数互质才有逆元. 3就是bsgs啦,还是不太熟 题干: Description ...
- mst
https://www.zybuluo.com/ysner/note/1245941 题面 给一个\(n\)点完全图,点权均小于\(2^m\).定义边权等于两端点点权的与和(即\(a_i\&b ...
- openstack封装待调试
- 51nod 1222 莫比乌斯反演
思路: yhx找的反演题 题解已经烂大街了 #pragma GCC optimize("O3") //By SiriusRen #include <bits/stdc++.h ...
- ACM_他和她(最大生成树+最短路径)
他和她 Time Limit: 2000/1000ms (Java/Others) Problem Description: 大二上学期刚过完,平时成绩不错的小V参加了一个小型编程比赛,遇到一道题,虽 ...
- [LeetCode]152. Maximum Product Subarray
This a task that asks u to compute the maximum product from a continue subarray. However, you need t ...
- RabbitMQ~消息的产生和管理(15672)
上一讲说了rabbitmq在windows环境的部署,而今天主要说一下消息在产生后,如何去查看消息,事实上,rabbitmq为我们提供了功能强大的管理插件,我们只要开启这个插件即可,它也是一个网站,端 ...
- 深入理解async和await的作用及各种适用场景和用法
https://www.cnblogs.com/yaopengfei/archive/2018/07/02/9249390.html https://www.cnblogs.com/xianyudot ...
- Android传递中文参数方法(之一)
最近在做app,用的volley传参,有一个地方传中文参数不行(貌似是get方式),我又试了下post方式,成功了,记录下,以后有用! RequestQueue requestQueue = Voll ...
- mysql中的各种concat
引用:http://www.cnblogs.com/appleat/archive/2012/09/03/2669033.html 一.CONCAT()函数CONCAT()函数用于将多个字符串连接成一 ...