NPOI读取Excel表格类
public class NPOIHelper
{
private HSSFWorkbook workbook;
public static IWorkbook LoadFromFile(string filepath)
{
using (FileStream fi = new FileStream(filepath, FileMode.Open, FileAccess.Read))
{
return new HSSFWorkbook(fi);
}
}
public static ISheet CreateSheet(string sheetname, IWorkbook workbook)
{
return workbook.CreateSheet(sheetname);
}
public ISheet WriteToTemplate<T>(IList<T> datalist, string sheetname, int fieldstartrowindex, int fieldstartcolindex, int datastartrowindex)
{
return null;
}
public NPOIHelper(string filetemplatepath)
{
workbook = (HSSFWorkbook)LoadFromFile(filetemplatepath);
}
/// <summary>
/// 将List对象转为SHEET
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sheetname"></param>
/// <param name="data"></param>
/// <param name="titlerowindex">表头列</param>
/// <param name="datarowindex">表数据列</param>
/// <returns></returns>
public int ConvertTOSheet<T>(string sheetname, IList<T> data, int titlerowindex, int datarowindex)
where T : new()
{
ISheet sheet = workbook.GetSheet(sheetname);
IRow titlerow = sheet.GetRow(titlerowindex);
int rowstartindex = titlerow.FirstCellNum;
int rowlastindex = titlerow.LastCellNum;
IDictionary<int, string> fieldindexdic = new Dictionary<int, string>();
for (int i = rowstartindex; i <= rowlastindex; i++)
{
ICell cell = titlerow.GetCell(i);
if (cell != null)
{
string fieldstr = cell.ToString();
if (!string.IsNullOrEmpty(fieldstr))
{
fieldindexdic.Add(cell.ColumnIndex, fieldstr.ToUpper());
}
}
}
IEnumerable<string> fieldtitle = fieldindexdic.Select(x => x.Value).Distinct();
IDictionary<string, PropertyInfo> pifdic = GetPropertyInfoDic<T>(fieldtitle);
for (int i = 0; i < data.Count; i++)
{
IRow datarow = sheet.CreateRow(datarowindex + i);
foreach (var titlekv in fieldindexdic)
{
object dataobject = pifdic[titlekv.Value].GetValue(data[i], null);
if (dataobject != null)
{
ICell datacell = datarow.CreateCell(titlekv.Key);
datacell.SetCellValue(dataobject.ToString());
}
}
}
return workbook.GetSheetIndex(sheet);
}
public IDictionary<string, PropertyInfo> GetPropertyInfoDic<T>(IEnumerable<string> namelist)
where T : new()
{
IDictionary<string, PropertyInfo> pifdic = new Dictionary<string, PropertyInfo>();
PropertyInfo[] pifs = typeof(T).GetProperties();
IEnumerable<PropertyInfo> filedpifs = pifs.Where(x => namelist.Contains(x.Name.ToUpper()));
foreach (var kv in filedpifs)
{
pifdic.Add(kv.Name.ToUpper(), kv);
}
return pifdic;
}
public void DeleteSheet(string sheetname)
{
int sheetindex = workbook.GetSheetIndex(sheetname);
workbook.RemoveSheetAt(sheetindex);
}
public void Write(Stream sm)
{
workbook.Write(sm);
}
public void DeleteRow(string sheetname, int rowindex)
{
ISheet sheet = workbook.GetSheet(sheetname);
IRow row = sheet.GetRow(rowindex);
sheet.RemoveRow(row);
}
#region add by pcitdbt 2013/11/11
#region 将DataTable的数据读取成MemoryStream
public static MemoryStream RenderToExcel(DataTable dt)
{
MemoryStream ms = new MemoryStream();
using (dt)
{
//创建Workbook
HSSFWorkbook book = new HSSFWorkbook();
ISheet sheet = book.CreateSheet(dt.TableName);
//创建一个日期类型的格式
ICellStyle dataStyle = book.CreateCellStyle();
IDataFormat dataFormat = book.CreateDataFormat();
dataStyle.DataFormat = dataFormat.GetFormat("yyyy-mm-dd");
//创建表头
IRow row = sheet.CreateRow(0);
foreach (DataColumn col in dt.Columns)
{
//给表头添加字段名字
row.CreateCell(col.Ordinal).SetCellValue(col.Caption);//Caption没有值则获取ColumnName
//设置列宽
sheet.SetColumnWidth(col.Ordinal, 30 * 110);
}
//创建数据行并添加值
int rowIndex = 1;//标记数据行的位置
foreach (DataRow dr in dt.Rows)
{
IRow dataRow = sheet.CreateRow(rowIndex);
//通过列来获取值
foreach (DataColumn column in dt.Columns)
{
//判断是否是DataTime类型
ICell newCell = dataRow.CreateCell(column.Ordinal);
string drValue = dr[column].ToString();
switch (column.DataType.ToString())
{
case "System.String"://字符串类型
newCell.SetCellValue(drValue);
break;
case "System.DateTime"://日期类型
DateTime dateV;
DateTime.TryParse(drValue, out dateV);
//newCell.SetCellValue(dateV);
newCell.SetCellValue(drValue);
newCell.CellStyle = dataStyle;//格式化显示
break;
case "System.Boolean"://布尔型
bool boolV = false;
bool.TryParse(drValue, out boolV);
newCell.SetCellValue(boolV);
break;
case "System.Int16"://整型
case "System.Int32":
case "System.Int64":
case "System.Byte":
int intV = 0;
int.TryParse(drValue, out intV);
newCell.SetCellValue(intV);
break;
case "System.Decimal"://浮点型
case "System.Double":
double doubV = 0;
double.TryParse(drValue, out doubV);
newCell.SetCellValue(doubV);
break;
case "System.DBNull"://空值处理
newCell.SetCellValue("");
break;
default:
newCell.SetCellValue("");
break;
}
}
//循环一行后i的值自增1
rowIndex++;
}
book.Write(ms);
ms.Flush();
ms.Position = 0;//指定内存流的当前位置
}
return ms;
}
#endregion
#region 将DataReader的数据转换成MemoryStream并返回
public static MemoryStream RenderToExcel(IDataReader dataReader)
{
MemoryStream ms = new MemoryStream();
using (dataReader)
{
HSSFWorkbook book = new HSSFWorkbook();
ISheet sheet = book.CreateSheet("数据表1");
//创建表头
IRow row = sheet.CreateRow(0);
//列的数目
int columnCount = dataReader.FieldCount;
for (int i = 0; i < columnCount; i++)
{
row.CreateCell(i).SetCellValue(dataReader.GetName(i));
}
//创建数据行
int rowIndex = 1;
while (dataReader.Read())//dataReader只能一行一行地读取数据
{
IRow dataRow = sheet.CreateRow(rowIndex);
for (int i = 0; i < columnCount; i++)
{
dataRow.CreateCell(i).SetCellValue(dataReader[i].ToString());
}
rowIndex++;
}
book.Write(ms);
ms.Flush();
ms.Position = 0;
}
return ms;
}
#endregion
#region 将流输出到指定的位置
//保存输出到文件
public static void SaveToFile(MemoryStream ms, string fileName)
{
using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write))
{
byte[] data = ms.ToArray();
fs.Write(data, 0, data.Length);
fs.Flush();
data = null;
}
}
#endregion
#region 保存输出到浏览器
public static void SaveToBrowser(MemoryStream ms, System.Web.HttpContext context, string fileName)
{
// 设置编码和附件格式
context.Response.ContentType = "application/vnd.ms-excel";
context.Response.ContentEncoding = Encoding.UTF8;
context.Response.Charset = "";
context.Response.AppendHeader("Content-Disposition",
"attachment;filename=" +System.Web.HttpUtility.UrlEncode(fileName, Encoding.UTF8));
//添加请求报文头
//context.Response.AddHeader("Content-Disposition", "attachment;fileName=" + fileName);
context.Response.BinaryWrite(ms.ToArray());
context.Response.End();
}
#endregion
#region NPOI读取Excel流的数据相关
public DataTable ReadFromExcel(Stream excelStream)
{
DataTable dt = new DataTable();
using (excelStream)
{
//创建WorkBook
HSSFWorkbook book = new HSSFWorkbook(excelStream);
ISheet sheet = book.GetSheetAt(0);//获取第一个表
//获取第一行表头
IRow headRow = sheet.GetRow(0);
//列数
int columnCount = headRow.LastCellNum;//LastCellNum=PhysicalNumberOfCells
int rowCount = sheet.LastRowNum;//LastRowNum=PhysicalNumberOfCellsRow-1
//创建DataTable的表头
for (int i = headRow.FirstCellNum; i < columnCount; i++)
{
DataColumn dc = new DataColumn(headRow.GetCell(i).StringCellValue.ToString());
dt.Columns.Add(dc);
}
//创建数据
for (int i = (sheet.FirstRowNum + 1); i <= rowCount; i++)
{
//一行一行地创建
DataRow dr = dt.NewRow();
IRow dataRow = sheet.GetRow(i);
if (dataRow != null)
{
for (int j = headRow.FirstCellNum; j < columnCount; j++)
{
string cellValue = dataRow.GetCell(j).StringCellValue.ToString();
if (cellValue != "" || cellValue != null)
{
dr[j] = dataRow.GetCell(j).StringCellValue.ToString();
}
}
dt.Rows.Add(dr);
}
}
}
return dt;
}
public static int RenderToDb(Stream excelFileStream, string insertSql)
{
int rowAffected = 0;
using (excelFileStream)
{
HSSFWorkbook workbook = new HSSFWorkbook(excelFileStream);
ISheet sheet = workbook.GetSheetAt(0);//取第一个工作表
StringBuilder builder = new StringBuilder();
IRow headerRow = sheet.GetRow(0);//第一行为标题行
int cellCount = headerRow.LastCellNum;//LastCellNum = PhysicalNumberOfCells
int rowCount = sheet.LastRowNum;//LastRowNum = PhysicalNumberOfRows - 1
for (int i = (sheet.FirstRowNum + 1); i <= rowCount; i++)
{
IRow row = sheet.GetRow(i);
if (row != null)
{
builder.Append(insertSql);
builder.Append(" values (");
for (int j = row.FirstCellNum; j < cellCount; j++)
{
builder.AppendFormat("'{0}',", row.GetCell(j).StringCellValue.Replace("'", "''"));
}
builder.Length = builder.Length - 1;
builder.Append(");");
}
if ((i % 50 == 0 || i == rowCount) && builder.Length > 0)
{
//每50条记录一次批量插入到数据库
//rowAffected += dbAction(builder.ToString());
builder.Length = 0;
}
}
}
return rowAffected;
}
public static bool HasData(Stream excelFileStream)
{
using (excelFileStream)
{
HSSFWorkbook workbook = new HSSFWorkbook(excelFileStream);
if (workbook.NumberOfSheets > 0)
{
ISheet sheet = workbook.GetSheetAt(0);
return sheet.PhysicalNumberOfRows > 0;
}
}
return false;
}
#endregion
#endregion
}
NPOI读取Excel表格类的更多相关文章
- 使用NPOI读取Excel表格内容并进行修改
前言 网上使用NPOI读取Excel文件的例子现在也不少,本文就是参考网上大神们的例子进行修改以适应自己需求的. 参考博文 http://www.cnblogs.com/restran/p/38894 ...
- NPOI读取Excel帮助类,支持xls与xlsx,实现公式解析,空行的处理
NPOI读取Excel(2003或者2010)返回DataTable.支持公式解析,空行处理. /// <summary>读取excel /// 默认第一行为表头 /// </sum ...
- 【第二篇】.NET用NPOI读取Excel表格并在页面预览
博主用的是npoi2.0.1,支持.xls也支持.xlsx 直接上代码吧. <table class="table table-bordered table-striped" ...
- .NET Core 使用NPOI读取Excel返回泛型List集合
我是一名 ASP.NET 程序员,专注于 B/S 项目开发.累计文章阅读量超过一千万,我的博客主页地址:https://www.itsvse.com/blog_xzz.html 网上有很多关于npoi ...
- C# 读取Excel表格内容,以及NPOI的使用
在实际的开发中,我们可能需要读写word或者Excel的内容,在我开发的项目中,需要读取Excel的内容,并将相对应的内容存储到数据库中,这里简单跟大家分享一下,希望能够帮助一些人. 我相信在读写wo ...
- 使用NPOI读取Excel数据到DataTable
如今XML文件的存储格式大行其道,可是也不是适用于全部情况,非常多单位的数据交换还是使用Excel的形式.这就使得我们须要读取Excel内的数据.载入到程序中进行处理.可是如何有效率的读取,如何使程序 ...
- Java读取excel表格
Java读取excel表格 一般都是用poi技术去读取excel表格的,但是这个技术又是什么呢 什么是Apache POI? Apache POI是一种流行的API,它允许程序员使用Java程序创建, ...
- poi读取excel工具类
package com.manage.utils; import ch.qos.logback.core.net.SyslogOutputStream; import com.google.gson. ...
- NPOI读取Excel遇到的坑
NPOI是POI的.NET版本.POI是用Java写成的库,能帮助用户在没有安装Office环境下读取Office2003-2007文件.NPOI在.NET环境下使用,能读写Excel/Word文件. ...
随机推荐
- Excel DNA学习笔记一
由于各种原因,被迫学习Excel DNA这个开源项目的使用方法,最后希望可以在其中,调用xll进行编码. 由此整理一下,这期间使用到的一些资料. 1.下载Excel DNA,目前最新的是0.30版 h ...
- C#学习笔记(八):扩展方法
还记得第一次使用DOTween时,发现缓动方法竟然是可以直接用Transform对象中调用到,当时就被震撼到了(那是还是C#小白一只).好了不多说了,今天来学习一下C#的这个特性——扩展方法. 扩展方 ...
- fedora21发布与新功能介绍(附fedora21安装教程与fedora21下载地址)
fedora21发布与新功能介绍(附fedora21安装教程与fedora21下载地址) 最新的Fedora 21终于正式发布了,Fedora Server 是一款强大可定制化的操作系统,包括了最好最 ...
- swift 个人笔记
swift是现代编程语言的综合体,灵活而强大. //http://www.cocoachina.com/newbie/basic/2014/0604/8675.html //语法var 变量,let ...
- Spring声明式事务的配置~~~
/*2011年8月28日 10:03:30 by Rush */ 环境配置 项目使用SSH架构,现在要添加Spring事务管理功能,针对当前环境,只需要添加Spring 2.0 AOP类库即可.添加 ...
- ios 7.1 7.1.1 半完美越狱后 电脑訪问手机越狱文件夹的方法
7.1和7.1.1因为越狱不成熟,半完美越狱后电脑上无法訪问系统越狱文件夹,如var usr 等等. 今天有些意外地发现,能够在电脑上使用手机的越狱文件夹我手机 i4 7.1.1 联通 半完美越狱,没 ...
- Codeforces Gym 100203E E - bits-Equalizer 贪心
E - bits-EqualizerTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest ...
- 【VMware混合云】应用为王
作者:范军 (Frank Fan) 新浪微博:@frankfan7 微信:frankfan7 你可能会问,VMware混合云不是IaaS么,怎么说起应用了? 如果我们回到原始的问题,搭建Infra ...
- 小学生玩ACM----优先队列
思来想去,本人还是觉得,这个优先队列啊,不学不行,怎么说咧?虽说有时候我可以模仿它的功能,但是有的题目会坑的我大放血,况且多学会用一个小东东总不会伤身的撒,何况我是永举不垂的,哦耶,嘿嘿 优先队列嘛就 ...
- slf4j-api-1.7.5日志打印实验
下面一段话来自:百度百科 假设你开发的是类库或者嵌入式组件,那么就应该考虑採用SLF4J,由于不可能影响终于用户选择哪种日志系统.在还有一方面,假设是一个简单或者独立的应用,确定仅仅有一种日志系统,那 ...