C#:导入Excel通用类(Xlsx格式)
- 一、引用插件EPPlus.dll
插件下载地址:https://pan.baidu.com/s/1jEl7iu1H_C7-j9Wq37xIRQ 提取密码:pdy6
- 二、定义通用类XlsxExcelData.cs
public class XlsxExcelData: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 SheetNames.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.xlsx; }
}
#endregion
#region 构造
public XlsxExcelData(string path)
{
m_filePath = path;
}
public XlsxExcelData(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>
public void Load(string path)
{
m_filePath = path;
ExcelPackage package = null;
try
{
using (FileStream fs=File.Open(path,FileMode.OpenOrCreate,FileAccess.Read))
{
package = new ExcelPackage(fs);
}
}
catch
{
throw;
}
LoadExcel(package);
package.Dispose();
} /// <summary>
/// 执行方法
/// </summary>
/// <param name="stream">文件流</param>
private void Load(Stream stream)
{
m_stream = stream;
ExcelPackage package = null;
try
{
package = new ExcelPackage(stream);
}
catch
{
throw;
}
LoadExcel(package);
package.Dispose();
} /// <summary>
/// 获取Excel对应字典
/// </summary>
/// <param name="package"></param>
private void LoadExcel(ExcelPackage package)
{
m_tableDic = new Dictionary<string, DataTable>();
var sheets = package.Workbook.Worksheets.GetEnumerator();
while (sheets.MoveNext())
{
DataTable dt = new DataTable();
var sheet = sheets.Current;
string name = sheet.Name;
if (sheet.Dimension!=null)
{
for (int i = ; i <=sheet.Dimension.Columns ; i++)
{
string header = ExcelHeaderGenerator.GetExcelHeader(i);
DataColumn col = new DataColumn(header);
dt.Columns.Add(col);
}
for (int i = ; i <= sheet.Dimension.Rows ; i++)
{
try
{
ExcelRow excelRow = sheet.Row(i);
DataRow dRow = dt.NewRow();
for (int j = ; j <=sheet.Dimension.Columns; j++)
{
ExcelRange range = sheet.Cells[i, j];
if (string.IsNullOrEmpty(range.Text))
{
dRow[j - ] = string.Empty;
}
else
{
dRow[j - ] = range.Text;
}
}
dt.Rows.Add(dRow);
}
catch (Exception e)
{
throw;
}
}
}
m_tableDic.Add(name, 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>
/// <param name="columnNum">列数</param>
/// <returns></returns>
public DataTable GetDataTable(int sheetIndex, int columnNum)
{
DataTable dt = GetDataTable(sheetIndex);
Convert(columnNum, ref dt);
return dt;
} /// <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.Rows)
{
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>
/// 检测重复列
/// </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.RemoveAt(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通用类(Xlsx格式)的更多相关文章
- C#:导入Excel通用类(Xls格式)
PS:在CSV格式和XLSX格式中有写到通用调用的接口和引用的插件,所以在这个xls格式里面并没有那么详细,只是配上xls通用类. 一.引用插件NPOI.dll.NPOI.OOXML.dll.NPOI ...
- C#:导入Excel通用类(CSV格式)
一.引用插件LumenWorks.Framework.IO.dll(CsvReader) 插件下载地址:https://pan.baidu.com/s/1c3kTKli 提取密码 dz7j 二.定义 ...
- NPOI导入导出EXCEL通用类,供参考,可直接使用在WinForm项目中
以下是NPOI导入导出EXCEL通用类,是在别人的代码上进行优化的,兼容xls与xlsx文件格式,供参考,可直接使用在WinForm项目中,由于XSSFWorkbook类型的Write方法限制,Wri ...
- 在java poi导入Excel通用工具类示例详解
转: 在java poi导入Excel通用工具类示例详解 更新时间:2017年09月10日 14:21:36 作者:daochuwenziyao 我要评论 这篇文章主要给大家介绍了关于在j ...
- MVC NPOI Linq导出Excel通用类
之前写了一个模型导出Excel通用类,但是在实际应用中,可能不是直接导出模型,而是通过Linq查询后获取到最终结果再导出 通用类: public enum DataTypeEnum { Int = , ...
- Excel通用类工具(二)
前言 上一篇中写到了用反射来处理类中的不用的属性,但是Excel的列名还得手动输入,这样还是比较麻烦的,今天这篇就利用自定义注解来解决手动传入列名的问题:其实很简单的,只需要在上一篇的基础上加一个类就 ...
- NPOI 2.1.1 系列(1) 使用NPOI读取 Excel文档 ;NpoiExcelHelper 导入导出 2003格式 2007格式的 Excel; Npoi 导出 xlsx 格式
下载地址 http://npoi.codeplex.com/releases 下面放一个 NPOIHelper 助手类吧,也不是我写的- NpoiExcelHelper 可以生成xlsx格式publi ...
- C# 将DataGridView中显示的数据导出到Excel(.xls和.xlsx格式)—NPOI
前言 https://blog.csdn.net/IT_xiao_guang_guang/article/details/104217491 本地数据库表中有46785条数据,测试正常 初次运行程 ...
- poi导出excel通用类
一.关键的通用类public class PoiExportUtils { private static HSSFWorkbook workBook; public PoiExportUtils ...
随机推荐
- AtCoder Beginner Contest 045 B - 3人でカードゲームイージー / Card Game for Three (ABC Edit)
Time limit : 2sec / Memory limit : 256MB Score : 200 points Problem Statement Alice, Bob and Charlie ...
- [转载]用纯css改变下拉列表select框的默认样式
在这篇文章里,我将介绍如何不依赖JavaScript用纯css来改变下拉列表框的样式. 问题的提出 事情是这样的,您的设计师团队向您发送一个新的PSD(Photoshop文档),它是一个新的网站的最终 ...
- The Little Prince-11/26
WRITE BEFORE THE BOOK REVIEW I have read The Little Prince for three or four times. However I still ...
- django 动态生成PDF文件
可以通过开源的Python PDF库ReportLab来实现PDF文件的动态生成. 一.安装ReportLab ReportLab库在PyPI上提供,可以使用pip来安装: $ pip install ...
- django 表单常用field
BooleanField字段:相当于单选框 CharField:接受字符串 参数:max_length最大长度,min_length最小长度 require字段是否是必须的,默认为required=T ...
- 讨论下python中全局变量的使用
首先看一段代码: A = 0 B = [0] def fun1(A, B): A += 1 B[0] += 1 fun1(A, B) print 'after fun1 %d %s' % (A,B) ...
- java中线程的停止以及LockSupport工具类
看jstack输出的时候,可以发现很多状态都是TIMED_WAITING(parking),如下所示: "http-bio-8080-exec-16" #70 daemon pri ...
- vim 快捷键(update)
网上盗的图,233 2018年08月31日14:31:19 update: 批量行操作 esc->ctrl+v->选中批量行->shift+i->operation-> ...
- Angular 请求数据
Angular 请求数据 get post 以及 jsonp 请求数据 引入 HttpModule .JsonpModule 普通的 HTTP 调用并不需要用到 JsonpModule,不过稍后我们就 ...
- ACM札记
1. 逗号表达式 在“计蒜客“的ACM教程中,看到这样一段很好的代码: int n; while (scanf("%d", &n), n) { //do something ...