1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Data;
  5. using System.IO;
  6. using System.Xml;
  7. using DocumentFormat.OpenXml.Packaging;
  8. using DocumentFormat.OpenXml.Spreadsheet;
  9. using DocumentFormat.OpenXml;
  10.  
  11. namespace ECLink.Common
  12. {
  13. /// <summary>
  14. /// 采用openxml方式把excel转换成DataSet
  15. /// </summary>
  16. public class ExcelHelper
  17. {
  18. public ExcelHelper()
  19. {
  20.  
  21. }
  22. /// <summary>
  23. /// 将Excel多单一表转化为DataSet数据集对象
  24. /// </summary>
  25. /// <param name="filePath">Excel文件路径</param>
  26. /// <returns>转化的数据集</returns>
  27. public DataSet ExcelToDataSet(string filePath)
  28. {
  29. DataSet dataSet = new DataSet();
  30. try
  31. {
  32. using (SpreadsheetDocument spreadDocument = SpreadsheetDocument.Open(filePath, false))
  33. {
  34. //指定WorkbookPart对象
  35. WorkbookPart workBookPart = spreadDocument.WorkbookPart;
  36. //获取Excel中SheetName集合
  37. List<string> sheetNames = GetSheetNames(workBookPart);
  38.  
  39. foreach (string sheetName in sheetNames)
  40. {
  41. DataTable dataTable = WorkSheetToTable(workBookPart, sheetName);
  42. if (dataTable != null)
  43. {
  44. dataSet.Tables.Add(dataTable);//将表添加到数据集
  45. }
  46. }
  47. }
  48. }
  49. catch (Exception exp)
  50. {
  51. throw new Exception("可能Excel正在打开中,请关闭重新操作!");
  52. }
  53. return dataSet;
  54. }
  55.  
  56. /// <summary>
  57. /// 根据WorkbookPart和表名创建DataTable对象
  58. /// </summary>
  59. /// <param name="workBookPart">WorkbookPart对象</param>
  60. /// <param name="tableName">表名</param>
  61. /// <returns>转化后的DataTable</returns>
  62. public DataTable WorkSheetToTable(WorkbookPart workBookPart, string sheetName)
  63. {
  64. //创建Table
  65. DataTable dataTable = new DataTable(sheetName);
  66.  
  67. //根据WorkbookPart和sheetName获取该Sheet下所有行数据
  68. IEnumerable<Row> sheetRows = GetWorkBookPartRows(workBookPart, sheetName);
  69. IEnumerable<Column> sheetColumns = GetWorkBookPartColumns(workBookPart, sheetName);
  70.  
  71. if (sheetRows == null || sheetRows.Count() <= )
  72. {
  73. return null;
  74. }
  75.  
  76. SharedStringTable stringTable = workBookPart.SharedStringTablePart.SharedStringTable;
  77. //将数据导入DataTable,假定第一行为列名,第二行以后为数据
  78. foreach (Row row in sheetRows)
  79. {
  80. //获取Excel中的列头
  81. if (row.RowIndex == )
  82. {
  83. GetDataColumn(row, stringTable, ref dataTable);
  84. }
  85. else
  86. {
  87. GetDataRow(row, stringTable, ref dataTable);
  88. }
  89. }
  90. return dataTable;
  91. }
  92.  
  93. /// <summary>
  94. /// 根据WorkbookPart获取所有SheetName
  95. /// </summary>
  96. /// <param name="workBookPart"></param>
  97. /// <returns>SheetName集合</returns>
  98. private List<string> GetSheetNames(WorkbookPart workBookPart)
  99. {
  100. List<string> sheetNames = new List<string>();
  101. Sheets sheets = workBookPart.Workbook.Sheets;
  102. foreach (Sheet sheet in sheets)
  103. {
  104. string sheetName = sheet.Name;
  105. if (!string.IsNullOrEmpty(sheetName))
  106. {
  107. sheetNames.Add(sheetName);
  108. }
  109. }
  110. return sheetNames;
  111. }
  112.  
  113. /// <summary>
  114. /// 根据WorkbookPart和sheetName获取该Sheet下所有Row数据
  115. /// </summary>
  116. /// <param name="workBookPart">WorkbookPart对象</param>
  117. /// <param name="sheetName">SheetName</param>
  118. /// <returns>该SheetName下的所有Row数据</returns>
  119. public IEnumerable<Row> GetWorkBookPartRows(WorkbookPart workBookPart, string sheetName)
  120. {
  121. IEnumerable<Row> sheetRows = null;
  122. //根据表名在WorkbookPart中获取Sheet集合
  123. IEnumerable<Sheet> sheets = workBookPart.Workbook.Descendants<Sheet>().Where(s => s.Name == sheetName);
  124. if (sheets.Count() == )
  125. {
  126. return null;//没有数据
  127. }
  128.  
  129. WorksheetPart workSheetPart = workBookPart.GetPartById(sheets.First().Id) as WorksheetPart;
  130. //获取Excel中得到的行
  131. sheetRows = workSheetPart.Worksheet.Descendants<Row>();
  132. return sheetRows;
  133. }
  134.  
  135. /// <summary>
  136. /// 根据WorkbookPart和sheetName获取该Sheet下所有Row数据
  137. /// </summary>
  138. /// <param name="workBookPart">WorkbookPart对象</param>
  139. /// <param name="sheetName">SheetName</param>
  140. /// <returns>该SheetName下的所有Row数据</returns>
  141. public IEnumerable<Column> GetWorkBookPartColumns(WorkbookPart workBookPart, string sheetName)
  142. {
  143. IEnumerable<Column> sheetColumns = null;
  144. //根据表名在WorkbookPart中获取Sheet集合
  145. IEnumerable<Sheet> sheets = workBookPart.Workbook.Descendants<Sheet>().Where(s => s.Name == sheetName);
  146. if (sheets.Count() == )
  147. {
  148. return null;//没有数据
  149. }
  150.  
  151. WorksheetPart workSheetPart = workBookPart.GetPartById(sheets.First().Id) as WorksheetPart;
  152.  
  153. sheetColumns = workSheetPart.Worksheet.Descendants<Column>(); //获取Excel中得到的行
  154.  
  155. return sheetColumns;
  156. }
  157.  
  158. /// <summary>
  159. /// 获取Excel中多表的表名
  160. /// </summary>
  161. /// <param name="filePath"></param>
  162. /// <returns></returns>
  163. private List<string> GetExcelSheetNames(string filePath)
  164. {
  165. string sheetName = string.Empty;
  166. List<string> sheetNames = new List<string>();//所有Sheet表名
  167. using (SpreadsheetDocument spreadDocument = SpreadsheetDocument.Open(filePath, false))
  168. {
  169. WorkbookPart workBook = spreadDocument.WorkbookPart;
  170. Stream stream = workBook.GetStream(FileMode.Open);
  171. XmlDocument xmlDocument = new XmlDocument();
  172. xmlDocument.Load(stream);
  173.  
  174. XmlNamespaceManager xmlNSManager = new XmlNamespaceManager(xmlDocument.NameTable);
  175. xmlNSManager.AddNamespace("default", xmlDocument.DocumentElement.NamespaceURI);
  176. XmlNodeList nodeList = xmlDocument.SelectNodes("//default:sheets/default:sheet", xmlNSManager);
  177.  
  178. foreach (XmlNode node in nodeList)
  179. {
  180. sheetName = node.Attributes["name"].Value;
  181. sheetNames.Add(sheetName);
  182. }
  183. }
  184. return sheetNames;
  185. }
  186.  
  187. #region 采用openxml方式把excel转换成dataTable
  188.  
  189. /// <summary>
  190. /// 构建DataTable的列
  191. /// </summary>
  192. /// <param name="row">OpenXML定义的Row对象</param>
  193. /// <param name="stringTablePart"></param>
  194. /// <param name="dt">须要返回的DataTable对象</param>
  195. /// <returns></returns>
  196. public void GetDataColumn(Row row, SharedStringTable stringTable, ref DataTable dt)
  197. {
  198. DataColumn col = new DataColumn();
  199. Dictionary<string, int> columnCount = new Dictionary<string, int>();
  200. foreach (Cell cell in row)
  201. {
  202. string cellVal = GetValue(cell, stringTable);
  203. col = new DataColumn(cellVal);
  204. if (IsContainsColumn(dt, col.ColumnName))
  205. {
  206. if (!columnCount.ContainsKey(col.ColumnName))
  207. columnCount.Add(col.ColumnName, );
  208. col.ColumnName = col.ColumnName + (columnCount[col.ColumnName]++);
  209. }
  210. dt.Columns.Add(col);
  211. }
  212. }
  213. /// <summary>
  214. /// 构建DataTable的每一行数据,并返回该Datatable
  215. /// </summary>
  216. /// <param name="row">OpenXML的行</param>
  217. /// <param name="stringTablePart"></param>
  218. /// <param name="dt">DataTable</param>
  219. private void GetDataRow(Row row, SharedStringTable stringTable, ref DataTable dt)
  220. {
  221. // 读取算法:按行一一读取单位格,若是整行均是空数据
  222. DataRow dr = dt.NewRow();
  223. int i = ;
  224. int nullRowCount = i;
  225. foreach (Cell cell in row)
  226. {
  227. string cellVal = GetValue(cell, stringTable);
  228. if (cellVal == string.Empty)
  229. {
  230. nullRowCount++;
  231. }
  232. dr[i] = cellVal;
  233. i++;
  234. }
  235. if (nullRowCount != i)
  236. {
  237. dt.Rows.Add(dr);
  238. }
  239. }
  240. /// <summary>
  241. /// 获取单位格的值
  242. /// </summary>
  243. /// <param name="cell"></param>
  244. /// <param name="stringTablePart"></param>
  245. /// <returns></returns>
  246. private string GetValue(Cell cell, SharedStringTable stringTable)
  247. {
  248. //因为Excel的数据存储在SharedStringTable中,须要获取数据在SharedStringTable 中的索引
  249. string value = string.Empty;
  250. try
  251. {
  252. if (cell.ChildElements.Count == )
  253. return value;
  254. value = double.Parse(cell.CellValue.InnerText).ToString();
  255. if ((cell.DataType != null) && (cell.DataType == CellValues.SharedString))
  256. {
  257. value = stringTable.ChildElements[Int32.Parse(value)].InnerText;
  258. }
  259. }
  260. catch (Exception)
  261. {
  262. value = "N/A";
  263. }
  264. return value;
  265. }
  266. /// <summary>
  267. /// 判断网格是否存在列
  268. /// </summary>
  269. /// <param name="dt">网格</param>
  270. /// <param name="columnName">列名</param>
  271. /// <returns></returns>
  272. public bool IsContainsColumn(DataTable dt, string columnName)
  273. {
  274. if (dt == null || columnName == null)
  275. {
  276. return false;
  277. }
  278. return dt.Columns.Contains(columnName);
  279. }
  280.  
  281. #endregion
  282.  
  283. #region SaveCell
  284. private void InsertTextCellValue(Worksheet worksheet, string column, uint row, string value)
  285. {
  286. Cell cell = ReturnCell(worksheet, column, row);
  287. CellValue v = new CellValue();
  288. v.Text = value;
  289. cell.AppendChild(v);
  290. cell.DataType = new EnumValue<CellValues>(CellValues.String);
  291. worksheet.Save();
  292. }
  293. private void InsertNumberCellValue(Worksheet worksheet, string column, uint row, string value)
  294. {
  295. Cell cell = ReturnCell(worksheet, column, row);
  296. CellValue v = new CellValue();
  297. v.Text = value;
  298. cell.AppendChild(v);
  299. cell.DataType = new EnumValue<CellValues>(CellValues.Number);
  300. worksheet.Save();
  301. }
  302. private static Cell ReturnCell(Worksheet worksheet, string columnName, uint row)
  303. {
  304. Row targetRow = ReturnRow(worksheet, row);
  305.  
  306. if (targetRow == null)
  307. return null;
  308.  
  309. return targetRow.Elements<Cell>().Where(c =>
  310. string.Compare(c.CellReference.Value, columnName + row,
  311. true) == ).First();
  312. }
  313. private static Row ReturnRow(Worksheet worksheet, uint row)
  314. {
  315. return worksheet.GetFirstChild<SheetData>().
  316. Elements<Row>().Where(r => r.RowIndex == row).First();
  317. }
  318. #endregion
  319. }
  320. }

Excel 数据读入到DataSet的更多相关文章

  1. Excel数据导入至Dataset中

    public static DataSet ExcelToDataSet(string ppfilenameurl,string pptable) { string strConn = "P ...

  2. 将excel数据读入matlab

    1.[NUM,TXT,RAW]=xlsread('example'),其中example是你的excel名,假设所有的数据都在example.xls中. 2.NUM返回的是excel中的数据,TXT输 ...

  3. GridView数据导入Excel/Excel数据读入GridView

    原文发布时间为:2008-10-16 -- 来源于本人的百度文章 [由搬家工具导入] 效果图: 解决方案:页面增加一个按钮,单击事件添加如下方法:protected void Button1_Clic ...

  4. 将Excel数据读入DataGridView

    OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "Microsoft Excel ...

  5. ASP.NET Excel数据导入数据库

    <identity impersonate="true"/> 是指模拟IIS身份验证 導入錯誤時可刪除 protected void btnImport_Click(o ...

  6. C#将Excel数据导入数据库(MySQL或Sql Server)

    最近一直很忙,很久没写博客了.今天给大家讲解一下如何用C#将Excel数据导入Excel,同时在文章最后附上如何用sqlserver和mysql工具导入数据. 导入过程大致分为两步: 1.将excel ...

  7. 使用OpenXml把Excel中的数据导出到DataSet中

    public class OpenXmlHelper { /// <summary> /// 读取Excel数据到DataSet中,默认读取所有Sheet中的数据 /// </sum ...

  8. C# 将Excel里面的数据填充到DataSet中

    /// <summary> /// 将Excel表里的数据填充到DataSet中 /// </summary> /// <param name="filenam ...

  9. asp.net实现 EXCEL数据导入到数据库功能

    在项目中经常要用EXCEL导入数据到数据库,提高工作效率. 注意:EXCEL中的第一行不能导入. 下面是源码: IntoExcel.aspx: [csharp] <%@ Page Languag ...

随机推荐

  1. mysql5.6以上版本: timestamp current_timestamp报1064/1067错误

    mysql5.6以上版本: timestamp current_timestamp报1064/1067错误 在创建时间字段的时候 DEFAULT CURRENT_TIMESTAMP表示当插入数据的时候 ...

  2. causal snps | causal variants | tensorflow | 神经网络实战 | Data Simulation

    先读几篇文章: Interpretation of Association Signals and Identification of Causal Variants from Genome-wide ...

  3. ionic3 打包一个已签名的apk

    1 进入ionic官方文档,点击左边导航菜单,找到INTRO下的Deploying2 终端进入项目目录(根据项目环境定是否需要root权限)3 运行命令ionic cordova build andr ...

  4. vs2013+caffe+cpu

    1.下载caffe官网提供的工具包,复制Windows下CommonSettings.props.example,后缀改为CommonSettings.props 2.由于电脑无GPU,所以修改复制过 ...

  5. 55 Django静态文件配置

    一.Django静态文件配置 1.项目文件夹,新建一个文件夹statics 文件夹 2.在配置文件settings.py中,配置: 文件中有第句: STATIC_URL = '/static/'#静态 ...

  6. IntelliJ IDEA调试方法补充

    基本用法&快捷键 1.首先说第一组按钮,共8个按钮,从左到右依次如下: > Show Execution Point (Alt + F10):如果你的光标在其它行或其它页面,点击这个按钮 ...

  7. 【Java】【6】JDK8 Stream操作整理

    摘要: 1,List<EntityOld>转换为List<EntityNew> List<EntityOld> list = oldList; List<En ...

  8. 【IDEA】【1】准备工作

    1,官方网址(https://www.jetbrains.com/idea/) 2,网盘地址(为ideaIU-2018.2.5) 链接:https://pan.baidu.com/s/1oLgY_Pb ...

  9. python-day91--JS实现的ajax

    一.AJAX核心(XMLHttpRequest) 其实AJAX就是在Javascript中多添加了一个对象:XMLHttpRequest对象.所有的异步交互都是使用XMLHttpServlet对象完成 ...

  10. ubuntu Sublime Text 2编辑器安装

    官网下载http://www.sublimetext.com/2 选择合适的包下载回来的格式是.tar.bz2格式,需要进行解压. 1,解压:tar -xvf Sublime\ Text\ 2.0.2 ...