利用 Nuget 安装 NPOI 组件。

所需引用的 dll:ICSharpCode.SharpZipLib.dll、NPOI.dll、NPOI.OOXML.dll、NPOI.OpenXml4Net.dll、NPOI.OpenXmlFormats.dll

程序代码:

using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel; namespace MyBaseFramework
{
/// <summary>
/// Excel 数据导入导出
/// </summary>
public class ExcelHelper
{
/// <summary>
/// 从 Excel 导入数据
/// </summary>
/// <param name="fileFullPath">Excel文件路径及名称</param>
/// <param name="sheetName">excel中的sheet名称</param>
/// <param name="firstRowIsTitle">第一行是否是列标题</param>
/// <returns>DataTable格式的数据</returns>
public static DataTable ImportDataFromExcel(string fileFullPath, string sheetName = "", bool firstRowIsTitle = true)
{
IWorkbook workbook = null;
ISheet sheet = null;
DataTable dataTable = new DataTable(); //检查文件是否存在
if (!File.Exists(fileFullPath)) return null; using (FileStream fs = new FileStream(fileFullPath, FileMode.Open, FileAccess.Read))
{
try
{
if (fileFullPath.IndexOf(".xlsx") > ) // Excle 2007 及以后的版本
workbook = new XSSFWorkbook(fs);
else if (fileFullPath.IndexOf(".xls") > ) // Excle 2003 及以前的版本
workbook = new HSSFWorkbook(fs); //如果指定了sheet名称则打开指定的sheet
if (!string.IsNullOrEmpty(sheetName))
{
sheet = workbook.GetSheet(sheetName); if (sheet == null) return null;
}
else
sheet = workbook.GetSheetAt(); //Excel中至少会存在一个Sheet //处理sheet中的数据
IRow firstRow = sheet.GetRow();
int columnCount = firstRow.LastCellNum; //取第一行中最后一个cell的编号,即总列数
int rowCount = sheet.LastRowNum; //取最后一行的行号,即总行数
int dataRowStart = ; //sheet中数据起始行的序号 //给datatable依次添加列标题
if (firstRowIsTitle)
{
for (int i = firstRow.FirstCellNum; i < columnCount; ++i)
{
ICell cell = firstRow.GetCell(i);
if (cell != null)
{
string cellValue = cell.StringCellValue; //判断列标题是否为空
if (!string.IsNullOrEmpty(cellValue))
{
DataColumn column = new DataColumn(cellValue);
dataTable.Columns.Add(column);
}
}
}
dataRowStart = sheet.FirstRowNum + ;
}
else
dataRowStart = sheet.FirstRowNum; //给datatable依次添加各行数据
for (int i = dataRowStart; i <= rowCount; ++i)
{
IRow row = sheet.GetRow(i);
if (row == null) //没有数据的行默认是null
continue; DataRow dataRow = dataTable.NewRow();
for (int j = row.FirstCellNum; j < columnCount; ++j)
{
ICell cell = row.GetCell(j); if (cell != null)
{
//根据格式读取数据类型
switch (cell.CellType)
{
case CellType.Blank:
dataRow[j] = "";
break;
case CellType.String:
dataRow[j] = cell.StringCellValue;
break;
case CellType.Numeric: //数值
if (DateUtil.IsCellDateFormatted(cell)) //检查单元格格式是否为日期格式
dataRow[j] = cell.DateCellValue;
else
dataRow[j] = cell.NumericCellValue;
break;
case CellType.Formula: //公式
HSSFFormulaEvaluator e = new HSSFFormulaEvaluator(workbook);
dataRow[j] = e.Evaluate(cell).StringValue;
break;
default:
dataRow[j] = "";
break;
}
}
} dataTable.Rows.Add(dataRow);
} return dataTable;
}
catch (Exception ex)
{
fs.Close();
throw ex;
}
}
} /// <summary>
/// 导出数据到 Excel
/// </summary>
/// <param name="dt">源数据</param>
/// <param name="fileSaveFullPath">Excel 文件保存位置</param>
public static void ExportDataToExcel(DataTable dt, string fileSaveFullPath)
{
try
{
IWorkbook workbook = null;
ISheet sheet = null; if (fileSaveFullPath.IndexOf(".xlsx") > ) // Excle 2007 及以后的版本
workbook = new XSSFWorkbook();
else if (fileSaveFullPath.IndexOf(".xls") > ) // Excle 2003 及以前的版本
workbook = new HSSFWorkbook(); sheet = workbook.CreateSheet(); // 表头的样式
ICellStyle headStyle = workbook.CreateCellStyle();
headStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
IFont font = workbook.CreateFont();
font.FontHeightInPoints = ;
font.Boldweight = ;
headStyle.IsLocked = true;
headStyle.SetFont(font); // 数据内容的样式
IFont fontText = workbook.CreateFont();
fontText.FontHeightInPoints = ;
ICellStyle styleText = workbook.CreateCellStyle();
styleText.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
styleText.SetFont(fontText); // 数据行索引
int rowIndex = ; for (int i = ; i < dt.Rows.Count; i++)
{
if (i == || i % == )
{
// Excle 2003 及以前的版本单个 sheet 最多只支持 65535 行,超出后重新创建 sheet
if (i > ) sheet = workbook.CreateSheet(); // 设置表头
IRow headerRow = sheet.CreateRow();
foreach (DataColumn column in dt.Columns)
{
int columnIndex = column.Ordinal; headerRow.CreateCell(columnIndex).SetCellValue(column.Caption);
headerRow.GetCell(columnIndex).CellStyle = headStyle;
sheet.SetColumnWidth(columnIndex, * );
} // 固定首行
sheet.CreateFreezePane(, , , dt.Columns.Count - ); rowIndex = ;
} // 填充数据
IRow dataRow = sheet.CreateRow(rowIndex);
foreach (DataColumn column in dt.Columns)
{
dataRow.CreateCell(column.Ordinal).SetCellValue(Convert.ToString(dt.Rows[i][column]));
dataRow.GetCell(column.Ordinal).CellStyle = styleText;
} rowIndex++;
} // 保存文件
using (MemoryStream ms = new MemoryStream())
{
workbook.Write(ms); using (FileStream fs = new FileStream(fileSaveFullPath, FileMode.Create, FileAccess.Write))
{
byte[] data = ms.ToArray();
fs.Write(data, , data.Length); fs.Flush();
ms.Flush();
}
}
}
catch (Exception ex)
{
throw ex;
}
} /// <summary>
/// 从特定格式的数据字典Excel文件中提取的数据
/// 说明:该方法用于根据数据字典文档来生成数据库表
/// </summary>
/// <param name="fileFullPath">Excel文件路径及名称</param>
/// <returns></returns>
public static List<DataTable> ImportDataFromExcelForGenDbScript(string fileFullPath)
{
IWorkbook workbook = null;
ISheet sheet = null; try
{
using (FileStream fs = new FileStream(fileFullPath, FileMode.Open, FileAccess.Read))
{
if (fileFullPath.IndexOf(".xlsx") > ) // Excle 2007 及以后的版本
workbook = new XSSFWorkbook(fs);
else if (fileFullPath.IndexOf(".xls") > ) // Excle 2003 及以前的版本
workbook = new HSSFWorkbook(fs); fs.Flush();
fs.Close();
} List<DataTable> _dataDictionaryList = new List<DataTable>();
for (int i = ; i < workbook.NumberOfSheets; i++)
{
sheet = workbook.GetSheetAt(i); if (sheet != null)
{
DataTable data = new DataTable();
IRow firstRow = sheet.GetRow(); //从第二行开始才是数据行
int cellCount = firstRow.LastCellNum; //一行最后一个cell的编号 即总的列数(舍去最后一列,因为最后一列有时变成了两列) for (int j = ; j < cellCount; j++)
{
ICell cell = firstRow.GetCell(j);
if (cell != null)
{
string cellValue = cell.StringCellValue;
if (cellValue != null)
{
DataColumn column = new DataColumn(cellValue);
data.Columns.Add(column);
}
}
} int rowCount = sheet.LastRowNum;
for (int k = ; k <= rowCount; ++k)
{
IRow row = sheet.GetRow(k);
if (row == null) continue; //没有数据的行默认是null   
if (row.GetCell(row.FirstCellNum) == null) continue; //如果第一行为空则忽略此行 DataRow dataRow = data.NewRow();
for (int m = row.FirstCellNum; m < cellCount; m++)
if (row.GetCell(m) != null) //同理,没有数据的单元格都默认是null
dataRow[m] = row.GetCell(m).ToString(); data.Rows.Add(dataRow);
} if (data != null)
_dataDictionaryList.Add(data);
}
}
return _dataDictionaryList;
}
catch (Exception ex)
{
throw ex;
}
}
}
}

用 NPOI 组件实现数据导出的更多相关文章

  1. .NET使用NPOI组件将数据导出Excel

    .NPOI官方网站:http://npoi.codeplex.com/ 可以到此网站上去下载最新的NPOI组件版本 2.NPOI在线学习教程(中文版): http://www.cnblogs.com/ ...

  2. NET使用NPOI组件将数据导出Excel-通用方法 【推荐】

    一.Excel导入及导出问题产生:   从接触.net到现在一直在维护一个DataTable导出到Excel的类,时不时还会维护一个导入类.以下是时不时就会出现的问题:   导出问题:   如果是as ...

  3. .NET-使用NPOI组件将数据导出Excel-通用方法

    一.Excel导入及导出问题产生: 从接触.net到现在一直在维护一个DataTable导出到Excel的类,时不时还会维护一个导入类.以下是时不时就会出现的问题:导出问题: 如果是asp.net,你 ...

  4. C#调用NPOI组件读取excel表格数据转为datatable写入word表格中并向word中插入图片/文字/书签 获得书签列表

    调用word的com组件将400条数据导入word表格中耗时10分钟简直不能忍受,使用NPOI组件耗时4秒钟.但是NPOI中替换书签内容的功能不知道是不支持还是没找到. 辅助类 Excel表格数据与D ...

  5. NET使用NPOI组件导出Excel-入门示例及通用方法

    一.Excel导入及导出问题产生:   从接触.net到现在一直在维护一个DataTable导出到Excel的类,时不时还会维护一个导入类.以下是时不时就会出现的问题:   导出问题:   如果是as ...

  6. 使用NPOI将数据导出为word格式里的table

    开发环境:VS2013+MySQL5.5+EF6+NPOI2.0.6 格式:WinForm+CodeFirst PS:vs2013的CodeFirst很方便了啊 CodeFirst方式就不再赘述了. ...

  7. ASP.NET Core 2.2 : 十六.扒一扒新的Endpoint路由方案 try.dot.net 的正确使用姿势 .Net NPOI 根据excel模板导出excel、直接生成excel .Net NPOI 上传excel文件、提交后台获取excel里的数据

    ASP.NET Core 2.2 : 十六.扒一扒新的Endpoint路由方案   ASP.NET Core 从2.2版本开始,采用了一个新的名为Endpoint的路由方案,与原来的方案在使用上差别不 ...

  8. 无插件,无com组件,利用EXCEL、WORD模板做数据导出(一)

    本次随笔主要讲述着工作中是如何解决数据导出的,对于数据导出到excel在日常工作中大家还是比较常用的,那导出到word呢,改如何处理呢,简单的页面导出问题应该不大,但是如果是标准的公文导出呢,要保证其 ...

  9. 使用NPOI,完成数据的导入导出

    解释下流程,第一步:将数据库表中的数据导出到excel表                          第二步:将excel表中的数据再插入到数据库表中(当然没有做重复性校验,测试而已)注:表结构 ...

随机推荐

  1. MongoDB小结26 - 地理空间索引

    现在有一种查询变得越来越流行(尤其是移动设备):找到离当前位置最近的N个场所. MongoDB专为平面坐标查询做了专门的索引,称为地理空间索引. 同样需要用ensureIndex创建,不过,参数是两个 ...

  2. Java正则表达式过滤出字母、数字和中文

    原文:http://blog.csdn.net/k21325/article/details/54090066 1.Java中过滤出字母.数字和中文的正则表达式 (1)过滤出字母的正则表达式 [^(A ...

  3. [52ABP系列] - 002、模板项目配合代码生成器开发

    前言 本篇的主要内容是 52ABP SPA模板如何配合52ABP代码生成器开发项目 如果不了解 52ABP 项目请先看我的第一篇文章 [52ABP系列] - 001.SPA免费项目模版搭建教程 话不多 ...

  4. Hdoj 3697 Selecting courses 【贪心】

    Selecting courses Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 62768/32768 K (Java/Others ...

  5. AE After Effect 如何替换和修改素材

    替换素材:如图所示,相框外的人是成双成对的,相框里面的却只有一个人,我们想要把这个素材替换成两个人的.我们鼠标放到视频预览框的任何一个元素上面底部都会提示这是什么素材.比如我放到一个人的上面,则该人物 ...

  6. 工作总结 2018-4-13 bootstrapTable 属性 queryParams: queryParams,//参数 get 中 %5B%5D 数组的意思

    <table id="dataTable" data-toggle="table" data-show-columns="true" ...

  7. 科普:google的数字图书馆

    https://books.google.com/ngrams Google Ngram Viewer,她利用google所拥有的所有图书作为资源,为你提供单词和短语历年使用次数的展示图标.数据化了数 ...

  8. 1.Urllib2模块使用

    网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地. Urllib2介绍: urllib2 是 Python2.7 自带的模块(不需要下载,导入即可使用) urllib2 官方文 ...

  9. web 开发之js---js 中的定时器setTimeout(function,time),setinterval(function,time)

    ####10秒自动跳转 <div class="jf_register"> <h2>您好,欢迎光临<fmt:message key="b2c ...

  10. Linux进程间通信 共享内存+信号量+简单样例

    每个进程都有着自己独立的地址空间,比方程序之前申请了一块内存.当调用fork函数之后.父进程和子进程所使用的是不同的内存. 因此进程间的通信,不像线程间通信那么简单.可是共享内存编程接口能够让一个进程 ...