用 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表中的数据再插入到数据库表中(当然没有做重复性校验,测试而已)注:表结构 ...
随机推荐
- 莫(meng)比(bi)乌斯反演--BZOJ2301: [HAOI2011]Problem b
n<=50000个询问,每次问a<=x<=b,c<=y<=d中有多少gcd(x,y)=K的(x,y).a,b,c,d,K<=50000. 这大概是入门题辣..这里记 ...
- Thinkphp5.0 的视图view的比较标签
Thinkphp5.0 的视图view的比较标签 {eq name="a" value="10"} <p>相等</p> {else/} ...
- [bzoj2463][中山市选2009]谁能赢呢?_博弈论
博弈论 bzoj-2463 中山市选-2009 题目大意:题目链接. 注释:略. 想法: 如果$n$是偶数的话就可以被多米诺骨牌恰好覆盖,这样的话只需要先手先走向(1,1)对应的第二段,后者必定会将棋 ...
- Ubuntu 16.04下Redis Cluster集群搭建(官方原始方案)
前提:先安装好Redis,参考:http://www.cnblogs.com/EasonJim/p/7599941.html 说明:Redis Cluster集群模式可以做到动态增加节点和下线节点,使 ...
- tsdb import 相关
今天一直在做opentsdb 大量导入数据的工作. 中间遇到了一些值得记录的问题, 这里随手记一下 明天好好整理 1. 多进程logger python的logging模块不支持多进程,但我们可以用s ...
- Solid Edge性质管理者 如何获取装配体的BOM表 物料清单
工具-性质管理者 在里面可以输入每个文件的文件号,版本号,作者等信息 右击点击显示性质,你还可以添加或删除文件属性 把需要的属性更改好了之后,可以输出装配体的所有零件信息到Excel中,点击工 ...
- 怎样托管你的项目到github上具体教程
本文将具体介绍怎样托管你的项目到github上 转载请标明出处: http://blog.csdn.net/lxk_1993/article/details/50441442 本文出自:[lxk_19 ...
- (六)Net Core项目使用Controller之一 c# log4net 不输出日志 .NET Standard库引用导致的FileNotFoundException探究 获取json串里的某个属性值 common.js 如何调用common.js js 筛选数据 Join 具体用法
(六)Net Core项目使用Controller之一 一.简介 1.当前最流行的开发模式是前后端分离,Controller作为后端的核心输出,是开发人员使用最多的技术点. 2.个人所在的团队已经选择 ...
- Gif验证码类
package com.paic.bics.common.utils.vcode; import java.awt.AlphaComposite; import java.awt.Color; imp ...
- hdu1115 Lifting the Stone(几何,求多边形重心模板题)
转载请注明出处:http://blog.csdn.net/u012860063 题目链接:pid=1115">http://acm.hdu.edu.cn/showproblem.php ...