Excel 数据读入到DataSet
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Data;
- using System.IO;
- using System.Xml;
- using DocumentFormat.OpenXml.Packaging;
- using DocumentFormat.OpenXml.Spreadsheet;
- using DocumentFormat.OpenXml;
- namespace ECLink.Common
- {
- /// <summary>
- /// 采用openxml方式把excel转换成DataSet
- /// </summary>
- public class ExcelHelper
- {
- public ExcelHelper()
- {
- }
- /// <summary>
- /// 将Excel多单一表转化为DataSet数据集对象
- /// </summary>
- /// <param name="filePath">Excel文件路径</param>
- /// <returns>转化的数据集</returns>
- public DataSet ExcelToDataSet(string filePath)
- {
- DataSet dataSet = new DataSet();
- try
- {
- using (SpreadsheetDocument spreadDocument = SpreadsheetDocument.Open(filePath, false))
- {
- //指定WorkbookPart对象
- WorkbookPart workBookPart = spreadDocument.WorkbookPart;
- //获取Excel中SheetName集合
- List<string> sheetNames = GetSheetNames(workBookPart);
- foreach (string sheetName in sheetNames)
- {
- DataTable dataTable = WorkSheetToTable(workBookPart, sheetName);
- if (dataTable != null)
- {
- dataSet.Tables.Add(dataTable);//将表添加到数据集
- }
- }
- }
- }
- catch (Exception exp)
- {
- throw new Exception("可能Excel正在打开中,请关闭重新操作!");
- }
- return dataSet;
- }
- /// <summary>
- /// 根据WorkbookPart和表名创建DataTable对象
- /// </summary>
- /// <param name="workBookPart">WorkbookPart对象</param>
- /// <param name="tableName">表名</param>
- /// <returns>转化后的DataTable</returns>
- public DataTable WorkSheetToTable(WorkbookPart workBookPart, string sheetName)
- {
- //创建Table
- DataTable dataTable = new DataTable(sheetName);
- //根据WorkbookPart和sheetName获取该Sheet下所有行数据
- IEnumerable<Row> sheetRows = GetWorkBookPartRows(workBookPart, sheetName);
- IEnumerable<Column> sheetColumns = GetWorkBookPartColumns(workBookPart, sheetName);
- if (sheetRows == null || sheetRows.Count() <= )
- {
- return null;
- }
- SharedStringTable stringTable = workBookPart.SharedStringTablePart.SharedStringTable;
- //将数据导入DataTable,假定第一行为列名,第二行以后为数据
- foreach (Row row in sheetRows)
- {
- //获取Excel中的列头
- if (row.RowIndex == )
- {
- GetDataColumn(row, stringTable, ref dataTable);
- }
- else
- {
- GetDataRow(row, stringTable, ref dataTable);
- }
- }
- return dataTable;
- }
- /// <summary>
- /// 根据WorkbookPart获取所有SheetName
- /// </summary>
- /// <param name="workBookPart"></param>
- /// <returns>SheetName集合</returns>
- private List<string> GetSheetNames(WorkbookPart workBookPart)
- {
- List<string> sheetNames = new List<string>();
- Sheets sheets = workBookPart.Workbook.Sheets;
- foreach (Sheet sheet in sheets)
- {
- string sheetName = sheet.Name;
- if (!string.IsNullOrEmpty(sheetName))
- {
- sheetNames.Add(sheetName);
- }
- }
- return sheetNames;
- }
- /// <summary>
- /// 根据WorkbookPart和sheetName获取该Sheet下所有Row数据
- /// </summary>
- /// <param name="workBookPart">WorkbookPart对象</param>
- /// <param name="sheetName">SheetName</param>
- /// <returns>该SheetName下的所有Row数据</returns>
- public IEnumerable<Row> GetWorkBookPartRows(WorkbookPart workBookPart, string sheetName)
- {
- IEnumerable<Row> sheetRows = null;
- //根据表名在WorkbookPart中获取Sheet集合
- IEnumerable<Sheet> sheets = workBookPart.Workbook.Descendants<Sheet>().Where(s => s.Name == sheetName);
- if (sheets.Count() == )
- {
- return null;//没有数据
- }
- WorksheetPart workSheetPart = workBookPart.GetPartById(sheets.First().Id) as WorksheetPart;
- //获取Excel中得到的行
- sheetRows = workSheetPart.Worksheet.Descendants<Row>();
- return sheetRows;
- }
- /// <summary>
- /// 根据WorkbookPart和sheetName获取该Sheet下所有Row数据
- /// </summary>
- /// <param name="workBookPart">WorkbookPart对象</param>
- /// <param name="sheetName">SheetName</param>
- /// <returns>该SheetName下的所有Row数据</returns>
- public IEnumerable<Column> GetWorkBookPartColumns(WorkbookPart workBookPart, string sheetName)
- {
- IEnumerable<Column> sheetColumns = null;
- //根据表名在WorkbookPart中获取Sheet集合
- IEnumerable<Sheet> sheets = workBookPart.Workbook.Descendants<Sheet>().Where(s => s.Name == sheetName);
- if (sheets.Count() == )
- {
- return null;//没有数据
- }
- WorksheetPart workSheetPart = workBookPart.GetPartById(sheets.First().Id) as WorksheetPart;
- sheetColumns = workSheetPart.Worksheet.Descendants<Column>(); //获取Excel中得到的行
- return sheetColumns;
- }
- /// <summary>
- /// 获取Excel中多表的表名
- /// </summary>
- /// <param name="filePath"></param>
- /// <returns></returns>
- private List<string> GetExcelSheetNames(string filePath)
- {
- string sheetName = string.Empty;
- List<string> sheetNames = new List<string>();//所有Sheet表名
- using (SpreadsheetDocument spreadDocument = SpreadsheetDocument.Open(filePath, false))
- {
- WorkbookPart workBook = spreadDocument.WorkbookPart;
- Stream stream = workBook.GetStream(FileMode.Open);
- XmlDocument xmlDocument = new XmlDocument();
- xmlDocument.Load(stream);
- XmlNamespaceManager xmlNSManager = new XmlNamespaceManager(xmlDocument.NameTable);
- xmlNSManager.AddNamespace("default", xmlDocument.DocumentElement.NamespaceURI);
- XmlNodeList nodeList = xmlDocument.SelectNodes("//default:sheets/default:sheet", xmlNSManager);
- foreach (XmlNode node in nodeList)
- {
- sheetName = node.Attributes["name"].Value;
- sheetNames.Add(sheetName);
- }
- }
- return sheetNames;
- }
- #region 采用openxml方式把excel转换成dataTable
- /// <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);
- }
- #endregion
- #region SaveCell
- private void InsertTextCellValue(Worksheet worksheet, string column, uint row, string value)
- {
- Cell cell = ReturnCell(worksheet, column, row);
- CellValue v = new CellValue();
- v.Text = value;
- cell.AppendChild(v);
- cell.DataType = new EnumValue<CellValues>(CellValues.String);
- worksheet.Save();
- }
- private void InsertNumberCellValue(Worksheet worksheet, string column, uint row, string value)
- {
- Cell cell = ReturnCell(worksheet, column, row);
- CellValue v = new CellValue();
- v.Text = value;
- cell.AppendChild(v);
- cell.DataType = new EnumValue<CellValues>(CellValues.Number);
- worksheet.Save();
- }
- private static Cell ReturnCell(Worksheet worksheet, string columnName, uint row)
- {
- Row targetRow = ReturnRow(worksheet, row);
- if (targetRow == null)
- return null;
- return targetRow.Elements<Cell>().Where(c =>
- string.Compare(c.CellReference.Value, columnName + row,
- true) == ).First();
- }
- private static Row ReturnRow(Worksheet worksheet, uint row)
- {
- return worksheet.GetFirstChild<SheetData>().
- Elements<Row>().Where(r => r.RowIndex == row).First();
- }
- #endregion
- }
- }
Excel 数据读入到DataSet的更多相关文章
- Excel数据导入至Dataset中
public static DataSet ExcelToDataSet(string ppfilenameurl,string pptable) { string strConn = "P ...
- 将excel数据读入matlab
1.[NUM,TXT,RAW]=xlsread('example'),其中example是你的excel名,假设所有的数据都在example.xls中. 2.NUM返回的是excel中的数据,TXT输 ...
- GridView数据导入Excel/Excel数据读入GridView
原文发布时间为:2008-10-16 -- 来源于本人的百度文章 [由搬家工具导入] 效果图: 解决方案:页面增加一个按钮,单击事件添加如下方法:protected void Button1_Clic ...
- 将Excel数据读入DataGridView
OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "Microsoft Excel ...
- ASP.NET Excel数据导入数据库
<identity impersonate="true"/> 是指模拟IIS身份验证 導入錯誤時可刪除 protected void btnImport_Click(o ...
- C#将Excel数据导入数据库(MySQL或Sql Server)
最近一直很忙,很久没写博客了.今天给大家讲解一下如何用C#将Excel数据导入Excel,同时在文章最后附上如何用sqlserver和mysql工具导入数据. 导入过程大致分为两步: 1.将excel ...
- 使用OpenXml把Excel中的数据导出到DataSet中
public class OpenXmlHelper { /// <summary> /// 读取Excel数据到DataSet中,默认读取所有Sheet中的数据 /// </sum ...
- C# 将Excel里面的数据填充到DataSet中
/// <summary> /// 将Excel表里的数据填充到DataSet中 /// </summary> /// <param name="filenam ...
- asp.net实现 EXCEL数据导入到数据库功能
在项目中经常要用EXCEL导入数据到数据库,提高工作效率. 注意:EXCEL中的第一行不能导入. 下面是源码: IntoExcel.aspx: [csharp] <%@ Page Languag ...
随机推荐
- mysql5.6以上版本: timestamp current_timestamp报1064/1067错误
mysql5.6以上版本: timestamp current_timestamp报1064/1067错误 在创建时间字段的时候 DEFAULT CURRENT_TIMESTAMP表示当插入数据的时候 ...
- causal snps | causal variants | tensorflow | 神经网络实战 | Data Simulation
先读几篇文章: Interpretation of Association Signals and Identification of Causal Variants from Genome-wide ...
- ionic3 打包一个已签名的apk
1 进入ionic官方文档,点击左边导航菜单,找到INTRO下的Deploying2 终端进入项目目录(根据项目环境定是否需要root权限)3 运行命令ionic cordova build andr ...
- vs2013+caffe+cpu
1.下载caffe官网提供的工具包,复制Windows下CommonSettings.props.example,后缀改为CommonSettings.props 2.由于电脑无GPU,所以修改复制过 ...
- 55 Django静态文件配置
一.Django静态文件配置 1.项目文件夹,新建一个文件夹statics 文件夹 2.在配置文件settings.py中,配置: 文件中有第句: STATIC_URL = '/static/'#静态 ...
- IntelliJ IDEA调试方法补充
基本用法&快捷键 1.首先说第一组按钮,共8个按钮,从左到右依次如下: > Show Execution Point (Alt + F10):如果你的光标在其它行或其它页面,点击这个按钮 ...
- 【Java】【6】JDK8 Stream操作整理
摘要: 1,List<EntityOld>转换为List<EntityNew> List<EntityOld> list = oldList; List<En ...
- 【IDEA】【1】准备工作
1,官方网址(https://www.jetbrains.com/idea/) 2,网盘地址(为ideaIU-2018.2.5) 链接:https://pan.baidu.com/s/1oLgY_Pb ...
- python-day91--JS实现的ajax
一.AJAX核心(XMLHttpRequest) 其实AJAX就是在Javascript中多添加了一个对象:XMLHttpRequest对象.所有的异步交互都是使用XMLHttpServlet对象完成 ...
- ubuntu Sublime Text 2编辑器安装
官网下载http://www.sublimetext.com/2 选择合适的包下载回来的格式是.tar.bz2格式,需要进行解压. 1,解压:tar -xvf Sublime\ Text\ 2.0.2 ...