封装一个ExcelHelper,方便将Excel直接转成Datatable对象
public class ExcelHelper
{
/// <summary>
/// Excel转换成DataTable
/// </summary>
/// <param name="excelFilePath">excel文件路径</param>
/// <param name="sheetNum">sheet序号</param>
/// <param name="headerRowNum">标题列序号</param>
/// <returns></returns>
public static DataTable ExcelToDataTable(string excelFilePath,int sheetNum=,int headerRowNum=)
{ IWorkbook workbook;
DataTable dt;
string extension = Path.GetExtension(excelFilePath).ToLower();
try
{
using (FileStream fileStream = new FileStream(excelFilePath, FileMode.Open, FileAccess.Read))
{
if (extension == ".xlsx")
{ workbook = new XSSFWorkbook(fileStream); }
else
{ workbook = new HSSFWorkbook(fileStream); }
ISheet sheet = workbook.GetSheetAt(sheetNum);
dt = new DataTable(sheet.SheetName);
IRow headerRow = sheet.GetRow(headerRowNum);
string fieldName = "";
//ArrayList fieldArray = new ArrayList();
/*
增加标题列,author liwx 2016/08/25
*/
for (int i = headerRow.FirstCellNum; i < headerRow.LastCellNum; i++)
{
if (headerRow.GetCell(i) != null)
{
fieldName = headerRow.GetCell(i).ToString().Trim();
//fieldArray.Add(fieldName);
DataColumn column = new DataColumn(fieldName);
dt.Columns.Add(column);
}
else
{
break;
}
} DataRow dr;
IRow row;
ICell cell;
//short format;
for (int i = headerRowNum + ; i <= sheet.LastRowNum; i++)
{
row = sheet.GetRow(i);
if (row != null)
{
dr = dt.NewRow();
for (int j = headerRow.FirstCellNum; j < headerRow.LastCellNum; j++)
{
cell=row.GetCell(j);
if (cell != null)
{
//format = cell.CellStyle.DataFormat;
//if (format == 14 || format == 31 || format == 57 || format == 58)
// dataRow[j] = cell.DateCellValue.ToString("yyyy/MM/dd");//日期转化格式如需要可解开
dr[j] = cell.ToString().Trim() == "" ? null : cell.ToString().Trim();
}
else
{
dr[j] = null;
}
}
dt.Rows.Add(dr);
}
}
}
}
catch (Exception ex)
{
throw ex;
}
return dt;
}
/// <summary>
/// Excel转换成DataTable
/// </summary>
/// <param name="excelFilePath">excel文件路径</param>
/// <param name="sheetName">sheet名称</param>
/// <param name="headerRowNum">标题列序号</param>
/// <returns></returns>
public static DataTable ExcelToDataTable(string excelFilePath, string sheetName, int headerRowNum = )
{ IWorkbook workbook;
DataTable dt;
string extension = Path.GetExtension(excelFilePath).ToLower();
try
{
using (FileStream fileStream = new FileStream(excelFilePath, FileMode.Open, FileAccess.Read))
{
if (extension == ".xlsx")
{ workbook = new XSSFWorkbook(fileStream); }
else
{ workbook = new HSSFWorkbook(fileStream); }
ISheet sheet;
//如果有指定工作表名称
if (!string.IsNullOrEmpty(sheetName))
{
sheet = workbook.GetSheet(sheetName);
//如果没有找到指定的sheetName对应的sheet,则尝试获取第一个sheet
if (sheet == null)
{
sheet = workbook.GetSheetAt();
}
}
else
{
//如果没有指定的sheetName,则尝试获取第一个sheet
sheet = workbook.GetSheetAt();
} dt = new DataTable(sheet.SheetName);
IRow headerRow = sheet.GetRow(headerRowNum);
string fieldName = "";
//ArrayList fieldArray = new ArrayList();
/*
增加标题列,author liwx 2016/08/25
*/
for (int i = headerRow.FirstCellNum; i < headerRow.LastCellNum; i++)
{
if (headerRow.GetCell(i) != null)
{
fieldName = headerRow.GetCell(i).ToString().Trim();
//fieldArray.Add(fieldName);
DataColumn column = new DataColumn(fieldName);
dt.Columns.Add(column);
}
else
{
break;
}
} DataRow dr;
IRow row;
ICell cell;
//short format;
for (int i = headerRowNum + ; i <= sheet.LastRowNum; i++)
{
row = sheet.GetRow(i);
if (row != null)
{
dr = dt.NewRow();
for (int j = headerRow.FirstCellNum; j < headerRow.LastCellNum; j++)
{
cell = row.GetCell(j);
if (cell != null)
{
//format = cell.CellStyle.DataFormat;
//if (format == 14 || format == 31 || format == 57 || format == 58)
// dataRow[j] = cell.DateCellValue.ToString("yyyy/MM/dd");//日期转化格式如需要可解开
dr[j] = cell.ToString().Trim() == "" ? null : cell.ToString().Trim();
}
else
{
dr[j] = null;
}
}
dt.Rows.Add(dr);
}
}
}
}
catch (Exception ex)
{
throw ex;
}
return RemoveEmpty(dt);
}
/// <summary>
/// 获取Excel里Sheet总数
/// </summary>
/// <param name="excelFilePath"></param>
/// <returns></returns>
public static int GetExcelSheetTotal(string excelFilePath)
{
IWorkbook workbook;
DataTable dt;
string extension = Path.GetExtension(excelFilePath).ToLower();
try
{
using (FileStream fileStream = new FileStream(excelFilePath, FileMode.Open, FileAccess.Read))
{
if (extension == ".xlsx")
{ workbook = new XSSFWorkbook(fileStream); }
else
{ workbook = new HSSFWorkbook(fileStream); }
return workbook.NumberOfSheets;
}
}
catch (Exception ex)
{
throw ex;
}
} /// <summary>
/// 将datatable导入到exel
/// </summary>
/// <param name="datatemp"></param>
/// <param name="fileName"></param>
///<param name="removeEmpty">是否去除所有值都为空的列</param>
/// <returns></returns>
public static int DataTableToExcel(DataTable datatemp, string fileName,bool removeEmpty=true)
{
DataTable data = removeEmpty? RemoveEmpty(datatemp): datatemp;
bool isColumnWritten = true;
int i = ;
int j = ;
int count = ;
ISheet sheet = null;
IWorkbook workbook = null;
using (FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
if (fileName.IndexOf(".xlsx") > ) // 2007版本
workbook = new XSSFWorkbook();
else if (fileName.IndexOf(".xls") > ) // 2003版本
workbook = new HSSFWorkbook(); try
{
if (workbook != null)
{
sheet = workbook.CreateSheet("Sheet1");
}
else
{
return -;
} if (isColumnWritten == true) //写入DataTable的列名
{
IRow row = sheet.CreateRow();
for (j = ; j < data.Columns.Count; ++j)
{
row.CreateCell(j).SetCellValue(data.Columns[j].ColumnName);
}
count = ;
}
else
{
count = ;
} for (i = ; i < data.Rows.Count; ++i)
{
IRow row = sheet.CreateRow(count);
for (j = ; j < data.Columns.Count; ++j)
{
row.CreateCell(j).SetCellValue(data.Rows[i][j].ToString());
}
++count;
}
workbook.Write(fs); //写入到excel
return count;
}
catch (Exception ex)
{
Console.WriteLine("Exception: " + ex.Message);
return -;
}
}
} /// <summary>
/// Excel导出成内存流
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public static MemoryStream DataTableToExcel(DataTable data)
{
bool isColumnWritten = true;
int i = ;
int j = ;
int count = ;
IWorkbook workbook =new HSSFWorkbook();
try
{
//添加一个sheet
ISheet sheet = workbook.CreateSheet("Sheet1");
//将数据逐步写入sheet1各个行
if (isColumnWritten == true) //写入DataTable的列名
{
IRow row = sheet.CreateRow();
for (j = ; j < data.Columns.Count; ++j)
{
row.CreateCell(j).SetCellValue(data.Columns[j].ColumnName);
}
count = ;
}
else
{
count = ;
} for (i = ; i < data.Rows.Count; ++i)
{
IRow row = sheet.CreateRow(count);
for (j = ; j < data.Columns.Count; ++j)
{
row.CreateCell(j).SetCellValue(data.Rows[i][j].ToString());
}
++count;
}
// 写入到客户端
MemoryStream ms = new System.IO.MemoryStream();
workbook.Write(ms);
ms.Seek(, SeekOrigin.Begin);
return ms;
}
catch (Exception ex)
{
throw ex;
Console.WriteLine("Exception: " + ex.Message);
return null;
}
} /// <summary>
/// Excel导出成内存流
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public static MemoryStream DataTableToExcel(List<DataTable> dtList,List<string> nameList)
{
IWorkbook workbook = new HSSFWorkbook();
try
{
var data = dtList[];
for (var i=;i<dtList.Count();i++) {
ISheet sheet=string.IsNullOrWhiteSpace(nameList[i]) ?workbook.CreateSheet("Sheet"+(i+)):workbook.CreateSheet(nameList[i]);
WriteSheet(dtList[i],sheet);
}
// 写入到客户端
MemoryStream ms = new System.IO.MemoryStream();
workbook.Write(ms);
ms.Seek(, SeekOrigin.Begin);
return ms;
}
catch (Exception ex)
{
throw ex;
Console.WriteLine("Exception: " + ex.Message);
return null;
}
} private static void WriteSheet(DataTable data,ISheet sheet, bool isColumnWritten=true) {
int i = ;
int j = ;
int count = ;
//将数据逐步写入sheet1各个行
if (isColumnWritten == true) //写入DataTable的列名
{
IRow row = sheet.CreateRow();
for (j = ; j < data.Columns.Count; ++j)
{
row.CreateCell(j).SetCellValue(data.Columns[j].ColumnName);
}
count = ;
}
else
{
count = ;
} for (i = ; i < data.Rows.Count; ++i)
{
IRow row = sheet.CreateRow(count);
for (j = ; j < data.Columns.Count; ++j)
{
row.CreateCell(j).SetCellValue(data.Rows[i][j].ToString());
}
++count;
} }
/// <summary>
/// 去除空行
/// </summary>
/// <param name="dtr"></param>
/// <returns></returns>
protected static DataTable RemoveEmpty(DataTable dtr)
{
DataTable dt = dtr;
List<DataRow> removelist = new List<DataRow>();
for (int i = ; i < dt.Rows.Count; i++)
{
bool IsNull = true;
for (int j = ; j < dt.Columns.Count; j++)
{
if (!string.IsNullOrEmpty(dt.Rows[i][j].ToString().Trim()))
{
IsNull = false;
}
}
if (IsNull)
{
removelist.Add(dt.Rows[i]);
}
}
for (int i = ; i < removelist.Count; i++)
{
dt.Rows.Remove(removelist[i]);
}
return dt;
}
}
封装一个ExcelHelper,方便将Excel直接转成Datatable对象的更多相关文章
- SQLBulkCopy使用实例--读取Excel写入数据库/将 Excel 文件转成 DataTable
MS SQL Server 提供一个称为 bcp 的流行的命令提示符实用工具,用于将数据从一个表移动到另一个表(表可以在不同服务器上). SqlBulkCopy 类允许编写提供类似功能的托管代码解决方 ...
- 将Excel表格数据转换成Datatable
/// <summary> /// 将Excel表格数据转换成Datatable /// </summary> /// <param name="fileUrl ...
- 我写的一个ExcelHelper通用类,可用于读取或生成数据
读取或生成EXCEL数据的方法有很多,一般常见的有: 1.通过OFFICE EXCEL组件,优点:读取与生成EXCEL文件方便,缺点:服务器上必须安装OFFICE软件,且进程无法及时释放 2.通过第三 ...
- 自己封装一个Log模块
Unity自己有log系统,为什么要自己封装一个 1.不好用,只能在pc上记录log文件,移动平台是没有的 2.在开发时期的log,不想在正式版里面出现.没有一个统一的开关来控制是不是要显示log,要 ...
- 仿照jquery封装一个自己的js库(一)
所谓造轮子的好处就是复习知识点,加深对原版jquery的理解. 本文系笔者学习jquery的笔记,记述一个名为"dQuery"的初级版和缩水版jquery库的实现.主要涉及知识点包 ...
- PHP封装一个通用好用的文件上传处理类
封装一个文件上传类完成基本功能如下: 1.可上传多个或单个文件 2.上传成功返回一个或多个文件名 3.上传失败则返回每个失败文件的错误信息 上传类中的基本功能: 1.构造参数,用户可以自定义配置参数, ...
- Swift - 简单封装一个工具类模板
创建模板类(封装一个类) 例1:新建一个名字叫做 Product 的类 Product.swift File 的内容 class Product { var name: String var desc ...
- XLConnect:一个用R处理Excel文件的高效平台
code{white-space: pre;} pre:not([class]) { background-color: white; }if (window.hljs && docu ...
- 使用xib封装一个自定义view的步骤
使用xib封装一个自定义view的步骤 1> 新建一个继承UIView的自定义view,假设类名叫做(MJAppView) 2> 新建一个MJAppView.xib文件来描述MJAppVi ...
随机推荐
- 在VMware上安装ubuntu——网络类型
安装虚拟机时,向导提示选择网络类型: 当使用仅主机模式网络时,虚拟机和物理机不能互相访问共享.
- POJ 2195 Going Home 【二分图最小权值匹配】
传送门:http://poj.org/problem?id=2195 Going Home Time Limit: 1000MS Memory Limit: 65536K Total Submis ...
- ACM/ICPC 2018亚洲区预选赛北京赛站网络赛 A、Saving Tang Monk II 【状态搜索】
任意门:http://hihocoder.com/problemset/problem/1828 Saving Tang Monk II 时间限制:1000ms 单点时限:1000ms 内存限制:25 ...
- Window下搭建foundation apps环境
Window下搭建foundation apps环境 框架:AngularJS.Foundation, 构建工具:Gulp, 开发环境:node.js. 操作系统:windows (一)环境准备 1 ...
- 逻辑回归(分类问题)(Logistic Regression、罗杰斯特回归)
逻辑回归:问题只有两项,即{0, 1}.一般而言,回归问题是连续模型,不用在分类问题上,且噪声较大,但如果非要引入,那么采用逻辑回归模型. 对于一般训练集: 参数系统为: 逻辑回归模型为: ...
- Notepad++ 插件之 TextFX (安装及作用)
<安装:打开 notepad++ 插件 -> Plugin Manager -> Show Plugin Manager -> available ->选中 TextF ...
- IP地址获取当前地理位置(省份)的接口
腾讯的接口是 ,返回数组 http://fw.qq.com/ipaddress 返回值 var IPData = new Array("61.135.152.194"," ...
- element 表单的input循环生成,并可单个input失去焦点单个验证并保存; (多个表单实例)
<div class="box_item"> <el-form ref="aList" :model="form" :ru ...
- Redis工具之Jedis
//jedis的连接池 public void test1(){ //创建连接池配置对象 JedisPoolConfig poolConfig = new JedisPoolConfig(); poo ...
- Sass 基础(六)
join() 函数 join()函数是将两个列表连接合并成一个列表. >>join(10px 20px, 30px 40px) (10px 20px 20px 40px) >> ...