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对象的更多相关文章

  1. SQLBulkCopy使用实例--读取Excel写入数据库/将 Excel 文件转成 DataTable

    MS SQL Server 提供一个称为 bcp 的流行的命令提示符实用工具,用于将数据从一个表移动到另一个表(表可以在不同服务器上). SqlBulkCopy 类允许编写提供类似功能的托管代码解决方 ...

  2. 将Excel表格数据转换成Datatable

    /// <summary> /// 将Excel表格数据转换成Datatable /// </summary> /// <param name="fileUrl ...

  3. 我写的一个ExcelHelper通用类,可用于读取或生成数据

    读取或生成EXCEL数据的方法有很多,一般常见的有: 1.通过OFFICE EXCEL组件,优点:读取与生成EXCEL文件方便,缺点:服务器上必须安装OFFICE软件,且进程无法及时释放 2.通过第三 ...

  4. 自己封装一个Log模块

    Unity自己有log系统,为什么要自己封装一个 1.不好用,只能在pc上记录log文件,移动平台是没有的 2.在开发时期的log,不想在正式版里面出现.没有一个统一的开关来控制是不是要显示log,要 ...

  5. 仿照jquery封装一个自己的js库(一)

    所谓造轮子的好处就是复习知识点,加深对原版jquery的理解. 本文系笔者学习jquery的笔记,记述一个名为"dQuery"的初级版和缩水版jquery库的实现.主要涉及知识点包 ...

  6. PHP封装一个通用好用的文件上传处理类

    封装一个文件上传类完成基本功能如下: 1.可上传多个或单个文件 2.上传成功返回一个或多个文件名 3.上传失败则返回每个失败文件的错误信息 上传类中的基本功能: 1.构造参数,用户可以自定义配置参数, ...

  7. Swift - 简单封装一个工具类模板

    创建模板类(封装一个类) 例1:新建一个名字叫做 Product 的类 Product.swift File 的内容 class Product { var name: String var desc ...

  8. XLConnect:一个用R处理Excel文件的高效平台

    code{white-space: pre;} pre:not([class]) { background-color: white; }if (window.hljs && docu ...

  9. 使用xib封装一个自定义view的步骤

    使用xib封装一个自定义view的步骤 1> 新建一个继承UIView的自定义view,假设类名叫做(MJAppView) 2> 新建一个MJAppView.xib文件来描述MJAppVi ...

随机推荐

  1. NO.008-2018.02.13《折桂令·春情》元代:徐再思

    折桂令·春情_古诗文网   折桂令·春情 元代:徐再思 平生不会相思,才会相思,便害相思.生下来以后还不会相思,才刚刚懂了什么是相思,却深受着相思之苦. 身似浮云,心如飞絮,气若游丝.身像飘浮的云,心 ...

  2. c++下各种编码格式转换的方法

    1.利用c++11新特性 std::wstring_convert配合std::codecvt模板类 作者:Gomo Psivarh链接:https://www.zhihu.com/question/ ...

  3. 【[CTSC2000]冰原探险】

    noip前练一下码力还是非常有前途的 这道题本来就是想写个大暴力弃疗的,所以直接强上暴力浑身舒爽 结果发现要不是判重的时候脑残了,就能\(A\)了 没什么好说的呀,就是每一次都暴力\(O(n)\)往上 ...

  4. Android学习笔记_31_通过后台代码生成View对象以及动态加载XML布局文件到LinearLayout

    一.布局文件part.xml: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android&qu ...

  5. mac install PyQt5

    1. install brew /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/insta ...

  6. VSTO Project 客户端自动发送邮件

    利用office vsto功能,抓取我们选择的任务,根据配置节,邮件发送内容,最终根据任务名称,任务开始结束时间,任务资源名称,发送邮件给任务资源. 这是我的VSTO界面. 配置我们发送邮件的服务器地 ...

  7. JS JavaScript事件循环机制

    区分进程和线程 进程是cpu资源分配的最小单位(系统会给它分配内存) 不同的进程之间是可以同学的,如管道.FIFO(命名管道).消息队列 一个进程里有单个或多个线程 浏览器是多进程的,因为系统给它的进 ...

  8. Java虚拟机垃圾回收:基础点(转载)

    1.Java虚拟机垃圾回收 垃圾回收,或称垃圾收集(Garbage Collection,GC)是指自动管理回收不再被引用的内存数据. 在1960年诞生于MIT的Lisp语言首次使用了动态内存分配和垃 ...

  9. JDBC相关

    //原生jdbc操作案例 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; i ...

  10. BZOJ1030: [JSOI2007]文本生成器(AC自动机)

    Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 5984  Solved: 2523[Submit][Status][Discuss] Descripti ...