c# 用OpenXmL读取.xlsx格式的Excel文件 返回DataTable
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的更多相关文章
- Java生成xlsx格式的excel文件
xlsx格式的写入的数据量据说有百万级,结合实际需要该格式. public static void main(String[] args) throws Exception { OutputStrea ...
- 1、关于python第三方工具操作xls和xlsx格式的excel文档选型的吐血经历
首先,最近看了python的一本书,其中第7章是关于文章操作的,就计划把python操作excel,word,txt,xml,html,json等格式的文档做个总结,并实现一些功能,但是,第一步就要把 ...
- RHEL 6.4 64bit kettle5.01导入xlsx格式的excel时报错
环境:RHEL 6.4 64bit : kettle5.01:xlsx格式的excel 创建的job,在spoon里面运行都没有问题(Linux和windows) 在windows的命令行运行也没有问 ...
- 数组转xls格式的excel文件&数据转csv格式的excle
/** * 数组转xls格式的excel文件 * @param array $data 需要生成excel文件的数组 * @param string $filename 生成的excel文件名 * 示 ...
- POI使用:用poi接口不区分xls/xlsx格式解析Excel文档(41种日期格式解析方法,5种公式结果类型解析方法,3种常用数值类型精度控制办法)
一.使用poi解析excel文档 注:全部采用poi接口进行解析,不需要区分xls.xlsx格式,不需要判断文档类型. poi中的日期格式判断仅支持欧美日期习惯,对国内的日期格式并不支持判断,怎么办? ...
- 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 ...
- 利用PHPExcel将数据导出到xls格式的excel文件
在开发某地的经营许可证管理系统的时候需要将数据导出打excel文件,虽然一年前做某集团的ERP的时候用到过一次导入和导出,但是那时候太忙没时间写博客,一年过去了我也忘的差不多了,所以趁着今天将此次的使 ...
- ci框架读取上传的excel文件数据
原文链接: https://blog.csdn.net/qq_38148394/article/details/87921373 此功能实现使用到PHPExcel类库,PHPExcel是一个PHP类库 ...
- 读取FTP上的excel文件,并写入数据库
今天遇到一些问题,需要从ftp上读取一些excel文件,并需要将excel中的数据写入到数据库,这样就可以通过管理页面查看这些数据. 我将相关工作分为三步,1.从ftp上读取相关文件,并将excel文 ...
随机推荐
- Python Standard Library
Python Standard Library "We'd like to pretend that 'Fredrik' is a role, but even hundreds of vo ...
- UVALive - 5844
题是pdf版 Sample Input23mississippinni55i55ippi2foobar|=o08arSample Output10 /** 题意:给出一个normal串,一个leet串 ...
- Qt笔记——QFile,QDataStream,QTextStream
QFile #ifndef WIDGET_H #define WIDGET_H #include <QWidget> namespace Ui { class Widget; } clas ...
- Python 解释器中方向键无法使用的解决方法
如下: SyntaxError: invalid syntax >>> ^[[A File "<stdin>", line 1 ^ SyntaxErr ...
- (二)mysql忘记root密码
(1)mysql 5.7.6以前版本 修改配置文件vim /etc/my.cnf [mysqld] skip-grant-tables 重启mysql systemctl restart mysqld ...
- python判断一个数是否是2的几次幂
判断一个数是不是2的几次幂,最简单粗暴的做法就是直接迭代除以2,这里有一个更好的方法,那就是采用位运算. 我们观察下面属于2的几次幂的数的变化规律,用2进制表示. 十进制 二进制 0 0 2 10 4 ...
- ubuntu 16.04.1 LTS 初始化
gcc环境------------------sudo apt-get update && \sudo apt-get install build-essential software ...
- 主键(PrimaryKey)
员工表中的每一行记录代表了一个员工,一般员工的名字就能唯一标识这一个员工,但 是名字也是有可能重复的,这时我们就要为每一名员工分配一个唯一的工号: 这样就可以通过这个工号来唯一标识一名员工了.当老板下 ...
- 1.4(Mybatis学习笔记)关联映射
一.一对一 mybatis处理一对一主要通过<resultMap>中的<association>元素来处理. <association>元素主要使用方方式有两种: ...
- Java学习笔记(6)
java是面向对象的语言. 对象:真实存在的唯一的事物. 类:实际就是对某种类型事物的共性属性与行为的抽取 面向对象的计算机语言的核心思想:找适合的对象做适合的事情. 如何找适合的对象呢: 1.sun ...