近期的两个项目都有关于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()

参考:

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. Visual Studio AI

    Visual Studio 完全AI手册 - 从0开始配置环境 https://www.cnblogs.com/ms-uap/p/9123033.html 零.前提条件 一台能联网的电脑,使用win1 ...

  2. java 监听机制模拟(JButton按钮监听机制)

    一.概念 1.事件监听器 事件监听器就我个人的理解就是:被外部事件(键盘.鼠标)引发的程序,这段程序是被嵌入到事件源的类里面,它负责监听事件列表.而很多人把事件监听器理解成是实现EventListen ...

  3. AD10 库下载地址

    http://wiki.altium.com/display/ADOH/Download+Libraries 最新更新库地址: http://designcontent.live.altium.com ...

  4. php 时间戳和时间的转换

    PHP的时间戳与具体时间转化 三个内置函数: time() //获取UNIX系统时间戳 mktime(hour,minute,second,month,day,year) //将指定时间转化为时间戳 ...

  5. Gym - 100920E 2010-2011 OpenCup IX Onsite, II Yandex Summer School E.Paint 状压DP

    题面 题意:给你n(20)个点,m(40条边),让你给每条边染一种颜色,白色0元,红色2元,蓝色1元,现在要保证每一条白边相邻的有一条红边,问至少花多少 题解:刚开始想的时候,好像觉得只用染红色和白色 ...

  6. [App Store Connect帮助]三、管理 App 和版本(6.1)转让 App:App 转让概述

    当您将某个 App 出售给其他开发者,或想要将其移至其他 App Store Connect 帐户或组织时,您需要转让该 App. 您无需将 App 从 App Store 下架,即可将其所有权转让给 ...

  7. Akka源码分析-深入ActorRef&ActorPath

    上一节我们深入讨论了ActorRef等相关的概念及其关系,但ActorRef和ActorPath的关系还需要再加以分析说明.其实还是官网说的比较清楚. “A path in an actor syst ...

  8. mongoDB的基本用法

    一.MongoDB初识 什么是MongoDB MongoDB是一个基于分布式文件存储的数据库.由c++语言编写.旨在为web应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于关系数据库 ...

  9. 【Leetcode】115. Distinct Subsequences

    Description: Given two string S and T, you need to count the number of T's subsequences appeared in ...

  10. Flume 是什么?

    Flume是一个分布式.可靠.和高可用的海量日志聚合的系统,支持在系统中定制各类数据发送方,用于收集数据:同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力. 收集.聚合事件 ...