1.须要引用的dll :  DocumentFormat.OpenXml.dll  ---须要安装一下OpenXml再引用

WindowsBase  ---直接在项目里加入引用

2.方法:

/// <summary>
/// 读取.xlsx格式的Excel文件数据,读取其特定名称的工作薄
/// </summary>
/// <param name="filePath">文件路径 如 D:\\excel1.xls</param>
/// <param name="sheetName">工作薄名称 如 Sheet1</param>
/// <param name="fieldNames">要转化成的DataTable的列名数组</param>
/// <returns></returns>
public static DataTable ReadExcelToDataTable(Stream fileStream, string sheetName, string[] fieldNames)
{    using (var document = SpreadsheetDocument.Open(fileStream, false))
            {
var sheets = document.WorkbookPart.Workbook.Descendants<Sheet>().Where(p => p.Name == sheetName);
var enumerable = sheets as Sheet[] ?? sheets.ToArray();
if (!enumerable.Any())
{
return null;
}
var wsp = (WorksheetPart)document.WorkbookPart.GetPartById(enumerable.First().Id);
//获取Excel中共享数据
var stringTable = document.WorkbookPart.SharedStringTablePart.SharedStringTable;
var rows = wsp.Worksheet.Descendants<Row>();//获得Excel中得数据行
DataTable table = new DataTable();
foreach (var name in fieldNames)
{
table.Columns.Add(name, typeof(string));
}
//由于需要将数据导入到DataTable中,所以我们假定Excel的第一行是列名,从第二行开端是行数据
var _count = 0;
var enumerable1 = rows as Row[] ?? rows.ToArray();
var total = enumerable1.Count() - 1;
foreach (var row in enumerable1)
{
if (row.RowIndex > 1)
{
_count++;
GetDataRow(row, stringTable, ref table, fieldNames); //Excel第二行同一时候为DataTable的第一行数据
if (_count % 100 != 0) continue;
var per = (100 * _count / total - 5) <= 0 ? 1 : (100 * _count / total - 5);
var perS = per.ToString(CultureInfo.InvariantCulture) + "%"; HttpContext.Current.Response.Write("<script>top.process('" + perS + "');</script>");
HttpContext.Current.Response.Flush();
}
}
return table;
}
}
/// 获取Excel行数据
private static void GetDataRow(IEnumerable<OpenXmlElement> row, OpenXmlElement stringTable, ref DataTable table, string[] fieldNames)
{
if (stringTable == null) throw new ArgumentNullException("stringTable");
var dic = new Dictionary<int, string>();
var i = 0;
foreach (Cell cell in row)
{
GetValue(i, cell, stringTable, ref dic);
i++;
}
if (dic.Count == 0)
{
return;
}
var dr = table.NewRow();
int index = 0;
foreach (var name in fieldNames)
{
dr[name] = dic[index];
index++;
}
table.Rows.Add(dr);
}
/// 获取Excel单元格数据
private static void GetValue(int i, CellType cell, OpenXmlElement stringTable, ref Dictionary<int, string> dic)
{
if (stringTable == null) throw new ArgumentNullException("stringTable");
//由于Excel的数据存储在SharedStringTable中,需要获取数据在SharedStringTable 中的索引
var value = string.Empty;
try
{
if (cell.ChildElements.Count == 0)
return;
value = cell.CellValue.InnerText;
if ((cell.DataType != null) && (cell.DataType == CellValues.SharedString))
{
value = stringTable.ChildElements[Int32.Parse(value)].InnerText;
}
dic.Add(i, value); }
catch (Exception)
{
}
}

c# 用OpenXmL读取.xlsx格式的Excel文件 返回DataTable的更多相关文章

  1. Java生成xlsx格式的excel文件

    xlsx格式的写入的数据量据说有百万级,结合实际需要该格式. public static void main(String[] args) throws Exception { OutputStrea ...

  2. 1、关于python第三方工具操作xls和xlsx格式的excel文档选型的吐血经历

    首先,最近看了python的一本书,其中第7章是关于文章操作的,就计划把python操作excel,word,txt,xml,html,json等格式的文档做个总结,并实现一些功能,但是,第一步就要把 ...

  3. RHEL 6.4 64bit kettle5.01导入xlsx格式的excel时报错

    环境:RHEL 6.4 64bit : kettle5.01:xlsx格式的excel 创建的job,在spoon里面运行都没有问题(Linux和windows) 在windows的命令行运行也没有问 ...

  4. 数组转xls格式的excel文件&数据转csv格式的excle

    /** * 数组转xls格式的excel文件 * @param array $data 需要生成excel文件的数组 * @param string $filename 生成的excel文件名 * 示 ...

  5. POI使用:用poi接口不区分xls/xlsx格式解析Excel文档(41种日期格式解析方法,5种公式结果类型解析方法,3种常用数值类型精度控制办法)

    一.使用poi解析excel文档 注:全部采用poi接口进行解析,不需要区分xls.xlsx格式,不需要判断文档类型. poi中的日期格式判断仅支持欧美日期习惯,对国内的日期格式并不支持判断,怎么办? ...

  6. 64位的Sql Server使用OPENROWSET导入xlsx格式的excel数据的时候报错(转载)

    In the old times while all the CPUs were 32bit, we were happily using JET OLEDB Provider reaching Ex ...

  7. 利用PHPExcel将数据导出到xls格式的excel文件

    在开发某地的经营许可证管理系统的时候需要将数据导出打excel文件,虽然一年前做某集团的ERP的时候用到过一次导入和导出,但是那时候太忙没时间写博客,一年过去了我也忘的差不多了,所以趁着今天将此次的使 ...

  8. ci框架读取上传的excel文件数据

    原文链接: https://blog.csdn.net/qq_38148394/article/details/87921373 此功能实现使用到PHPExcel类库,PHPExcel是一个PHP类库 ...

  9. 读取FTP上的excel文件,并写入数据库

    今天遇到一些问题,需要从ftp上读取一些excel文件,并需要将excel中的数据写入到数据库,这样就可以通过管理页面查看这些数据. 我将相关工作分为三步,1.从ftp上读取相关文件,并将excel文 ...

随机推荐

  1. 【SQL】多个表的查询

    1.元组变量 SELECT * FROM a AS x, a AS y; 结果是显示自己和自己的笛卡尔乘积. 如果查询中对于某一个关系使用了多次,为了区别他们的属性,需要对关系定义别名,然后用 别名. ...

  2. linux用grep查找包含两个关键字的命令

    linux用grep查找包含两个关键字的命令 http://zhidao.baidu.com/link?url=VsFxeJXmU7W7hy1UH7eT6QAbUsVz9Ru2ABPuWYHWm4kB ...

  3. CentOS6.9下安装 Pika 2.2.5(新增了拷贝安装版本的办法+对于PID的位置及数据库位置的理解)

    一.环境准备 yum install -y snappy-devel  protobuf-compiler  protobuf-devel bzip2-devel  zlib-devel bzip2 ...

  4. thinkphp5.0配置nginx重写规则

    我的centeros7.3系统,单主机实例: vi /usr/local/nginx/conf/nginx.conf 在如图红框位置加入以下代码(图片是截取的,截取部分上方还有其他的默认配置代码,代码 ...

  5. HDU 1018 Big Number(数论,Stirling公式)

    1. 利用数学公式lg(n!)=lg(2)+lg(3)+....+lg(n) 求解 2.

  6. 7、Flask实战第7天:Jinjia2模板

    Jinja2模板介绍和查找路径 在前面的章节中,视图只是直接返回文本,然而在实际生产环境中其实很少这样用,因为实际的页面大多带有样式和复杂逻辑的HTML代码,这可以让浏览器其渲染出非常漂亮的页面. 我 ...

  7. NVL NVL2 COALESCE NULLIF decode

    NVL(EXPR1,EXPR2)NVL2(EXPR1,EXPR2,EXPR3)NULLIF(EXPR1,EXPR2)COALESCE(EXPR1,,..,EXPRn)decode --------NV ...

  8. Fiddler 高级用法:Fiddler Script 与 HTTP 断点调试

    转载自 https://my.oschina.net/leejun2005/blog/399108 1.Fiddler Script 1.1 Fiddler Script简介 在web前端开发的过程中 ...

  9. [BZOJ5020][THUWC2017]在美妙的数学王国中畅游(LCT)

    5020: [THUWC 2017]在美妙的数学王国中畅游 Time Limit: 80 Sec  Memory Limit: 512 MBSec  Special JudgeSubmit: 323  ...

  10. [BZOJ 1799] self 同类分布

    Link: BZOJ 1799 传送门 Solution: 一句话的题目,看得爽,做得烦 一般这类和数位相关的都是数位$dp$吧 不过一开始还是感觉不太可做,毕竟每个数模数不同 但要发现,模数最高也只 ...