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文 ...
随机推荐
- ETL(Extract-Transform-Load的缩写,即数据抽取、转换、装载的过程)
ETL(Extract-Transform-Load的缩写,即数据抽取.转换.装载的过程)
- SQLAlchemy技术文档(中文版)-下
10.建立联系(外键) 是时候考虑怎样映射和查询一个和Users表关联的第二张表了.假设我们系统的用户可以存储任意数量的email地址.我们需要定义一个新表Address与User相关联. from ...
- WN7下安装office2013编辑文档反应这么慢?
把office在高级选项里面“禁用硬件加速”给打勾就OK了. [office 2013密钥] 9MBNG-4VQ2Q-WQ2VF-X9MV2-MPXKV F2V7V-8WN76-77BPV-MKY36 ...
- docker 安装持久化mysql
https://hub.docker.com 拉取mysql镜像docker pull mysql:5.5运行mysql镜像并持久化到本地docker run -v /var/own/mysqldat ...
- laravel获取checkbox值的小技巧
以前老是用三元运算符来判断,现在有了更好的方法: 1.html代码 <input type="hidden" name="approved" value= ...
- [POI2014]Hotel
题目大意: 给你一颗$n(n\le5000)$个点的树,选3个点使得它们两两距离相等,问共有几种选法. 思路: 首先我们不难发现一个性质:对于每3个符合条件的点,我们总能找到一个点使得这个点到那3个点 ...
- Problem T: 零起点学算法15——交换变量
#include<stdio.h> int main() { int a,b,c; scanf("%d %d",&a,&b); c=a; a=b; b= ...
- Scala高手实战****第18课:Scala偏函数、异常、Lazy值编码实战及Spark源码鉴赏
本篇文章主要讲述Scala函数式编程之偏函数,异常,及Lazy 第一部分:偏函数 偏函数:当函数有多个参数,而在使用该函数时不想提供所有参数(比如函数有3个参数),只提供0~2个参数,此时得到的函数便 ...
- Android ProgressBar手动控制开始和停止
这两天有个需求,点击按钮从SD卡解压压缩包,并读取压缩包内txt文档内容,然后在街面上显示出来.毕竟IO操作很耗时,如果文件较大会花费不少时间.所以,在处理数据的时候能给个进度就好了.我们通常的做法就 ...
- [Android Memory] Android 的 StrictMode
android的2.3 之后引入的StrictMode 对网络的访问做了限制啊. public void onCreate() { if (DEVELOPER_MODE) { StrictMode.s ...