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文 ...
随机推荐
- echarts地图自定义任意区域
这里可以直接在地图上框选区域,右侧会自动生成geojson
- lucene api
设置重新打开索引目录(清空) IndexWriterConfig conf = new IndexWriterConfig(new WhitespaceAnalyzer());conf.setOpen ...
- python 金字塔图形
a = 50 y = '*'*(a+1) p = ' ' while a: print(y) y = y[:a-1] y = p + y a = a - 1 for i in range(20): p ...
- selenium java读取csv文件 (数据驱动)
javacsv2.1 下载地址:http://sourceforge.net/projects/javacsv/files/ 该链接可以下载java读取csv文件的jar 包.下载之后解压找到对应的. ...
- linux基础学习目录
以下用一个表格来罗列linux默认的目录或文件及其用途: 目录/文件 用途 来源 / /处于Linux文件系统树形结构的最顶端,它是Linux文件系统的入口,所有的目录.文件.设备都在/之下. - / ...
- [BZOJ1076][SCOI2008]奖励关 状压dp
1076: [SCOI2008]奖励关 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3070 Solved: 1595[Submit][Statu ...
- Node-sqlite3多字段插入数据问题
Node-sqlite3多字段插入数据问题 在npm官网上看到sqlite3的使用方法,就去尝试了一下,奈何关于多字段插入的API简介很少,直接上代码: 官网的示例如下: var sqlite3 = ...
- 洛谷——P1226 取余运算||快速幂
P1226 取余运算||快速幂 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 输入格式: 三个整数b,p,k. 输出格式: 输出“b^p mod ...
- 转 select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET
select函数用于在非阻塞中,当一个套接字或一组套接字有信号时通知你,系统提供select函数来实现多路复用输入/输出模型,原型:int select(int maxfd,fd_set *rdset ...
- FFT&NTT&多项式相关
打了FFT 感觉以后多项式不虚了 ~滑稽~ PS 关于详见没写完.... code #include<cmath> #include<cstdio> #include<c ...