使用OpenXML将Excel内容读取到DataTable中
前言:前面的几篇文章简单的介绍了如何使用OpenXML创建Excel文档。由于在平时的工作中需要经常使用到Excel的读写操作,简单的介绍下使用 OpenXML读取Excel中得数据。当然使用OpenXML将数据读取成什么格式并不重要,本文仅仅介绍如何读取到DataTable中。
准备工作:
1. Excel2007文档一个;
2. OpenXML库:DocumentFormat.OpenXml.dll;
3. Console项目一个,添加对OpenXML库和WindowsBase.dll的引用。
废话不多说,进入正题.
本文介绍的读取Excel的思路如下:
1. 将Excel加载到流Stream;
2. 使用OpenXML操作Stream,并写入DataTable中。
将文件加载到Stream中有很多种方式,这里就不赘述,本文主要介绍第二步。
- /// <summary>
- /// 按照给定的Excel流组织成Datatable
- /// </summary>
- /// <param name="stream">Excel文件流</param>
- /// <param name="sheetName">须要读取的Sheet</param>
- /// <returns>组织好的DataTable</returns>
- private DataTable ReadExcel(string sheetName, Stream stream)
- {
- using (SpreadsheetDocument document = SpreadsheetDocument.Open(stream, false))
- {//打开Stream
- IEnumerable<Sheet> sheets = document.WorkbookPart.Workbook.Descendants<Sheet>().Where(s => s.Name == sheetName);
- if (sheets.Count() == )
- {//找出合适前提的sheet,没有则返回
- return null;
- }
- WorksheetPart worksheetPart = (WorksheetPart)document.WorkbookPart.GetPartById(sheets.First().Id);
- //获取Excel中共享数据
- SharedStringTable stringTable = document.WorkbookPart.SharedStringTablePart.SharedStringTable;
- IEnumerable<Row> rows = worksheetPart.Worksheet.Descendants<Row>();//获得Excel中得数据行
- DataTable dt = new DataTable("Excel");
- //因为须要将数据导入到DataTable中,所以我们假定Excel的第一行是列名,从第二行开端是行数据
- foreach (Row row in rows)
- {
- if (row.RowIndex == )
- {//Excel第一行动列名
- GetDataColumn(row, stringTable, ref dt);
- }
- GetDataRow(row, stringTable, ref dt);//Excel第二行同时为DataTable的第一行数据
- }
- return dt;
- }
- }
- /// <summary>
- /// 构建DataTable的列
- /// </summary>
- /// <param name="row">OpenXML定义的Row对象</param>
- /// <param name="stringTablePart"></param>
- /// <param name="dt">须要返回的DataTable对象</param>
- /// <returns></returns>
- public void GetDataColumn(Row row, SharedStringTable stringTable, ref DataTable dt)
- {
- DataColumn col = new DataColumn();
- Dictionary<string, int> columnCount = new Dictionary<string, int>();
- foreach (Cell cell in row)
- {
- string cellVal = GetValue(cell, stringTable);
- col = new DataColumn(cellVal);
- if (IsContainsColumn(dt, col.ColumnName))
- {
- if(!columnCount.ContainsKey(col.ColumnName))
- columnCount.Add(col.ColumnName, );
- col.ColumnName = col.ColumnName + (columnCount[col.ColumnName]++);
- }
- dt.Columns.Add(col);
- }
- }
- /// <summary>
- /// 构建DataTable的每一行数据,并返回该Datatable
- /// </summary>
- /// <param name="row">OpenXML的行</param>
- /// <param name="stringTablePart"></param>
- /// <param name="dt">DataTable</param>
- private void GetDataRow(Row row, SharedStringTable stringTable, ref DataTable dt)
- {
- // 读取算法:按行一一读取单位格,若是整行均是空数据
- // 则忽视改行(因为本人的工作内容不须要空行)-_-
- DataRow dr = dt.NewRow();
- int i = ;
- int nullRowCount = i;
- foreach (Cell cell in row)
- {
- string cellVal = GetValue(cell, stringTable);
- if (cellVal == string.Empty)
- {
- nullRowCount++;
- }
- dr[i] = cellVal;
- i++;
- }
- if (nullRowCount != i)
- {
- dt.Rows.Add(dr);
- }
- }
- /// <summary>
- /// 获取单位格的值
- /// </summary>
- /// <param name="cell"></param>
- /// <param name="stringTablePart"></param>
- /// <returns></returns>
- private string GetValue(Cell cell, SharedStringTable stringTable)
- {
- //因为Excel的数据存储在SharedStringTable中,须要获取数据在SharedStringTable 中的索引
- string value = string.Empty;
- try
- {
- if (cell.ChildElements.Count == )
- return value;
- value = double.Parse(cell.CellValue.InnerText).ToString();
- if ((cell.DataType != null) && (cell.DataType == CellValues.SharedString))
- {
- value = stringTable.ChildElements[Int32.Parse(value)].InnerText;
- }
- }
- catch (Exception)
- {
- value = "N/A";
- }
- return value;
- }
- /// <summary>
- /// 判断网格是否存在列
- /// </summary>
- /// <param name="dt">网格</param>
- /// <param name="columnName">列名</param>
- /// <returns></returns>
- public bool IsContainsColumn(DataTable dt, string columnName)
- {
- if (dt == null || columnName == null)
- {
- return false;
- }
- return dt.Columns.Contains(columnName);
- }
使用:
- FileStream fs = new FileStream(@"D:\工作簿1.xlsx", FileMode.Open, FileAccess.Read, FileShare.Read);
- DataTable dt=ReadExcel("Sheet1",fs);
via: http://www.cnblogs.com/tewuapple/archive/2012/09/03/2668725.html
使用OpenXML将Excel内容读取到DataTable中的更多相关文章
- excel to datatable (c#用NPOI将excel文件内容读取到datatable数据表中)
将excel文件内容读取到datatable数据表中,支持97-2003和2007两种版本的excel 1.第一种是根据excel文件路径读取excel并返回datatable /// <sum ...
- 将文件中的内容读取到map中,并排除不需要的关键字然后输出
- NPOI操作Excel导入DataTable中
using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using System.Data; using System.IO; using NPOI.X ...
- 使用NPOI导入导出Excel(xls/xlsx)数据到DataTable中
using System; using System.Collections.Generic; using System.Text; using System.IO; using NPOI.SS.Us ...
- winfrom 使用NPOI导入导出Excel(xls/xlsx)数据到DataTable中
1.通过NUGET管理器下载nopi,在引入命令空间 using System; using System.Collections.Generic; using System.Text; using ...
- C# 实现复制Excel内容到DataGridview中
业务要求:复制:将Excel内容复制到datagridview中 最终效果:复制Excel内容,点击datagridview中的某个单元格,顺着这个单元格自动填充自动增加行.偷懒了,没写填充在选择哪些 ...
- C#如何对DataTable中的数据进行条件搜索
经常遇到将数据库中的数据读取到DataTable中的时候再次对DataTable进行条件筛选,下面的筛选的一个例子: DataRow[] dr = dt.Select("token = '& ...
- .NET小笔记-NPOI读取excel内容到DataTable
下载比较新的NPOI组件支持excel2007以上的,把.dll添加引用 引入命名空间 using NPOI.HSSF.UserModel;using NPOI.SS.UserModel;using ...
- C# 读取Excel内容
一.方法 1.OleD方法实现该功能. 2.本次随笔内容只包含读取Excel内容,并另存为. 二.代码 (1)找到文档代码 OpenFileDialog openFile = new OpenFile ...
随机推荐
- STM32固件库
一.STM32固件库开发和传统寄存器开发方式的区别 二.CMSIS标准 CMSIS标准--Cortex Microcontroller Software Interface Standard,是ARM ...
- Visual Studio Code扩展
Visual Studio Code扩展 注:本文提到的代码示例下载地址>How to create a simple extension for VS Code VS Code 是微软推出的一 ...
- jquery实现抽奖
用jquery实现抽奖小程序 用jquery实现抽奖小程序 这些日子,到处都可以看到关于微信小程序的新闻或报到,在博客园中写关于微信小程序的也不少.但是今天我要说的不是微信小程序,而是用简单的jq ...
- ios开发之C语言第4天
自增和自减运算 自增运算符 ++ 自增表达式 1>.前自增表达式. int num = 1; ++num; 2>.后自增表达式 int num = 1; n ...
- 【转载】JavaEE权限管理分析
JavaEE权限管理分析 一.背景 在 Web 应用开发中,安全一直是非常重要的一个方面.安全虽然属于应用的非功能性需求,但是应该在应用开发的初期就考虑进来.如果在应用开发的后期才考虑安全的问题,就可 ...
- asp.net 登陆后在ashx处理程序中获取不到Session
登录后存储Session,另一个页面Ajax请求 ashx页面,发现无法获取到Session,Session is NULL 使用“IReadOnlySessionState”这个接口就可以
- win7+ubuntu双系统安装攻略
一1.下载分区软件,为ubuntu安装分出一个区 2.磁盘管理器,选中该区,右键,删除卷,该区变为绿色,成为空闲区 3.成功 二为ubunt添加开机导引项 1,安装好easybcd2.0后,启动软件: ...
- QEvent整理归纳:140种类型,29个继承类,7个函数,3种事件来源
140种事件类型: QEvent::None QEvent::AccessibilityDescription QEvent::AccessibilityHelp QEvent::Accessibil ...
- TeeChart的最小步长和最大步长
/// <summary> /// 坐标轴的最大步长 /// </summary> public double MajorStep { get { return axis.Ca ...
- 《大数据Spark企业级实战 》
基本信息 作者: Spark亚太研究院 王家林 丛书名:决胜大数据时代Spark全系列书籍 出版社:电子工业出版社 ISBN:9787121247446 上架时间:2015-1-6 出版日期:20 ...