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. ie_placeholder最佳兼容方案

    https://gitee.com/hustcc/placeholder.js巧妙的使用了canvas.toDataURL(),动态生成了一个背景图,可以作为兼容IE9-的placeholder方案. ...

  2. 网站js埋点

    js埋点 1.埋点作用:  页面埋点的作用:其实就是用于流量分析.而流量的意思,包含了很多:页面浏览数(PV).独立访问者数量(UV).IP.页面停留时间.页面操作时间.页面访问次数.按钮点击次数.文 ...

  3. css深入理解之border

    1.  border-width border-width不支持百分比,类似的还有outline,box-shadow,text-shadow等 border-width支持关键字:thin(1px, ...

  4. Android 登录界面调用输入法时让界面自动上移,使输入法不会遮挡到主界面(Activity)

    先贴上效果图:   <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:andr ...

  5. 通过docker info命令,可以了解很多信息

    来个输出吧. Containers: 1 Running: 1 Paused: 0 Stopped: 0 Images: 1 Server Version: 17.03.1-ce Storage Dr ...

  6. C# T4使用

    最近升级我们的框架到微服务了,而且是dotnetcore 2.0. 然后一个新的框架,最基本的Model和与数据库交互的Repository,我们都是要利用T4自动生成的. 首先这个是代码结构,在这个 ...

  7. UVa247

    题目连接(vj,比较方便):https://vjudge.net/problem/UVA-247 Description:If you’ve seen television commercials f ...

  8. LCIS最长公共上升子序列

    最长公共上升子序列LCIS,如字面意思,就是在对于两个数列A和B的最长的单调递增的公共子序列. 这道题目是LCS和LIS的综合. 在LIS中,我们通过两重循环枚举当序列以当前位置为结尾时,A序列中当前 ...

  9. 洛谷——P3914 染色计数

    P3914 染色计数 题目描述 有一颗NN个节点的树,节点用1,2,\cdots,N1,2,⋯,N编号.你要给它染色,使得相邻节点的颜色不同.有MM种颜色,用1,2,\cdots,M1,2,⋯,M编号 ...

  10. 【DFS】Gym - 101142C - CodeCoder vs TopForces

    就按照题意建出有向图来(n个点,2n-2条边),然后从按随便一个rating排序,从最后一个开始dfs,用vis数组防止重复访问,因为每次之前的肯定能访问之后的(及之后的能访问的),所以不会有重复.就 ...