使用OpenXml把Excel中的数据导出到DataSet中
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中的更多相关文章
- C# 将Excel里面的数据填充到DataSet中
/// <summary> /// 将Excel表里的数据填充到DataSet中 /// </summary> /// <param name="filenam ...
- 机房收费系统——在VB中将MSHFlexGrid控件中的数据导出到Excel
机房收费系统中,好多查询的窗体都包含同一个功能:将数据库中查询到的数据显示在MSHFlexGrid控件中,然后再把MSHFlexGrid控件中的数据导出到Excel表格中. 虽然之前做过学生信息管理系 ...
- Qt中将QTableView中的数据导出为Excel文件
如果你在做一个报表类的程序,可能将内容导出为Excel文件是一项必须的功能.之前使用MFC的时候我就写过一个类,用于将grid中的数据导出为Excel文件.在使用了QtSql模块后,我很容易的将这个类 ...
- 将Datagridview中的数据导出至Excel中
首先添加一个模块ImportToExcel,并添加引用 然后导入命名空间: Imports Microsoft.Office.Interop Imports System.Da ...
- WPF-将DataGrid控件中的数据导出到Excel
原文:WPF-将DataGrid控件中的数据导出到Excel 导出至Excel是非常常见,我们可以用很多类库,例如Aspose.NOPI.Interop,在这里我们使用微软自家的工具.我的WPF绑定的 ...
- 如何将存储在MongoDB数据库中的数据导出到Excel中?
将MongoDB数据库中的数据导出到Excel中,只需以下几个步骤: (1)首先,打开MongoDB安装目录下的bin文件夹,(C:\Program Files (x86)\MongoDB\Serve ...
- excel文件与txt文件互转,并且把excel里的数据导入到oracle中
一.excel文件转换成txt文件的步骤 a.首先要把excel文件转换成txt文件 1.Excel另存为中已经包含了TXT格式,所以我们可以直接将Excel表格另存为TXT格式,但是最后的效果好像不 ...
- [软件共享]将数据库中的数据导出为SQL脚本
可以直接将数据库中的数据导出为脚本,并可以自己设置过滤条件.使用方法很简单,不在多说了.下面是软件截图.123 下载:http://files.cnblogs.com/pw/mssql2.rar
- C#-WinForm-ListView-表格式展示数据、如何将数据库中的数据展示到ListView中、如何对选中的项进行修改
在展示数据库中不知道数量的数据时怎么展示最好呢?--表格 ListView - 表格形式展示数据 ListView 常用属性 HeaderStyle - "详细信息"视图中列标头的 ...
随机推荐
- Call to undefined function imagettftext()解决方法
由 老高 发表于 2014-10-03 在 代码人生 分类 老高在一个新环境中装DEDECMS的时候发现后台验证码无法显示.直接搜索一下这个错误,有人说session错误,有的说权限错误等等,这不胡 ...
- 【补】【FZU月赛】【20150515】【待续】
A FZU-2054 水题,比较A,B双方的最大值即可. B FZU-2055 string,截取‘.’之前和之后然后和给出的文件夹名和拓展名比较就好了啊,不明白为什么那么多人错. 代码: #incl ...
- JavaScript部分总结
一.词法结构 1.js里面区分大小写 2.注释分为两类: // 单行注释 /*多行注释*/ 3.字面量(直接量 literal) 12 ...
- ORACLE之PACKAGE
刚学pl/sql编程,写了两个package.pkg_temp_fn和pkg_temp_fn2.内容涉及pl/sql基本语法,游标,存储过程(in,out),函数(有返回值). pkg_temp_fn ...
- ActiveMQ(5.10.0) - Configuring the JAAS Authentication Plug-in
JAAS provides pluggable authentication, which means ActiveMQ will use the same authentication API re ...
- spark集成hive遭遇mysql check失败的问题
问题: spark集成hive,启动spark-shell或者spark-sql的时候,报错: INFO MetaStoreDirectSql: MySQL check failed, assumin ...
- android手机中图片的拖拉及浏览功能
配置文件 activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/andro ...
- hive 未初始化元数据库报错
启动hive-metastore和hive-server2 用beeline连接hive报错 [root@node04 hive]# beeline Beeline version 0.13.1-cd ...
- python之平台独立的调试工具winpdb介绍
Winpdb is a platform independent graphical GPL Python debugger with support for remote debugging ove ...
- Android 开机自启动应用
Android启动时,会发出一个系统广播 ACTION_BOOT_COMPLETED,它的字符串常量表示为 “android.intent.action.BOOT_COMPLETED” 开机自启动程序 ...