热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:使用NPOI进行Excel数据的导入导出

本文由编程笔记#小编为大家整理,主要介绍了使用NPOI进行Excel数据的导入导出相关的知识,希望对你有一定的参考价值。一、概述NPOI是POI项目的.NET
本文由编程笔记#小编为大家整理,主要介绍了使用NPOI进行Excel数据的导入导出相关的知识,希望对你有一定的参考价值。

一、概述

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

操作Excel的类库:

  • NPOI: V2.5.1 快速生成 https://github.com/tonyqus/npoi
  • MyXls: (已停止)
  • Aspose.Cell.dll: 收费
  • EPPlus 5: https://github.com/EPPlusSoftware/
  • Spire.XLS: 收费

操作Word的类库:

  • NPOI: V2.5.1 快速生成 https://github.com/tonyqus/npoi
  • DocX: V1.6.0  https://github.com/xceedsoftware/DocX
  • Aspose.Words: 收费
  • Spire.Doc: 收费

引用DLL

使用时需引用需要引用所有5个dll

  • ICSharpCode.SharpZipLib.dll
  • NPOI.dll
  • NPOI.OOXML.dll
  • NPOI.OpenXml4Net.dll
  • NPOI.OpenXmlFormats.dll

技术图片

程序集构成

技术图片

技术图片

二、通过NPOI,将数据表DataTable导入导出Excel文件

1、简单的将DataTable导出到Excel:

public static void SimpleTableToExcel(DataTable dt, string fileName)
{
IWorkbook workbook;
string fileExt = Path.GetExtension(fileName).ToLower();
if (fileExt == ".xlsx")
{
workbook
= new XSSFWorkbook();
}
else if (fileExt == ".xls")
{
workbook
= new HSSFWorkbook();
}
else
{
workbook
= null;
return;
}
ISheet sheet
= string.IsNullOrEmpty(dt.TableName) ? workbook.CreateSheet("Sheet1") : workbook.CreateSheet(dt.TableName);
//表头
IRow row = sheet.CreateRow(0);
for (int i = 0; i )
{
ICell cell = row.CreateCell(i);
cell.SetCellValue(dt.Columns[i].ColumnName);
}
//数据
for (int i = 0; i )
{
IRow row1 = sheet.CreateRow(i + 1);
for (int j = 0; j )
{
ICell cell = row1.CreateCell(j);
cell.SetCellValue(dt.Rows[i][j].ToString());
}
}
//保存为Excel文件
using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write))
{
workbook.Write(fs);
}
}

2、从Excel导入数据到DataTable:

public static DataTable ImportFromExcel(string fileName)
{
DataTable dt
= new DataTable();
IWorkbook workbook;
string fileExt = Path.GetExtension(fileName).ToLower();
using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read))
{
//XSSFWorkbook 适用XLSX格式,HSSFWorkbook 适用XLS格式
if (fileExt == ".xlsx")
{
workbook
= new XSSFWorkbook(fs);
}
else if (fileExt == ".xls")
{
workbook
= new HSSFWorkbook(fs);
}
else
{
workbook
= null;
return null;
}
ISheet sheet
= workbook.GetSheetAt(0);//Sheet总数量:workbook.NumberOfSheets
//表头
IRow header = sheet.GetRow(sheet.FirstRowNum);
for (int i = 0; i )
{
ICell obj = header.GetCell(i);
if (obj.CellType == CellType.Blank || obj.StringCellValue == string.Empty)
{
dt.Columns.Add(
new DataColumn("Columns" + i.ToString()));
}
else
dt.Columns.Add(
new DataColumn(obj.ToString()));
}
//数据
for (int i = sheet.FirstRowNum + 1; i <= sheet.LastRowNum; i++)
{
DataRow dr
= dt.NewRow();
IRow row
= sheet.GetRow(i);
for (int j = row.FirstCellNum; j )
{
if (row.GetCell(j) != null)
{
dr[j]
= row.GetCell(j);
}
}
dt.Rows.Add(dr);
}
}
return dt;
}

四、查找

IEnumerator rows = sheet.GetEnumerator();
while (rows.MoveNext())
{
IRow row
= (HSSFRow)rows.Current;
ICell cell
= row.GetCell(0);
if (cell != null && cell.StringCellValue == "XX")
{
return row.GetCell(1).StringCellValue;
}
}

五、填充Excel模板

IWorkbook workbook;
using (FileStream fs = new FileStream("模板文件.xls", FileMode.Open, FileAccess.Read))
{
workbook
= new HSSFWorkbook(fs);
}
ISheet cloneSheet
= workbook.CloneSheet(workbook.GetSheetIndex("Sheet1"));//复制第一个模板Sheet
cloneSheet.ForceFormulaRecalculation = true;
workbook.SetSheetName(workbook.GetSheetIndex(cloneSheet),
"SheetClone");//设置新SheetName
cloneSheet.GetRow(4).GetCell(1).SetCellValue("a");//为已经存在的单元格赋值
IRow row = cloneSheet.GetRow(15);
if (row == null)
row
= cloneSheet.CreateRow(15);
ICell cell
= row.GetCell(7);
if (cell == null)
cell
= row.CreateCell(7);
cell.SetCellValue(
"XX");// 为不存在的单元格,先新建再赋值
cloneSheet.ShiftRows(51, 60, 34);//51-60行(尾部)整体移动34行,腾出更多控件插入多行数据
workbook.RemoveSheetAt(workbook.GetSheetIndex("Sheet1"));//移除原模板Sheet

FileStream fs_new
= new FileStream(DateTime.Now.Ticks + ".xls", FileMode.Create);
workbook.Write(fs_new);
fs_new.Close();

六、将DataTable导出到Excel:先导出到MemoryStream

public static MemoryStream ExportToExcel(DataTable dt, string HeaderText)
{
var workbook = new HSSFWorkbook();
ISheet sheet
= workbook.CreateSheet(string.IsNullOrWhiteSpace(dt.TableName) ? "Sheet1" : dt.TableName);
//右击文件“属性”信息
#region 文件属性信息
{
var dsi = PropertySetFactory.CreateDocumentSummaryInformation();
dsi.Company
= "NPOI";
workbook.DocumentSummaryInformation
= dsi;
SummaryInformation si
= PropertySetFactory.CreateSummaryInformation();
si.Author
= "文件作者信息";
si.ApplicationName
= "创建程序信息";
si.LastAuthor
= "最后保存者信息";
si.Comments
= "作者信息";
si.Title
= "标题信息";
si.Subject
= "主题信息";
si.CreateDateTime
= DateTime.Now;
workbook.SummaryInformation
= si;
}
#endregion
//格式
var dateStyle = workbook.CreateCellStyle();
var format = workbook.CreateDataFormat();
dateStyle.DataFormat
= format.GetFormat("yyyy-mm-dd");//日期格式
//取得列宽
var arrColWidth = new int[dt.Columns.Count];
foreach (DataColumn item in dt.Columns)
{
arrColWidth[item.Ordinal]
= Encoding.GetEncoding(936).GetBytes(item.ColumnName.ToString()).Length;
}
for (var i = 0; i )
{
for (var j = 0; j )
{
int intTemp = Encoding.GetEncoding(936).GetBytes(dt.Rows[i][j].ToString()).Length;
if (intTemp > arrColWidth[j])
{
arrColWidth[j]
= intTemp;
}
}
}
int rowIndex = 0;
foreach (DataRow row in dt.Rows)
{
#region 表头 列头
if (rowIndex == 65535 || rowIndex == 0)
{
if (rowIndex != 0)
{
sheet
= workbook.CreateSheet();//超过65535行,则新建一个Sheet
}
#region 表头及样式
{
var headerRow = sheet.CreateRow(0);
headerRow.HeightInPoints
= 25;
headerRow.CreateCell(
0).SetCellValue(HeaderText);
//CellStyle
ICellStyle headStyle = workbook.CreateCellStyle();
headStyle.Alignment
= NPOI.SS.UserModel.HorizontalAlignment.Center;// 左右居中
headStyle.VerticalAlignment = VerticalAlignment.Center;// 上下居中
// 设置单元格的背景颜色(单元格的样式会覆盖列或行的样式)
headStyle.FillForegroundColor = (short)11;
//定义font
IFont fOnt= workbook.CreateFont();
font.FontHeightInPoints
= 20;
font.Boldweight
= 700;
headStyle.SetFont(font);
headerRow.GetCell(
0).CellStyle = headStyle;
sheet.AddMergedRegion(
new NPOI.SS.Util.CellRangeAddress(0, 0, 0, dt.Columns.Count - 1));//合并区域
}
#endregion
#region 列头及样式
{
var headerRow = sheet.CreateRow(1);
//CellStyle
ICellStyle headStyle = workbook.CreateCellStyle();
headStyle.Alignment
= NPOI.SS.UserModel.HorizontalAlignment.Center;// 左右居中
headStyle.VerticalAlignment = VerticalAlignment.Center;// 上下居中
//定义font
IFont fOnt= workbook.CreateFont();
font.FontHeightInPoints
= 10;
font.Boldweight
= 700;
headStyle.SetFont(font);
foreach (DataColumn column in dt.Columns)
{
headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
headerRow.GetCell(column.Ordinal).CellStyle
= headStyle;
sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal]
+ 1) * 256);//设置列宽
}
}
#endregion
rowIndex
= 2;//数据行RowIndex为2(表头和列头个占一行)
}
#endregion
#region 内容
var dataRow = sheet.CreateRow(rowIndex);
foreach (DataColumn column in dt.Columns)
{
var newCell = dataRow.CreateCell(column.Ordinal);
string drValue = row[column].ToString();
switch (column.DataType.ToString())
{
case "System.String"://字符串类型
newCell.SetCellValue(drValue);
break;
case "System.DateTime"://日期类型
DateTime dateV;
DateTime.TryParse(drValue,
out dateV);
newCell.SetCellValue(dateV);
newCell.CellStyle
= dateStyle;//格式化显示
break;
case "System.Boolean"://布尔型
bool boolV = false;
bool.TryParse(drValue, out boolV);
newCell.SetCellValue(boolV);
break;
case "System.Int16"://整型
case "System.Int32":
case "System.Int64":
case "System.Byte":
int intV = 0;
int.TryParse(drValue, out intV);
newCell.SetCellValue(intV);
break;
case "System.Decimal"://浮点型
case "System.Double":
double doubV = 0;
double.TryParse(drValue, out doubV);
newCell.SetCellValue(doubV);
break;
case "System.DBNull"://空值处理
newCell.SetCellValue("");
break;
default:
newCell.SetCellValue(
"");//设置单元格公式:newCell.SetCellFormula("SUM($B0:$D0)")
break;
}
}
#endregion
rowIndex
++;
}
//自动列宽
for (int i = 0; i <= dt.Columns.Count; i++)
sheet.AutoSizeColumn(i,
true);
using (MemoryStream ms = new MemoryStream())
{
workbook.Write(ms);
ms.Flush();
ms.Position
= 0;
return ms;
}
}

七、应用

1、Web导出

public static void ExportToExcelByWeb(DataTable dt, string HeaderText, string FileName)
{
HttpContext context
= HttpContext.Current;
context.Response.ContentType
= "application/vnd.ms-excel";
context.Response.ContentEncoding
= Encoding.UTF8;
context.Response.Charset
= "UTF-8";
context.Response.AddHeader(
"Content-Disposition", string.Format("attachment; filename={0}.xls", HttpUtility.UrlEncode(FileName, Encoding.UTF8)));
byte[] data = ExportToExcel(dt, HeaderText).GetBuffer();//Read()方法也可以
context.Response.BinaryWrite(data);// 或者: context.Response.OutputStream.Write(data,0,data.Length)
context.Response.End();
}

2、Winform导出

public static void ExportToExcel(DataTable dt, string HeaderText, string FileName)
{
using (MemoryStream ms = ExportToExcel(dt, HeaderText))
{
using (FileStream fs = new FileStream(FileName, FileMode.Create, FileAccess.Write))
{
byte[] data = ms.ToArray();//跟GetBuffer()对比,速度稍慢,但无空数据
fs.Write(data, 0, data.Length);
fs.Flush();
}
}
}

八、GridView导出到Excel

Web中的GridView可直接导出到Excel:renderControl()



推荐阅读
  • 在工作中,遇到需要将excel表中的特定数据提取出来,并将数据以键值对的形式存储到map集合中。因为我用的是maven管理的jar包,所 ... [详细]
  • Java如何导入和导出Excel文件的方法和步骤详解
    本文详细介绍了在SpringBoot中使用Java导入和导出Excel文件的方法和步骤,包括添加操作Excel的依赖、自定义注解等。文章还提供了示例代码,并将代码上传至GitHub供访问。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • EPPlus绘制刻度线的方法及示例代码
    本文介绍了使用EPPlus绘制刻度线的方法,并提供了示例代码。通过ExcelPackage类和List对象,可以实现在Excel中绘制刻度线的功能。具体的方法和示例代码在文章中进行了详细的介绍和演示。 ... [详细]
  • 本文整理了Java中java.lang.NoSuchMethodError.getMessage()方法的一些代码示例,展示了NoSuchMethodErr ... [详细]
  • Annotation的大材小用
    为什么80%的码农都做不了架构师?最近在开发一些通用的excel数据导入的功能,由于涉及到导入的模块很多,所以开发了一个比较通用的e ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 精讲代理设计模式
    代理设计模式为其他对象提供一种代理以控制对这个对象的访问。代理模式实现原理代理模式主要包含三个角色,即抽象主题角色(Subject)、委托类角色(被代理角色ÿ ... [详细]
author-avatar
温蚊童鞋_612
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有