博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c# 用OpenXmL读取.xlsx格式的Excel文件 返回DataTable
阅读量:4940 次
发布时间:2019-06-11

本文共 2813 字,大约阅读时间需要 9 分钟。

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

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

2.方法:

///         /// 读取.xlsx格式的Excel文件数据,读取其特定名称的工作薄        ///         /// 文件路径 如 D:\\excel1.xls        /// 工作薄名称 如 Sheet1        /// 要转化成的DataTable的列名数组        /// 
public static DataTable ReadExcelToDataTable(Stream fileStream, string sheetName, string[] fieldNames) {    using (var document = SpreadsheetDocument.Open(fileStream, false))            { var sheets = document.WorkbookPart.Workbook.Descendants
().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) { } }

转载于:https://www.cnblogs.com/yfceshi/p/6790973.html

你可能感兴趣的文章
移动终端app测试点总结
查看>>
14-6-27&28自学内容小结
查看>>
JSP
查看>>
---
查看>>
(第一组_GNS3)自反ACl
查看>>
hdu--1258--Sum It Up(Map水过)
查看>>
Spring @DeclareParents 的扩展应用实例
查看>>
VS2012更新Update1后帮助查看器无法打开
查看>>
【Weiss】【第03章】练习3.9:大整数运算包
查看>>
Android 文件的读取和写入
查看>>
高校表白APP-冲刺第四天
查看>>
outlook 设置163邮箱
查看>>
mysql优化——show processlist命令详解
查看>>
Solr服务器搭建
查看>>
画世界怎么用光影_世界绘画经典教程:水彩光影魔法教程
查看>>
win+rsync+php,跨平台的fswatch+rsync同步备份
查看>>
vue2 cdn 加载html,vue项目中使用CDN加载
查看>>
数组转集合踩坑
查看>>
node.js的异步I/O、事件驱动、单线程
查看>>
vue cli3 子目录问题
查看>>