用 NPOI 组件实现数据导出
利用 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 组件实现数据导出的更多相关文章
- .NET使用NPOI组件将数据导出Excel
.NPOI官方网站:http://npoi.codeplex.com/ 可以到此网站上去下载最新的NPOI组件版本 2.NPOI在线学习教程(中文版): http://www.cnblogs.com/ ...
- NET使用NPOI组件将数据导出Excel-通用方法 【推荐】
一.Excel导入及导出问题产生: 从接触.net到现在一直在维护一个DataTable导出到Excel的类,时不时还会维护一个导入类.以下是时不时就会出现的问题: 导出问题: 如果是as ...
- .NET-使用NPOI组件将数据导出Excel-通用方法
一.Excel导入及导出问题产生: 从接触.net到现在一直在维护一个DataTable导出到Excel的类,时不时还会维护一个导入类.以下是时不时就会出现的问题:导出问题: 如果是asp.net,你 ...
- C#调用NPOI组件读取excel表格数据转为datatable写入word表格中并向word中插入图片/文字/书签 获得书签列表
调用word的com组件将400条数据导入word表格中耗时10分钟简直不能忍受,使用NPOI组件耗时4秒钟.但是NPOI中替换书签内容的功能不知道是不支持还是没找到. 辅助类 Excel表格数据与D ...
- NET使用NPOI组件导出Excel-入门示例及通用方法
一.Excel导入及导出问题产生: 从接触.net到现在一直在维护一个DataTable导出到Excel的类,时不时还会维护一个导入类.以下是时不时就会出现的问题: 导出问题: 如果是as ...
- 使用NPOI将数据导出为word格式里的table
开发环境:VS2013+MySQL5.5+EF6+NPOI2.0.6 格式:WinForm+CodeFirst PS:vs2013的CodeFirst很方便了啊 CodeFirst方式就不再赘述了. ...
- 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的路由方案,与原来的方案在使用上差别不 ...
- 无插件,无com组件,利用EXCEL、WORD模板做数据导出(一)
本次随笔主要讲述着工作中是如何解决数据导出的,对于数据导出到excel在日常工作中大家还是比较常用的,那导出到word呢,改如何处理呢,简单的页面导出问题应该不大,但是如果是标准的公文导出呢,要保证其 ...
- 使用NPOI,完成数据的导入导出
解释下流程,第一步:将数据库表中的数据导出到excel表 第二步:将excel表中的数据再插入到数据库表中(当然没有做重复性校验,测试而已)注:表结构 ...
随机推荐
- SQL SERVER 2012 第三章 T-SQL 基本SELECT语句用法,Where子句详细用法
select [all|distinct] [top (<expression>) [Percent] [with ties]] <column list> [from < ...
- Ubuntu 16.04 LTS GNOME版本下载
下载地址: http://cdimage.ubuntu.com/ubuntu-gnome/releases/ Ubuntu GNOME发行版本启动已经有三年的时间了,在社区用户对于在稳定可靠的Ubun ...
- git: 保存帐号信息
One line command: git config credential.helper store
- x86CPU 实模式 保护模式 傻傻分不清楚? 基于Xv6-OS 分析CR0 寄存器
基于Xv6-OS 分析CR0 寄存器 之前一直认为晕乎乎的...啥?什么时候切换real model,怎么切换,为什么要切换? ------------------------------------ ...
- Codeforces Round #271 (Div. 2) D. Flowers (递推 预处理)
We saw the little game Marmot made for Mole's lunch. Now it's Marmot's dinner time and, as we all kn ...
- FaceBook开源库Fresco
讨论学习使用 关于 Fresco Fresco 是一个强大的图片载入组件. Fresco 中设计有一个叫做 image pipeline 的模块.它负责从网络.从本地文件系统.本地资源载入图片. 为了 ...
- 11种常见sqlmap使用方法
sqlmap是渗透中常用的一个注入工具,其实在注入工具方面,一个sqlmap就足够用了,只要你用的熟,秒杀各种工具,只是一个便捷性问题. 一.SQLMAP用于Access数据库注入 (1) 猜解是否能 ...
- 使用heartbeat+monit实现主备双热备份系统
一.使用背景 项目须要实现主备双热自己主动切换的功能,保证系统7*24小时不间断执行.现已有两台双网卡的IBM的server,为了不再添加成本採购独立外部存储设备和双机热备软件.採用了linux下开源 ...
- HTML5----CSS3图片滤镜(filter)特效
支持Chrome: 暂不支持浏览器:FF,IE... 希望后者努力 效果图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGFteXM=/font/5a ...
- 操作系统学习笔记:CPU调度
CPU调度的目的在于提高CPU利用率,不让CPU闲着.CPU是宝贵的资源,如果有一个进程,本来在CPU中运行,忽然因为要使用IO资源,于是转而请求IO,这边CPU挂起,造成就绪队列中的其他进程等待,这 ...