一、导入excel时要解析文件,我们直接用下面的帮助数来解析就可以了,开始是上使用该类的方法

private void ImportPlanPersonFromExcel(HttpContext context)
{
try
{
context.Response.ContentType = "text/plain";
context.Response.Charset = "utf-8";
string planIdStr = context.Request.QueryString["planId"];
if (string.IsNullOrEmpty(planIdStr))
{
planIdStr = context.Request["planId"];
}
int planId = int.Parse(planIdStr);
HttpPostedFile file = context.Request.Files["Filedata"];
List<ImportPlanPersonExcel> ippe = new List<ImportPlanPersonExcel>();
//接受到的文件流为空或者大小为0
if (file == null || file.ContentLength == )
{
if (context.Session["CheckPassPlanperson"] != null)
{
ippe = (List<ImportPlanPersonExcel>)context.Session["CheckPassPlanperson"];
}
else
{
throw new Exception("文件不能为空!");
} }
else
{
//获取文件名称
var lastnam = Path.GetExtension(file.FileName).ToLower();
ippe = ExcelHelper.ReadExcel<ImportPlanPersonExcel>(new[] { "IndexNo", "Name", "Position", "JobName", "CountryName", "StartDate", "MissionType", "Explain", "Remark" }, file.InputStream, lastnam);
} string currUserUnitCode = ProfileHelper.GetCurrentUsersUnitCode();
string msg = SaveToDB(ippe, planId, currUserUnitCode);
if (string.IsNullOrEmpty(msg))
context.Response.Write("ok");
else
context.Response.Write(msg);
}
catch (Exception ex)
{
context.Response.Write(ex.Message);
}
}

二、解析excel帮助类

//缺少编译器要求的成员“ystem.Runtime.CompilerServices.ExtensionAttribute..ctor”
namespace System.Runtime.CompilerServices
{
public class ExtensionAttribute : Attribute { }
} namespace OilDigital.CGGL.Web
{
public static class ExcelHelper
{
/// <summary>
/// 获取单元格的值
/// </summary>
/// <param name="sheet">Excel sheet表名称</param>
/// <param name="rowIndex">行索引</param>
/// <param name="cellIndex">列索引</param>
/// <returns>行索引和列索引从0开始</returns>
///这个方法是用来检查如果你不知道你的单元格里的值是什么类型的就可以用这个方法检查
///返回的字符串代表了单元格内容的值类型
public static string GetCellValue(this ISheet sheet, int rowIndex, int cellIndex)
{
string returnValue = string.Empty;
//拼接的条件
if (sheet != null)
{
//如果当前的sheet不等于空 则获取索引行的值
var row = sheet.GetRow(rowIndex);
if (row != null)
{
//如果行内容不为空 则获取列
var cell = row.GetCell(cellIndex);
if (cell != null)
{
//列也不为空则判断列中的值的类型
switch (cell.CellType)
{
//如果为string类型,则返回String类型
case CellType.String:
returnValue = cell.StringCellValue;
break;
//如果是数字类类型
case CellType.Numeric:
//判断是否为日期类型
if (DateUtil.IsCellDateFormatted(cell))
{
//是日期类型则转化成日期输出
returnValue = DateTime.FromOADate(cell.NumericCellValue).ToString();
}
else
{
//输出数字类型
returnValue = Convert.ToDouble(cell.NumericCellValue).ToString();
}
break;
//是否是bool类型
case CellType.Boolean:
returnValue = Convert.ToString(cell.BooleanCellValue);
break;
//错误函数类型
case CellType.Error:
returnValue = ErrorEval.GetText(cell.ErrorCellValue);
break;
case CellType.Formula:
switch (cell.CachedFormulaResultType)
{
case CellType.String:
string strFORMULA = cell.StringCellValue;
if (strFORMULA != null && strFORMULA.Length > )
{
returnValue = strFORMULA.ToString();
}
break;
case CellType.Numeric:
returnValue = Convert.ToString(cell.NumericCellValue);
break;
case CellType.Boolean:
returnValue = Convert.ToString(cell.BooleanCellValue);
break;
case CellType.Error:
returnValue = ErrorEval.GetText(cell.ErrorCellValue);
break;
default:
break;
}
break;
default: break;
}
}
}
}
return returnValue.Trim();
}
/// <summary>
/// Excel导入
/// </summary>
/// <typeparam name="T">这个方法是将Excle转化成泛型导入</typeparam>
/// <param name="columns">数组形式 列头</param>
/// <param name="excelStream">文件流</param>
/// <param name="excelType">文件类型</param>
/// <returns>这是Excel导入List泛型导入</returns>
public static List<T> ReadExcel<T>(string[] columns, Stream excelStream, string excelType = ".xlsx")
{
//先建立一个泛型
var result = new List<T>();
int j=, k=;
try
{
//创建一个空的文件薄
IWorkbook workbook = null;
//如果文件类型为xlsx
//做这个判断使检测Excel的版本的
if (excelType == ".xlsx")
{
//空的文件博等于XSSFWorkbook读取文件流
workbook = new XSSFWorkbook(excelStream);
}
else
{
//如果是.xls就是HSSFWorkbook读取文件流
workbook = new HSSFWorkbook(excelStream);
}
//工作簿是否大于零?如果大于零获取第一个工作薄的内容,否则空值
ISheet sheet = workbook.NumberOfSheets > ? workbook.GetSheetAt() : null;
if (sheet == null)
{
//工作薄如果为空值 转化失败
return result;
}
//这里定义的是反射类型
var type = typeof(T);
//遍历工作薄的内容 for (j = ; j <= sheet.LastRowNum-; j++)//第一行默认是表头再去掉后面的说明的1行
{ //动态创建动态类
var model = Activator.CreateInstance(type);
//行的值来自于sheet获取坐标为j的内容 因为第一行默认为表头,所以j从1开始
IRow row = sheet.GetRow(j);
if (row != null)
{
//columns导入的Excel标题头
for ( k = ; k < columns.Length; k++)
{
//pro得到的列头的类型
var pro = type.GetProperty(columns[k]);
if (pro != null)
{
//声明一个弱类型
Object value;
//列值获取
ICell cell = row.GetCell(k);
//处理获取到的列值类型
switch (cell.CellType)
{
case CellType.Blank: //空数据类型处理
value = null;
break;
case CellType.String: //字符串类型
value = cell.StringCellValue;
break;
case CellType.Numeric: //数字类型
if (DateUtil.IsCellDateFormatted(cell))//日期类型
{
value = cell.DateCellValue;
}
else//其他数字类型
{
value = cell.NumericCellValue;
}
break;
case CellType.Formula:
HSSFFormulaEvaluator e = new HSSFFormulaEvaluator(workbook);
value = e.Evaluate(cell).StringValue;
break;
default:
value = null;
break;
}
if (value != null)
{ if (pro.GetType().Name == typeof(string).Name)
{
//插入值
pro.SetValue(model, Convert.ChangeType(value.ToString(), pro.PropertyType), null);
}
else
pro.SetValue(model, Convert.ChangeType(value, pro.PropertyType), null);
}
}
}
//将得到的值插入到T中(将T强制转化为Model类)
result.Add((T)model);
}
}
}
catch (Exception ex)
{
throw new Exception("excel读取失败:第"+j+"行第"+k+"列数据错误:", ex);
}
return result;
} /// <summary>
/// 将sheet中的数据导出到datatable中
/// </summary>
/// <param name="sheet">需要导出的sheet</param>
/// <param name="HeaderRowIndex">表头所在行号,-1表示没有表头</param>
/// <returns>将Excel导出成Datatable</returns>
private static DataTable ImportDt(ISheet sheet, int HeaderRowIndex, bool needHeader)
{
//新创建一个datatable
DataTable table = new DataTable();
IRow headerRow;
int cellCount;
try
{
//表头索引小于零时 输出表头
if (HeaderRowIndex < || !needHeader)
{
//获取行索引为sheet表第一行
headerRow = sheet.GetRow();
//获取不为空的列个数
cellCount = headerRow.LastCellNum;
//获取第一列的值
for (int i = headerRow.FirstCellNum; i <= cellCount; i++)
{
DataColumn column = new DataColumn(Convert.ToString(i));
table.Columns.Add(column);
}
}
else
{
//获取行内容
headerRow = sheet.GetRow(HeaderRowIndex);
cellCount = headerRow.LastCellNum;
//获取第一行第一个单元格内容
for (int i = headerRow.FirstCellNum; i <= cellCount; i++)
{
if (headerRow.GetCell(i) == null)
{
if (table.Columns.IndexOf(Convert.ToString(i)) > )
{
DataColumn column = new DataColumn(Convert.ToString("重复列名" + i));
table.Columns.Add(column);
}
else
{
DataColumn column = new DataColumn(Convert.ToString(i));
table.Columns.Add(column);
} }
else if (table.Columns.IndexOf(headerRow.GetCell(i).ToString()) > )
{
DataColumn column = new DataColumn(Convert.ToString("重复列名" + i));
table.Columns.Add(column);
}
else
{
DataColumn column = new DataColumn(headerRow.GetCell(i).ToString());
table.Columns.Add(column);
}
}
}
int rowCount = sheet.LastRowNum;
for (int i = (HeaderRowIndex + ); i <= sheet.LastRowNum; i++)
{
try
{
IRow row;
if (sheet.GetRow(i) == null)
{
row = sheet.CreateRow(i);
}
else
{
row = sheet.GetRow(i);
} DataRow dataRow = table.NewRow(); for (int j = row.FirstCellNum; j <= cellCount; j++)
{
try
{
if (row.GetCell(j) != null)
{
switch (row.GetCell(j).CellType)
{
case CellType.String:
string str = row.GetCell(j).StringCellValue;
if (str != null && str.Length > )
{
dataRow[j] = str.ToString();
}
else
{
dataRow[j] = null;
}
break;
case CellType.Numeric:
if (DateUtil.IsCellDateFormatted(row.GetCell(j)))
{
dataRow[j] = DateTime.FromOADate(row.GetCell(j).NumericCellValue);
}
else
{
dataRow[j] = Convert.ToDouble(row.GetCell(j).NumericCellValue);
}
break;
case CellType.Boolean:
dataRow[j] = Convert.ToString(row.GetCell(j).BooleanCellValue);
break;
case CellType.Error:
dataRow[j] = ErrorEval.GetText(row.GetCell(j).ErrorCellValue);
break;
case CellType.Formula:
switch (row.GetCell(j).CachedFormulaResultType)
{
case CellType.String:
string strFORMULA = row.GetCell(j).StringCellValue;
if (strFORMULA != null && strFORMULA.Length > )
{
dataRow[j] = strFORMULA.ToString();
}
else
{
dataRow[j] = null;
}
break;
case CellType.Numeric:
dataRow[j] = Convert.ToString(row.GetCell(j).NumericCellValue);
break;
case CellType.Boolean:
dataRow[j] = Convert.ToString(row.GetCell(j).BooleanCellValue);
break;
case CellType.Error:
dataRow[j] = ErrorEval.GetText(row.GetCell(j).ErrorCellValue);
break;
default:
dataRow[j] = "";
break;
}
break;
default:
dataRow[j] = "";
break;
}
}
}
catch (Exception exception)
{
throw new Exception(exception.Message);
}
}
table.Rows.Add(dataRow);
}
catch (Exception exception)
{
throw new Exception(exception.Message);
}
}
}
catch (Exception exception)
{
throw new Exception(exception.Message);
}
return table;
}
}
}

NPOI excel文件解析的更多相关文章

  1. NPOI+Json文件解析Excel

    记点笔记,加深印象!最近有个导入Excel工能需要完成,Excel列名是中文的,导入Excel我用的NPOI插件,如果不对Excel做解析,列名有可能会给我带来一些字符方面的麻烦,于是想到了一个比较l ...

  2. java使用POI进行 Excel文件解析

    package com.timevale.esign.vip.util; import java.io.File; import java.io.FileInputStream; import jav ...

  3. 关于Npoi+excel文件读取,修改文件内容的处理方式

    因最近有需求场景,实现对文件的读写操作,又不单独生成新的文件,对于源文件的修改,做了一个简单实现,如下↓ // 要操作的excel文件路径 string fileName = Server.MapPa ...

  4. vue下载和上传excle数据文件,解析excel文件数据并存在数据库中

    下载: VUE: window.open("xxxx/downloadOldTaskDataFile.do_", "_blank"); JAVA: /** * ...

  5. 使用(POI)SAX处理Excel文件,防止内存溢出

    POISAXReader h2:first-child, body>h1:first-child, body>h1:first-child+h2, body>h3:first-chi ...

  6. 【转】java将excel文件转换成txt格式文件

    在实际应用中,我们难免会遇到解析excel文件入库事情,有时候为了方便,需要将excel文件转成txt格式文件.下面代码里面提供对xls.xlsx两种格式的excel文件解析,并写入到一个新的txt文 ...

  7. Java使用jxl.jar包写Excel文件的最适合列宽问题基本实现

    以前用jxl.jar包,读写过Excel文件.也没有注意最适合列宽的问题,但是jxl.jar没有提供最适合列宽的功能,上次用到写了一下,可以基本实现最适合列宽. 注意,这个只是基本可以实现,基本针对中 ...

  8. NPOI操作EXCEL(四)——反射机制批量导出excel文件

    前面我们已经实现了反射机制进行excel表格数据的解析,既然有上传就得有下载,我们再来写一个通用的导出方法,利用反射机制实现对系统所有数据列表的筛选结果导出excel功能. 我们来构想一下这样一个画面 ...

  9. C#仪器数据文件解析-Excel文件(xls、xlsx)

    不少仪器工作站可以将数据导出为Excel文件,包括97-2003版本的xls文件和2007+的xlsx文件. 采集Excel文件相比采集pdf文件更容易.程序更健壮,毕竟Excel中数据有明确的行.列 ...

随机推荐

  1. BHO插件操作IE浏览器,js调用C#方法

    BHO是IE浏览器的扩展程序,全名Browser Helper Object,文件格式为DLL文件.可对IE浏览器的界面和访问内容进行修改操作.BHO只适用于IE浏览器,对其他任何浏览器都没有作用.( ...

  2. 爬虫开发6.selenuim和phantonJs处理网页动态加载数据的爬取

    selenuim和phantonJs处理网页动态加载数据的爬取阅读量: 1203 动态数据加载处理 一.图片懒加载 什么是图片懒加载? 案例分析:抓取站长素材http://sc.chinaz.com/ ...

  3. 整理javascript基础

    原始类型值(Primitive values) 下面的全是原始类型值(简称:原始值): 布尔类型:true,false 数字类型:1736,1.351 字符串类型: 'abc',"abc&q ...

  4. [Flex] 组件Tree系列 —— 运用openItems获取打开节点

    mxml: <?xml version="1.0" encoding="utf-8"?> <!--功能描述:运用openItems获取打开节点 ...

  5. MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled

    初试redis,删除或者修改值的时候报的错,解决方式是运行命令: 127.0.0.1:6379> config set stop-writes-on-bgsave-error no

  6. 2016级算法第五次上机-A.Beihang Collegiate Pronunciation Contest 2017

    1065 Beihang Collegiate Pronunciation Contest 2017 思路 在字符串中不断做匹配 找到一个匹配就输出 时间复杂度\(O(n)\) ps.模式串是定长的, ...

  7. NavigatorIOS

    使用 NavigatorIOS,我们需要给他指定一个路由,这样它才能知道显示哪个页面 实例化 Navigator 需要2个必要的属性 —— initialRoute 和 renderSence,它们的 ...

  8. 2019年华南理工大学程序设计竞赛(春季赛) K Parco_Love_String(后缀自动机)找两个串的相同字串有多少

    https://ac.nowcoder.com/acm/contest/625/K 题意: 给出Q 个询问 i , 求 s[0..i-1] 与 s[i...len-1] 有多少相同的字串 分析: 给出 ...

  9. 为什么要选择RabbitMQ ,RabbitMQ简介,各种MQ选型对比

    原文:https://www.sojson.com/blog/48.html 前言: MQ 是什么?队列是什么,MQ 我们可以理解为消息队列,队列我们可以理解为管道.以管道的方式做消息传递. 场景: ...

  10. CentOS&.NET Core初试系列

    目的 对前段时间学习.NET Core的知识进行一次入门篇的总结,希望加深印象同时帮助刚学同学少走一些坑. 目录 CentOS的安装和网卡的配置 安装.NET Core SDK和发布网站 Nginx的 ...