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

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

2.方法:

  1. /// <summary>
  2. /// 读取.xlsx格式的Excel文件数据,读取其特定名称的工作薄
  3. /// </summary>
  4. /// <param name="filePath">文件路径 如 D:\\excel1.xls</param>
  5. /// <param name="sheetName">工作薄名称 如 Sheet1</param>
  6. /// <param name="fieldNames">要转化成的DataTable的列名数组</param>
  7. /// <returns></returns>
  8. public static DataTable ReadExcelToDataTable(Stream fileStream, string sheetName, string[] fieldNames)
  9. {
  10.  
  11.    using (var document = SpreadsheetDocument.Open(fileStream, false))
  12.             {
  13. var sheets = document.WorkbookPart.Workbook.Descendants<Sheet>().Where(p => p.Name == sheetName);
  14. var enumerable = sheets as Sheet[] ??
  15.  
  16. sheets.ToArray();
  17. if (!enumerable.Any())
  18. {
  19. return null;
  20. }
  21. var wsp = (WorksheetPart)document.WorkbookPart.GetPartById(enumerable.First().Id);
  22. //获取Excel中共享数据
  23. var stringTable = document.WorkbookPart.SharedStringTablePart.SharedStringTable;
  24. var rows = wsp.Worksheet.Descendants<Row>();//获得Excel中得数据行
  25. DataTable table = new DataTable();
  26. foreach (var name in fieldNames)
  27. {
  28. table.Columns.Add(name, typeof(string));
  29. }
  30. //由于需要将数据导入到DataTable中,所以我们假定Excel的第一行是列名,从第二行开端是行数据
  31. var _count = 0;
  32. var enumerable1 = rows as Row[] ?? rows.ToArray();
  33. var total = enumerable1.Count() - 1;
  34. foreach (var row in enumerable1)
  35. {
  36. if (row.RowIndex > 1)
  37. {
  38. _count++;
  39. GetDataRow(row, stringTable, ref table, fieldNames); //Excel第二行同一时候为DataTable的第一行数据
  40. if (_count % 100 != 0) continue;
  41. var per = (100 * _count / total - 5) <= 0 ? 1 : (100 * _count / total - 5);
  42. var perS = per.ToString(CultureInfo.InvariantCulture) + "%";
  43.  
  44. HttpContext.Current.Response.Write("<script>top.process('" + perS + "');</script>");
  45. HttpContext.Current.Response.Flush();
  46. }
  47. }
  48. return table;
  49. }
  50. }
  51. /// 获取Excel行数据
  52. private static void GetDataRow(IEnumerable<OpenXmlElement> row, OpenXmlElement stringTable, ref DataTable table, string[] fieldNames)
  53. {
  54. if (stringTable == null) throw new ArgumentNullException("stringTable");
  55. var dic = new Dictionary<int, string>();
  56. var i = 0;
  57. foreach (Cell cell in row)
  58. {
  59. GetValue(i, cell, stringTable, ref dic);
  60. i++;
  61. }
  62. if (dic.Count == 0)
  63. {
  64. return;
  65. }
  66. var dr = table.NewRow();
  67. int index = 0;
  68. foreach (var name in fieldNames)
  69. {
  70. dr[name] = dic[index];
  71. index++;
  72. }
  73. table.Rows.Add(dr);
  74. }
  75. /// 获取Excel单元格数据
  76. private static void GetValue(int i, CellType cell, OpenXmlElement stringTable, ref Dictionary<int, string> dic)
  77. {
  78. if (stringTable == null) throw new ArgumentNullException("stringTable");
  79. //由于Excel的数据存储在SharedStringTable中,需要获取数据在SharedStringTable 中的索引
  80. var value = string.Empty;
  81. try
  82. {
  83. if (cell.ChildElements.Count == 0)
  84. return;
  85. value = cell.CellValue.InnerText;
  86. if ((cell.DataType != null) && (cell.DataType == CellValues.SharedString))
  87. {
  88. value = stringTable.ChildElements[Int32.Parse(value)].InnerText;
  89. }
  90. dic.Add(i, value);
  91.  
  92. }
  93. catch (Exception)
  94. {
  95. }
  96. }

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. Python Standard Library

    Python Standard Library "We'd like to pretend that 'Fredrik' is a role, but even hundreds of vo ...

  2. UVALive - 5844

    题是pdf版 Sample Input23mississippinni55i55ippi2foobar|=o08arSample Output10 /** 题意:给出一个normal串,一个leet串 ...

  3. Qt笔记——QFile,QDataStream,QTextStream

    QFile #ifndef WIDGET_H #define WIDGET_H #include <QWidget> namespace Ui { class Widget; } clas ...

  4. Python 解释器中方向键无法使用的解决方法

    如下: SyntaxError: invalid syntax >>> ^[[A File "<stdin>", line 1 ^ SyntaxErr ...

  5. (二)mysql忘记root密码

    (1)mysql 5.7.6以前版本 修改配置文件vim /etc/my.cnf [mysqld] skip-grant-tables 重启mysql systemctl restart mysqld ...

  6. python判断一个数是否是2的几次幂

    判断一个数是不是2的几次幂,最简单粗暴的做法就是直接迭代除以2,这里有一个更好的方法,那就是采用位运算. 我们观察下面属于2的几次幂的数的变化规律,用2进制表示. 十进制 二进制 0 0 2 10 4 ...

  7. ubuntu 16.04.1 LTS 初始化

    gcc环境------------------sudo apt-get update && \sudo apt-get install build-essential software ...

  8. 主键(PrimaryKey)

    员工表中的每一行记录代表了一个员工,一般员工的名字就能唯一标识这一个员工,但 是名字也是有可能重复的,这时我们就要为每一名员工分配一个唯一的工号: 这样就可以通过这个工号来唯一标识一名员工了.当老板下 ...

  9. 1.4(Mybatis学习笔记)关联映射

    一.一对一 mybatis处理一对一主要通过<resultMap>中的<association>元素来处理. <association>元素主要使用方方式有两种: ...

  10. Java学习笔记(6)

    java是面向对象的语言. 对象:真实存在的唯一的事物. 类:实际就是对某种类型事物的共性属性与行为的抽取 面向对象的计算机语言的核心思想:找适合的对象做适合的事情. 如何找适合的对象呢: 1.sun ...