public class OpenXmlHelper
{
/// <summary>
/// 读取Excel数据到DataSet中,默认读取所有Sheet中的数据
/// </summary>
/// <param name="filePath">Excel文件路径</param>
/// <param name="sheetNames">Sheet名称列表,默认为null查询所有Sheet中的数据</param>
/// <returns></returns>
public static DataSet ReadExcel(string filePath, params string[] sheetNames)
{
try
{
using (SpreadsheetDocument doc = SpreadsheetDocument.Open(filePath, true))
{
IEnumerable<Sheet> sheets = doc.WorkbookPart.Workbook.Descendants<Sheet>();
if (sheetNames != null && sheetNames.Length > )
{
sheets = sheets.Where(s => sheetNames.ToList().Contains(s.Name));
}
DataSet ds = new DataSet();
SharedStringTable stringTable = doc.WorkbookPart.SharedStringTablePart.SharedStringTable;
foreach (Sheet sheet in sheets)
{
WorksheetPart sheetPart = (WorksheetPart)doc.WorkbookPart.GetPartById(sheet.Id);
IEnumerable<Row> rows = sheetPart.Worksheet.Descendants<Row>();
DataTable dt = new DataTable(sheet.Name);
foreach (Row row in rows)
{
if (row.RowIndex == )
{
GetDataColumn(row, stringTable, dt);
}
GetDataRow(row, stringTable, dt);
}
ds.Tables.Add(dt);
}
return ds;
}
}
catch (Exception ex)
{
//MessageBox.Show(ex.Message);
return null;
}
}

  #region help methods
/// <summary>
/// 把Spreadsheet行中的数据导出到DataTable中。
/// </summary>
/// <param name="row">Spreadsheet行</param>
/// <param name="stringTable">共享字符串表</param>
/// <param name="dt">DataTable</param>
private static void GetDataRow(Row row, SharedStringTable stringTable, DataTable dt)
{
DataRow dr = dt.NewRow();
string cellValue = string.Empty;
int i = ;
int nullCellCount = i;
foreach (Cell cell in row)
{
cellValue = GetCellValue(cell, stringTable);
if (cellValue == string.Empty)
nullCellCount++;
dr[i] = cellValue;
i++;
}
//如果一整行数据都没有数据,则不添加此行到DataTable中
if (nullCellCount != i)
dt.Rows.Add(dr);
} /// <summary>
/// 从Spreadsheet行中读取表头信息
/// </summary>
/// <param name="row">Spreadsheet行</param>
/// <param name="stringTable">共享字符串表</param>
/// <param name="dt">DataTable</param>
private static void GetDataColumn(Row row, SharedStringTable stringTable, DataTable dt)
{
DataColumn col = new DataColumn();
Dictionary<string, int> columnCountDict = new Dictionary<string, int>();
foreach (Cell cell in row)
{
string cellValue = GetCellValue(cell, stringTable);
col = new DataColumn(cellValue);
//由于Excel中的数据表列标题可以重复,而DataTable中不允许重复,因此在重复的列标题后追加递增数字
if (dt != null && dt.Columns.Contains(cellValue))
{
if (!columnCountDict.ContainsKey(cellValue))
{
columnCountDict.Add(cellValue, );
}
col.ColumnName = cellValue + (columnCountDict[cellValue]++);
}
dt.Columns.Add(col);
}
} /// <summary>
/// 获取Spreadsheet单元格的值
/// </summary>
/// <param name="cell">Spreadsheet单元格</param>
/// <param name="stringTable">共享字符串表</param>
/// <returns>Spreadsheet单元格的值</returns>
private static string GetCellValue(Cell cell, SharedStringTable stringTable)
{
string value = string.Empty;
try
{
if (cell.ChildElements.Count == )
{
return value;
}
value = cell.CellValue.InnerText;
if (cell.DataType != null && cell.DataType == CellValues.SharedString)
{
value = stringTable.ChildElements[int.Parse(value)].InnerText;
}
}
catch (Exception)
{
value = "N/A";
}
return value;
}
  #endregion
}

使用OpenXml把Excel中的数据导出到DataSet中的更多相关文章

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

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

  2. 机房收费系统——在VB中将MSHFlexGrid控件中的数据导出到Excel

    机房收费系统中,好多查询的窗体都包含同一个功能:将数据库中查询到的数据显示在MSHFlexGrid控件中,然后再把MSHFlexGrid控件中的数据导出到Excel表格中. 虽然之前做过学生信息管理系 ...

  3. Qt中将QTableView中的数据导出为Excel文件

    如果你在做一个报表类的程序,可能将内容导出为Excel文件是一项必须的功能.之前使用MFC的时候我就写过一个类,用于将grid中的数据导出为Excel文件.在使用了QtSql模块后,我很容易的将这个类 ...

  4. 将Datagridview中的数据导出至Excel中

        首先添加一个模块ImportToExcel,并添加引用         然后导入命名空间: Imports Microsoft.Office.Interop Imports System.Da ...

  5. WPF-将DataGrid控件中的数据导出到Excel

    原文:WPF-将DataGrid控件中的数据导出到Excel 导出至Excel是非常常见,我们可以用很多类库,例如Aspose.NOPI.Interop,在这里我们使用微软自家的工具.我的WPF绑定的 ...

  6. 如何将存储在MongoDB数据库中的数据导出到Excel中?

    将MongoDB数据库中的数据导出到Excel中,只需以下几个步骤: (1)首先,打开MongoDB安装目录下的bin文件夹,(C:\Program Files (x86)\MongoDB\Serve ...

  7. excel文件与txt文件互转,并且把excel里的数据导入到oracle中

    一.excel文件转换成txt文件的步骤 a.首先要把excel文件转换成txt文件 1.Excel另存为中已经包含了TXT格式,所以我们可以直接将Excel表格另存为TXT格式,但是最后的效果好像不 ...

  8. [软件共享]将数据库中的数据导出为SQL脚本

    可以直接将数据库中的数据导出为脚本,并可以自己设置过滤条件.使用方法很简单,不在多说了.下面是软件截图.123 下载:http://files.cnblogs.com/pw/mssql2.rar

  9. C#-WinForm-ListView-表格式展示数据、如何将数据库中的数据展示到ListView中、如何对选中的项进行修改

    在展示数据库中不知道数量的数据时怎么展示最好呢?--表格 ListView - 表格形式展示数据 ListView 常用属性 HeaderStyle - "详细信息"视图中列标头的 ...

随机推荐

  1. 结合源码看nginx-1.4.0之nginx事件驱动机制详解

    目录 0. 摘要 1. nginx事件模块组织结构 2. nginx事件模块数据结构及类图 3. nginx事件模块运行机制 4. 练习:一个简单的事件驱动模块 5. 小结 6. 参考源码

  2. javaScript入门1--组成,基本使用

    javaScript:脚本语言,最初是为了实现在客户端进行的表单验证以减少服务器的数据交互次数,如今可用在页面交互,计算,拥有了闭包,匿名(拉姆达)函数,甚至元编程等特性. javaScript实现的 ...

  3. CentOS(十)--与Linux文件和目录管理相关的一些重要命令②

    在结束了第二期的广交会实习之后,又迎来了几天休闲的日子,继续学习Linux.在上一篇随笔 Linux学习之CentOS(十七)--与Linux文件和目录管理相关的一些重要命令① 中,详细记录了与Lin ...

  4. Java操作字符串的工具类

    操作字符串的工具类 import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintStre ...

  5. JavaScript基础笔记一

    一.真假判断 真的:true.非零数字.非空字符串.非空对象 假的:false.数字零.空字符串.空对象.undefined 例: if(0){ alert(1) }else{ alert(2) } ...

  6. Redis - HyperLogLogs

    A HyperLogLog is a probabilistic data structure used in order to count unique things (technically th ...

  7. IIS服务器应用程序不可用的解决办法

    转载:http://www.cnblogs.com/caicainiao/archive/2010/11/29/1891085.html 这个问题见了好几次,在.net下 Microsoft visu ...

  8. .NET委托与事件文章收集

    学习这方面的知识,先将文章收集着,以待以后查看. 张子阳 C# 中的委托和事件

  9. unity3d遍历出Cube里面所有子对象

     cube目录下有n个cube,可不可以一下子遍历出所有的对象,而不用一个一个的find?find(“Cube1”)   1.foreach(Transform ts in cube)   2.cub ...

  10. React-Native错误笔记-EPERM

    运行react-native run-android时出现错误 EPERM:operation not permitted,lstat .............. 解决办法:用Android Stu ...