使用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 - "详细信息"视图中列标头的 ...
随机推荐
- css笔记04:属性选择器
1.属性选择器: 带有 title 属性的所有元素设置样式: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN ...
- ReactNative 大图手势浏览技术分析
支持通用的手势缩放,手势跟随,多图翻页 手势系统 通过 PanResponder.create 创建手势响应者,分别在 onPanResponderMove 与 onPanResponderRelea ...
- Ubuntu环境下配置Nginx
/etc/nginx目录文件下: drwxr-xr-x 5 root root 4096 Apr 27 12:47 ./ drwxr-xr-x 104 root root 4096 Apr 27 ...
- Spring 事务管理高级应用难点剖析--转
第 1 部分 http://www.ibm.com/search/csass/search/?q=%E4%BA%8B%E5%8A%A1&sn=dw&lang=zh&cc=CN& ...
- LeetCode 342
Power of Four Given an integer (signed 32 bits), write a function to check whether it is a power of ...
- 转:OpenResty最佳实践(推荐了解lua语法)
看点: 1. Lua 语法的说明, 排版清晰易懂. 转: https://moonbingbing.gitbooks.io/openresty-best-practices/content/lua/m ...
- HTTP - 首部
首部类型 首部类型 说明 通用首部 客户端和服务器都可以使用的通用首部.可以在客户端.服务器和其他应用程序之间提供一些有用的通用首部. 请求首部 请求首部时请求报文特有的.它们为服务器提供 ...
- IIS实现301重定向
301永久重定向对SEO无任何不好的影响,而且网页A的关键词排名和PR级别都会传达给网页B,网站更换了域名,表示本网页永久性转移到另一个地址,对于搜索引擎优化|SEO来说,给搜索引擎一个友好的信息,告 ...
- C++ Iterator迭代器介绍及Iterator迭代器用法代码举例
C++ Iterator迭代器介绍 迭代器可被用来访问一个容器类的所包函的全部元素,其行为像一个指针.举一个例子,你可用一个迭代器来实现对vector容器中所含元素的遍历.有这么几种迭代器如下: 迭代 ...
- struts2文件上传(保存为BLOB格式)
html文件:提供上传文件的入口 <input type="file" name="upload"><!-- name很重要,与后面actio ...