PS:在CSV格式和XLSX格式中有写到通用调用的接口和引用的插件,所以在这个xls格式里面并没有那么详细,只是配上xls通用类。

  • 一、引用插件NPOI.dll、NPOI.OOXML.dll、NPOI.OpenXml4Net.dll、NPOI.OpenXmlFormats.dll

       插件下载地址:https://pan.baidu.com/s/1ZTU90HUMu4AgMyIgmL-MaA  提取密码:jtjl

  • 二、定义通用类XlsExcelData.cs
 public class XlsExcelData : IExcelData
{
#region 属性值
private Dictionary<string, DataTable> m_tableDic;
public Dictionary<string, DataTable> DataTableDictionary
{
get { return m_tableDic; }
}
public List<string> SheetNames
{
get
{
if (m_tableDic == null)
return null;
return m_tableDic.Keys.ToList();
}
}
public List<DataTable> DataTableList
{
get
{
if (m_tableDic == null)
return null;
return m_tableDic.Values.ToList();
}
}
public int SheetCount
{
get
{
if (m_tableDic == null)
return ;
return m_tableDic.Count;
}
}
private string m_filePath;
public string FilePath
{
get { return m_filePath; }
}
private Stream m_stream;
public Stream ExcelStream
{
get { return m_stream; }
}
public ExcelType ExcelType
{
get { return Interface.ExcelType.xls; }
}
#endregion
#region 构造
public XlsExcelData(string path)
{
m_filePath = path;
}
public XlsExcelData(Stream stream)
{
m_stream = stream;
}
#endregion
#region 方法
public List<Dictionary<string, string>> DataTableToDictionary(DataTable dt)
{
List<Dictionary<String, String>> dicList = new List<Dictionary<string, string>>();
foreach (DataRow row in dt.Rows)
{
Dictionary<String, String> dic = new Dictionary<String, String>();
foreach (DataColumn col in dt.Columns)
{
dic.Add(col.ColumnName, row[col].ToString());
}
dicList.Add(dic);
}
return dicList;
} /// <summary>
/// 执行方法
/// </summary>
public void Load()
{
if (m_filePath != null)
Load(m_filePath);
else
Load(m_stream);
}
/// <summary>
/// 执行方法
/// </summary>
/// <param name="path">文件路径</param>
private void Load(string path)
{
m_filePath = path;
HSSFWorkbook workbook = null;
try
{
using (FileStream fs = File.Open(path, FileMode.OpenOrCreate, FileAccess.Read))
{
workbook = new HSSFWorkbook(fs);
}
}
catch
{
throw;
}
LoadExcel(workbook);
workbook.Dispose();
} /// <summary>
/// 执行方法
/// </summary>
/// <param name="stream">文件流</param>
private void Load(Stream stream)
{
m_stream = stream;
HSSFWorkbook workbook = null;
try
{
workbook = new HSSFWorkbook(stream);
}
catch
{
throw;
}
LoadExcel(workbook);
workbook.Dispose();
} /// <summary>
/// 获取Excel对应字典
/// </summary>
/// <param name="workbook"></param>
private void LoadExcel(HSSFWorkbook workbook)
{
m_tableDic = new Dictionary<string, DataTable>();
var sheets = workbook.GetEnumerator();
while (sheets.MoveNext())
{
DataTable dt = new DataTable();
int colCount = ;
ISheet sheet = (ISheet)sheets.Current;
var rows = sheet.GetEnumerator();
while (rows.MoveNext())
{
IRow row = (IRow)rows.Current;
colCount = row.LastCellNum > colCount ? row.LastCellNum : colCount;
}
for (int i = ; i <= colCount; i++)
{
string header = ExcelHeaderGenerator.GetExcelHeader(i);
DataColumn col = new DataColumn(header);
dt.Columns.Add(col);
}
var datarows = sheet.GetEnumerator();
while (datarows.MoveNext())
{
IRow row = (IRow)datarows.Current;
DataRow dRow = dt.NewRow();
for (int j = ; j < row.LastCellNum; j++)
{
ICell cell = row.Cells[j];
if (cell.CellType == CellType.String)
dRow[j] = row.Cells[j].StringCellValue;
else if (cell.CellType == CellType.Numeric)
dRow[j] = row.Cells[j].NumericCellValue;
else
dRow[j] = "[Cell Type Unsuported]";
}
dt.Rows.Add(dRow);
}
m_tableDic.Add(sheet.SheetName, dt);
}
} /// <summary>
/// 获取第一列
/// </summary>
/// <returns></returns>
public List<Dictionary<string, string>> GetFirstRecords()
{
List<Dictionary<string, string>> result = new List<Dictionary<string, string>>();
DataTable dt = GetDataTable(, );
foreach (DataRow row in dt.Rows)
{
Dictionary<string, string> dic = new Dictionary<string, string>();
foreach (DataColumn column in dt.Columns)
{
dic.Add(column.ColumnName, row[column].ToString());
}
result.Add(dic);
}
return result;
} /// <summary>
/// 获取DataTable
/// </summary>
/// <param name="sheetIndex">工作薄索引</param>
/// <returns></returns>
public DataTable GetDataTable(int sheetIndex)
{
if (m_tableDic == null)
return null;
if (sheetIndex >= SheetCount)
throw new Exception("表格索引超出序列,当前索引数量为" + SheetCount);
DataTable dt = DataTableList[sheetIndex];
DataTable dt_copy = new DataTable();
foreach (DataColumn col in dt.Columns)
{
dt_copy.Columns.Add(new DataColumn(col.ColumnName));
}
foreach (DataRow row in dt.Rows)
{
DataRow r = dt_copy.NewRow();
r.ItemArray = row.ItemArray;
dt_copy.Rows.Add(r);
}
return dt_copy;
} /// <summary>
/// 获取DataTable
/// </summary>
/// <param name="sheetIndex">工作薄索引</param>
/// <param name="columnNum">列数</param>
/// <returns></returns>
public DataTable GetDataTable(int sheetIndex, int columnNum)
{
DataTable dt = GetDataTable(sheetIndex);
Convert(columnNum, ref dt);
return dt; } /// <summary>
/// 检测重复列
/// </summary>
/// <param name="colNum">列数</param>
/// <param name="dt">DataTable</param>
private void Convert(int colNum, ref DataTable dt)
{
if (colNum < )
throw new Exception("指定作为标题的行数必须是大于0");
if (colNum > dt.Rows.Count)
throw new Exception("指定作为标题的行数不能大于表格的总行数" + dt.Rows.Count);
List<string> columnArray = new List<string>();
for (int i = ; i < dt.Columns.Count; i++)
{
if (columnArray.Contains(dt.Rows[colNum - ].ItemArray[i].ToString()))
throw new Exception("指定为DataTable标题的行不能存在重复值,重复值为" + dt.Rows[colNum - ].ItemArray[i].ToString());
columnArray.Add(dt.Rows[colNum - ].ItemArray[i].ToString());
}
int r = ;
for (int i = ; i < colNum; i++)
{
dt.Rows.Remove(dt.Rows[i - r]);
r++;
}
for (int i = ; i < columnArray.Count; i++)
{
dt.Columns[i].ColumnName = columnArray[i];
}
}
#endregion
}

原著:清风一人醉http://www.cnblogs.com/W--Jing/

以上方法可以个人分享研究!

不可做商业项目,违者必究!

C#:导入Excel通用类(Xls格式)的更多相关文章

  1. C#:导入Excel通用类(CSV格式)

    一.引用插件LumenWorks.Framework.IO.dll(CsvReader) 插件下载地址:https://pan.baidu.com/s/1c3kTKli  提取密码 dz7j 二.定义 ...

  2. C#:导入Excel通用类(Xlsx格式)

    一.引用插件EPPlus.dll   插件下载地址:https://pan.baidu.com/s/1jEl7iu1H_C7-j9Wq37xIRQ  提取密码:pdy6 二.定义通用类XlsxExce ...

  3. NPOI导入导出EXCEL通用类,供参考,可直接使用在WinForm项目中

    以下是NPOI导入导出EXCEL通用类,是在别人的代码上进行优化的,兼容xls与xlsx文件格式,供参考,可直接使用在WinForm项目中,由于XSSFWorkbook类型的Write方法限制,Wri ...

  4. 在java poi导入Excel通用工具类示例详解

    转: 在java poi导入Excel通用工具类示例详解 更新时间:2017年09月10日 14:21:36   作者:daochuwenziyao   我要评论   这篇文章主要给大家介绍了关于在j ...

  5. MVC NPOI Linq导出Excel通用类

    之前写了一个模型导出Excel通用类,但是在实际应用中,可能不是直接导出模型,而是通过Linq查询后获取到最终结果再导出 通用类: public enum DataTypeEnum { Int = , ...

  6. 使用Apache POI导出Excel小结--导出XLS格式文档

    使用Apache POI导出Excel小结 关于使用Apache POI导出Excel我大概会分三篇文章去写 使用Apache POI导出Excel小结--导出XLS格式文档 使用Apache POI ...

  7. Excel通用类工具(二)

    前言 上一篇中写到了用反射来处理类中的不用的属性,但是Excel的列名还得手动输入,这样还是比较麻烦的,今天这篇就利用自定义注解来解决手动传入列名的问题:其实很简单的,只需要在上一篇的基础上加一个类就 ...

  8. POI读取excel工具类(xls,xlsx通用)

    package com.boot.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileNotF ...

  9. poi导出excel通用类

    一.关键的通用类public class PoiExportUtils {    private static HSSFWorkbook workBook; public PoiExportUtils ...

随机推荐

  1. Hadoop学习笔记之五:HDFS功能逻辑(1)

    Block Report DataNode会周期性(默认1小时)将自身节点全部block信息发送给NameNode,以让NameNode正确确维护block信息. 在Block Report的数据源D ...

  2. Markdown使用笔记

    下载地址:http://markdownpad.com/ 简明版 Markdown 语法说明(简体中文版) 完整版 Markdown 语法说明(简体中文版) 官方文档:http://www.markd ...

  3. Tomcat启动程序端口冲突、确认相应进程及杀死冲突进程的解决方案

    一. 查看所有进程占用的端口 在开始-运行-cmd,输入:netstat –ano可以查看所有进程 二.查看占用指定端口的程序(1)命令窗口输出 命令:netstat –ano | findstr & ...

  4. 再论sklearn分类器

    https://www.cnblogs.com/hhh5460/p/5132203.html 这几天在看 sklearn 的文档,发现他的分类器有很多,这里做一些简略的记录. 大致可以将这些分类器分成 ...

  5. ansible中的playbook详解

    首先简单说明一下playbook,playbook是什么呢?根本上说playbook和shell脚本没有任何的区别,playbook就像shell一样,也是把一堆的命令组合起来,然后加入对应条件判断等 ...

  6. Linux 安装本地 yum源

    放入Centos6.4的镜像光盘或找到镜像文件 [root]#mount /dev/cdrom  /media/cdrom  #挂载本地镜像 [root]#rm -rf /etc/yum.repo.d ...

  7. python之udp协议的套接字

    udp是无链接的,先启动哪一端都不会报错 udp服务端 1 ss = socket() #创建一个服务器的套接字 2 ss.bind() #绑定服务器套接字 3 inf_loop: #服务器无限循环 ...

  8. Codeforces 835F Roads in the Kingdom - 动态规划

    题目传送门 传送点I 传送点II 传送点III 题目大意 给定一颗基环树,要求删去其中一条边,使得剩下的图形是一棵树,并且最长路的长度最短,求最长路的最短长度. 路径可以分为两部分:跨过环 和 在树内 ...

  9. bzoj 1014 火星人prefix - 链表 - 分块

    Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 7 ...

  10. day5 python

    一.常量 在Python中没有一个专门的语法代表常量,程序员约定俗成用变量名全部大写代表常量.AGE_OF_OLFBOY=73二.基本运算符的补充1.算数运算符 print(10/3) print(1 ...