利用 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. 【Tomcat】tomcat logs 目录下各日志文件的含义

      tomcat每次启动时,自动在logs目录下生产以下日志文件,按照日期自动备份.可以帮助我们更好的找出错误.   一. 认识各种目录的作用及记录的信息 目录

  2. 1017 乘积最大 2000年NOIP全国联赛普及组NOIP全国联赛提高组

    1017 乘积最大 2000年NOIP全国联赛普及组NOIP全国联赛提高组   #include <iostream> #include <string> #include & ...

  3. hdu4701 Game(递推博弈)

    题意: Alice初始有A元,Bob有B元. 有N个物品,第i个物品价值为Ci.Alice和Bob轮流买一些(>=1)物品.不能移动的人输.购买有一个限制,对于第1 个之后物品,只有当第i-1个 ...

  4. 洛谷 P1018 乘积最大

    P1018 乘积最大 题目描述 今年是国际数学联盟确定的“ 20002000 ――世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰 9090 周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学 ...

  5. ArcGIS Python 编码问题

    吐槽一下ArcGIS自带的 Python IDE, 没有代码补全 没有函数提示 没有代码折叠 没有行号 撤销操作还有问题 字符编码还有各种问题 .........   花了2天时间才琢磨出来的经验 环 ...

  6. Redis集群主备模式部署

    网上有非常多用Ruby安装Redis-cluster的文章.可是在实际环境下不想安装Ruby,所以本文主要介绍了用Redis命令部署Redis集群.而且为集群中每个master实例添加一个slave实 ...

  7. P-Called-Party-ID头域

    典型的proxy server在路由 INVITE 请求到目标时插入 P-Called-Party-ID 头域.该头域用 porxy 收到请求的 Request-URI 填写. UAS 从几个已注冊的 ...

  8. hiho一下 第五十一周(有向图欧拉路径)51

    //////////////////////////////////////////////////////////////////////////////////////////////////// ...

  9. Apache2.2安装

    貌似Apache官网从2.2.X之后不再发布Windows安装版本,需要的话得自己编译 从官网下载2.2.25(我下了一个no-ssl的),安装提示 因为本机已经安装IIS,占用80端口,修改Apac ...

  10. 01排序的Java实现

    比赛描写叙述: 的个数同样时再按ASCII码值排序. 输入: 个字符. 输出: 串的顺序.使得串按基本描写叙述的方式排序. 例子输入: 例子输出: 被AC的代码例如以下: import java.ut ...