利用 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. Warm up-HUD4612(树的直径+Tarjin缩点)

    http://acm.hdu.edu.cn/showproblem.php?pid=4612 题目大意:求加一条边最小的桥数 先用Tarjin缩点求出一棵树,然后用bfs求出树的直径,树的直径就是加一 ...

  2. iis站点内存泄漏问题分析

    在一次上线过程中iis内存飙升,随后跟运维要到站点的dump文件,使用windbg分析了clr的内存分配,找到了问题的症结,先记录如下: 使用windbg加载dump文件 1.打开windbg,Fil ...

  3. git: 保存帐号信息

    One line command: git config credential.helper store

  4. Python学习系列之反射

    反射的定义 根据字符串的形式去某个对象中操作成员 根据字符串的形式去某个对象中寻找成员 根据字符串的形式去某个对象中设置成员 根据字符串的形式去某个对象中删除成员 根据字符串的形式去某个对象中判断成员 ...

  5. Windows Update 的工具

    Windows Update MiniTool 是一款管理 Windows Update 的工具,可以取得微軟 Windows 修補程式更新包,Windows Update 是我們用來升級系統的元件, ...

  6. 1064 - You have an error in your SQL syntax问题解决

    新建表sql语句例如以下,在navicat for mysql 中执行,报错. CREATE TABLE `t_article`( `bh` bigint(20) NOT NULL PRIMARY K ...

  7. 贪吃蛇 c++ ncurses

    近期学ncurses.用贪吃蛇训练下 思路:不构造链表.蛇头向前进方向打点,蛇尾逐点消失,形成移动. 须要记录蛇头方向,蛇尾方向.并用list仿造队列,增加拐点信息(空间比链表每一个结点开辟空间节省非 ...

  8. Ganglia API安装与使用

    Ganglia监控本身没有提供API可供外部程序调用,只是依据ganglia监控的原理,能够通过分析gmetad的port的xml来直接获取metrics. Guardian已经在Github上公布了 ...

  9. Ext sqlserver C# 数据库备份还原代码,给大家参考下

      <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<dynamic>" %& ...

  10. grep结合awk简单用法

    一.grep简介: grep (缩写来自Globally search a Regular Expression and Print)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行 ...