之前在做一个项目的时候,客户方面只提供了一份简单的Excel文件,且要跟现有数据进行对接。

    当时想到的是如果数据量不大,可以Excel一条一条加进去,无奈数据有几十兆!!!

    换了一种思维,进行了导入;当时也试了网上各种帮助类,无奈不是这种问题就是那种问题,甚至还有乱码问题。

    代码虐我千百遍,我待程序如初恋!

    走起,自己写!

    

    分别对现有的Excel文档内容进行了List和DataTable转换:

    Excel转DataTable:

  

  /// <summary>
/// Excel导入到DataTable
/// </summary>
/// <param name="filename">文件名称和路径</param>
/// <param name="sheetname">表名</param>
/// <param name="rowindex">第几行开始</param>
/// <returns></returns>
public static DataTable ExcelToDataTable(string filename, string sheetname = "", int rowindex = )
{
DataTable dt = new DataTable();
using (FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read))
{
IWorkbook workbook = new HSSFWorkbook(fs);
ISheet sheet = !sheetname.IsNullOrEmpty() ? workbook.GetSheet(sheetname) : workbook.GetSheetAt();
if (sheet != null)
{
IRow firstrow = sheet.GetRow(rowindex);
int cellcount = firstrow.LastCellNum; for (int i = firstrow.FirstCellNum; i < cellcount; ++i)
{
ICell cell = firstrow.GetCell(i);
string cellValue = cell?.StringCellValue;
if (cellValue == null) continue;
DataColumn column = new DataColumn(cellValue);
dt.Columns.Add(column);
}
rowindex = sheet.FirstRowNum + ;
int rowcount = sheet.LastRowNum;
for (int i = rowindex; i <= rowcount; ++i)
{
IRow row = sheet.GetRow(i);
if (row == null) continue; DataRow dataRow = dt.NewRow();
for (int j = row.FirstCellNum; j < cellcount; ++j)
{
if (row.GetCell(j) != null)
dataRow[j] = row.GetCell(j).ToString();
}
dt.Rows.Add(dataRow);
}
}
}
return dt;
} 调用方法:
  /// <summary>
/// excel导出到dt
/// </summary>
public static void ToDataTable()
{
var table = Excel.ExcelToDataTable("dt7.xls");
}

 

Excel转List:

   /// <summary>
/// Excel导入List对象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="filename">文件名称和路径</param>
/// <param name="sheetindex">第几个表,默认0为第一个</param>
/// <param name="index">从第几行开始导出,默认为1,不导出表头</param>
/// <returns></returns>
public static List<T> ExcelToList<T>(string filename, int sheetindex = , int index = ) where T : new()
{
List<T> list = new List<T>();
using (FileStream fileStream = new FileStream(filename, FileMode.Open, FileAccess.Read))
{
IWorkbook workbook = new HSSFWorkbook(fileStream);
ISheet sheet = workbook.GetSheetAt(sheetindex);
int startindex = sheet.FirstRowNum;
int endindex = sheet.LastRowNum;
if (index == )
{
startindex += ;
endindex += ;
}
for (int i = startindex; i < endindex; i++)
{
var entity = new T();
IRow row = sheet.GetRow(i);
if (row.Cells.Count > )
{
int j = ;
foreach (PropertyInfo item in typeof(T).GetProperties())
{
if (!Ignore.IgnoreField(item.Name))
continue; ICell cell = row.GetCell(j);
if (cell != null)
{
item.SetValue(entity, ConvertExtension.ChangeType(cell.StringCellValue, item.PropertyType), null);
j++;
}
}
list.Add(entity);
}
}
}
return list;
} 调用方法:
     /// <summary>
/// excel导出到list
/// </summary>
public static void ImportExcel2()
{
var list = Excel.ExcelToList<User>("dt8.xls");
}

 

OK,各位看官,这一期的文章Excel导入写到这里喏,感谢大家的支持,您的支持是我的动力!

下一期给大家带来的是常用的Word操作,敬请期待!!!

Asp.Net 常用工具类之Office—Excel导入(5)的更多相关文章

  1. Asp.Net 常用工具类之Office—Excel导出(4)

    开发过程中各类报表导入导出防不胜防,网上也是各种解决方法层出不穷,比如Excel,CSV,Word,PDF,HTML等等... 网上各种导出插件也是层出不穷,NPOI,微软Microsoft.Offi ...

  2. Asp.Net 常用工具类---Config操作(7)

    近期工作比较忙,忙到忘记写博客(自己的借口,主要加班下班后不想动). 月初的时候,打算每两天写一篇博文,分享自己的一些心得和开发体验,无奈现在只写到第六篇,然而时间已经是20号,岁月不饶人! 总想写点 ...

  3. Asp.Net 常用工具类之Office-文档操作(6)

    文档一直是老大难问题,君不知,代码用时方恨少!有一套成熟的文件帮助类能很大程度上减少寻找各种资料的时间. 记得以前做一个业务,需要导出协议,一份可编辑,一份不可编辑.那么Word和PDF是最好的选择, ...

  4. Asp.Net 常用工具类之加密——非对称加密RSA算法

    踏入程序员这个行业也有几年了,几年中有收获(技术加强),有付出(时间和亚健康状态).当然喏,并不后悔,代码路还长!!! On The Way,永不止步!!! 开发过程中也积累了一些自己的经验.代码块和 ...

  5. Asp.Net 常用工具类之加密——对称加密DES算法(2)

    又到周末,下午博客园看了两篇文章,关于老跳和老赵的程序员生涯,不禁感叹漫漫程序路,何去何从兮! 转眼毕业的第三个年头,去过苏州,跑过上海,从一开始的凌云壮志,去年背起行囊默默回到了长沙准备买房,也想有 ...

  6. C#常用工具类——Excel操作类

    /// 常用工具类——Excel操作类 /// <para> ------------------------------------------------</para> / ...

  7. C#常用工具类——Excel操作类(ZT)

    本文转载于: http://www.cnblogs.com/zfanlong1314/p/3916047.html /// 常用工具类——Excel操作类 /// <para> ----- ...

  8. [C#] 常用工具类——文件操作类

    /// <para> FilesUpload:工具方法:ASP.NET上传文件的方法</para> /// <para> FileExists:返回文件是否存在&l ...

  9. PHP常用工具类

    <?php namespace isslib\Util; use think\Config; /** * 常用工具类 * User: xaxiong * Date: 2016/12/19 * T ...

随机推荐

  1. php模式设计之 中介者模式

    中介者模式 中介者模式用于开发一个对象,这个对象能够在类似对象相互之间不直接相互的情况下传送或者调解对这些对象的集合的修改.一般处理具有类似属性,需要保持同步的非耦合对象时,最佳的做法就是中介者模式. ...

  2. redis php sort 函数

    很多人把redis当成一种数据库,其实是利用redis来构造数据库的模型,有那种数据库的味道.但是在怎么构建还是key和value的关系.根真正的关系型数据库还是不一样的.效率高,不方便:方便的,效率 ...

  3. 2015年15+最佳的响应式HTML5网站模板

    015年最好的免费响应式HTML5模板通常用于创建新潮的网站. HTML5是HTML用于创建现代化网站的最新版本.随着这一现代标记语言的出现,网上冲浪的趋势变得越来越智能化越来越酷.几乎每个web开发 ...

  4. --@ui-router——$state服务原版详解

    $state service in module ui.router.state Description $state service is responsible for representing ...

  5. NodeMCU之旅(二):断线自动重连,闪烁连接状态

    事件监听器 NodeMCU采用了事件响应的方式.也就是说,只需为事件设置一个回调函数,当事件发生时,回调函数就会被调用. 注册事件监听器 wif.sta.eventMonReg() 开始监听 wifi ...

  6. iOS oc和swift中协议的使用

    创建一个空的工程 在工程中我们新建一个类 继承与NSObject 定义一个协议‘ @protocol UpdateAlertDelegate <NSObject> //这里的红色字体就是我 ...

  7. jQuery replaceWith replaceAll end的用法

    jQuery replaceWith replaceAll end的用法 <%@ page language="java" import="java.util.*& ...

  8. 持续集成的一些讨论(CI)

    如何保证程序开发的新功能降低BUG,那就是需要他们自己写用测试工具来写测试用例,包括Mocha(JS).Junit(Java).GTest(C++):而上传到SVN或者GIT后,又如何保证能跟原有的功 ...

  9. IE的缓存

    例:在IE中缓存是很难清掉的,用户也不会每次都给你点清理缓存,那是开发人员自己开发才会干的事,所以我们在对接数据的时候,最好采用异步刷新的方式,获取最新数据 方法如下: // 异步刷新,针对IE缓存的 ...

  10. nRF51800 蓝牙学习 进程记录 1:感想

    一直想开一个高大上点的博客,觉得博客园不错,便申请了.一直没时间看,都快忘了,无意间登上提示申请到了.便写个东西看看. 正在学习nRF51822的蓝牙开发板,为了做毕设准备.备考中,一直没时间学,但今 ...