使用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 - "详细信息"视图中列标头的 ...
随机推荐
- Android(java)学习笔记98:关于string类型的面试题
package cn.itcast_02; /* * String s = new String(“hello”)和String s = “hello”;的区别? * 有.前者会创建2个对象,后者创建 ...
- Wince 设备环境和画笔应用
本文主要讲到的是画笔应用,在Wince -06环境下,画笔应用很广泛,很有技巧,这里笔者要着重介绍. 设备环境可以用一下图表示,主要是让大家大致了解Wince -06的设备环境,下面在图形舍虚设计中会 ...
- 【转】十二个移动App云测试服务盘点
随着移动设备.操作系统版本的碎片化,测试工作对于移动开发团队而言越来越成为一个沉重的包袱,不过这也带来了商机,现在市场上有不少服务和平台提供云测试工具,可以对移动App进行自动化测试,提供测试报告和优 ...
- Web前端学习笔记2
一.开发工具sublime的常用快捷键. 1. 快捷键 功能 ctrl+shift+D 快速复制 ctrl+L 快 ...
- tools安装
1.ruby安装 下载安装包 勾选中间一个 2.sass 安装 转换TB镜像 $ gem sources --remove https://rubygems.org/$ gem sources - ...
- 我的jquery之路
不知不觉jquery已经看完了. 以前不知道jquery是什么,现在依然不是很清晰.或许学习的结果就是这样吧,忘记你所学的.
- Jackson - Quickstart
JSON Three Ways Jackson offers three alternative methods (one with two variants) for processing JSON ...
- oracle中比较两表表结构差异和数据差异的方法
在工作中需要完成这么一个需求:比较两个表的表结构是否形相同,并找出差异.比较两个表中的数据是否相同,并找出差异数据? 分析:由于表结构中字段比较多,手工比较很浪费时间,而且不能保证不出错误.对于 ...
- unity3d鼠标经过物体时变颜色,离开时恢复
using UnityEngine; using System.Collections; public class MouseEvent_Color : MonoBehaviour { //物体初始颜 ...
- fresco的源码学习自我总结
前言 对fresco框架源码的阅读学习,学习优秀的编码方式和较为实用常见设计模式,该篇讲得比较浅,主要是理清三个主要类的之间的关系. 本篇目录 fresco框架的MVC模式 fresco的Drawee ...