首页 > 代码库 > 使用NPOI读取Excel数据到DataTable
使用NPOI读取Excel数据到DataTable
现在XML文件的存储格式大行其道,但是也不是适用于所有情况,很多单位的数据交换还是使用Excel的形式。这就使得我们需要读取Excel内的数据,加载到程序中进行处理。但是怎样有效率的读取,怎样使程序保持健壮,这需要很大的努力。
我们如果要写一个动态链接库会很花费时间和精力,这就使得开源项目是个很有效率的选择。
在各类关于Excel的开源项目中NPOI是中国的程序员发起的,他的一大好处是直接处理Ole文件,用户不必安装Office。现在发展到2.0还可以自动判断Excel文件版本,我们自己判断文件后缀名的方式不是很准确(用户可能自己更改)。我觉得对于读取文件这个是很方便的一个功能!
不足之处:对于大文件的读取速度还是有些慢,做了下测试,加载20W数据,大约10+M的Excel文件大约需要16S,转化数据需要6S,这个稍微有些慢。读取文件流的地方还应该可以优化。
好了,废话少说,一下是我自己写的一个使用NPOI读取Excel数据的帮助类
using System; using System.Collections.Generic; using System.Data; using System.Globalization; using System.IO; using System.Linq; using System.Text; using System.Threading; using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; namespace Vevisoft.Excel.Core { /// <summary> /// 使用NOPI读取Excel数据 /// </summary> public class ExcelImportCore { private IWorkbook _workbook; private string _filePath; public List<string> SheetNames { get; set; } public ExcelImportCore() { SheetNames = new List<string>(); //LoadFile(_filePath); } #region Excel信息 /// <summary> /// 获取Excel信息 /// </summary> /// <param name="filePath"></param> public List<string> LoadFile(string filePath) { var prevCulture = Thread.CurrentThread.CurrentCulture; Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; var stopwatch = new System.Diagnostics.Stopwatch(); stopwatch.Start(); _filePath = filePath; SheetNames = new List<string>(); using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { _workbook = WorkbookFactory.Create(fs); } stopwatch.Stop(); Console.WriteLine("ReadFile:" + stopwatch.ElapsedMilliseconds/1000 + "s"); return GetSheetNames(); } /// <summary> /// 获取SHeet名称 /// </summary> /// <returns></returns> private List<string> GetSheetNames() { var count = _workbook.NumberOfSheets; for (int i = 0; i < count; i++) { SheetNames.Add(_workbook.GetSheetName(i)); } return SheetNames; } #endregion #region 获取数据源 /// <summary> /// 获取所有数据,所有sheet的数据转化为datatable。 /// </summary> /// <param name="isFirstRowCoumn">是否将第一行作为列标题</param> /// <returns></returns> public DataSet GetAllTables(bool isFirstRowCoumn) { var stopTime = new System.Diagnostics.Stopwatch(); stopTime.Start(); var ds = new DataSet(); foreach (var sheetName in SheetNames) { ds.Tables.Add(ExcelToDataTable(sheetName, isFirstRowCoumn)); } stopTime.Stop(); Console.WriteLine("GetData:" + stopTime.ElapsedMilliseconds/1000 + "S"); return ds; } /// <summary> /// 获取第<paramref name="idx"/>的sheet的数据 /// </summary> /// <param name="idx">Excel文件的第几个sheet表</param> /// <param name="isFirstRowCoumn">是否将第一行作为列标题</param> /// <returns></returns> public DataTable GetTable(int idx, bool isFirstRowCoumn) { if (idx >= SheetNames.Count || idx < 0) throw new Exception("Do not Get This Sheet"); return ExcelToDataTable(SheetNames[idx], isFirstRowCoumn); } /// <summary> /// 获取sheet名称为<paramref name="sheetName"/>的数据 /// </summary> /// <param name="sheetName">Sheet名称</param> /// <param name="isFirstRowColumn">是否将第一行作为列标题</param> /// <returns></returns> public DataTable GetTable(string sheetName, bool isFirstRowColumn) { return ExcelToDataTable(sheetName, isFirstRowColumn); } #endregion #region 方法 /// <summary> /// 将excel中的数据导入到DataTable中 /// </summary> /// <param name="sheetName">excel工作薄sheet的名称</param> /// <param name="isFirstRowColumn">第一行是否是DataTable的列名</param> /// <returns>返回的DataTable</returns> public DataTable ExcelToDataTable(string sheetName, bool isFirstRowColumn) { ISheet sheet = null; var data = http://www.mamicode.com/new DataTable();>调用的方法如下:private void toolStripButton1_Click(object sender, EventArgs e) { var importCore = new ExcelImportCore(); var opdiag=new OpenFileDialog(); tabControl1.TabPages.Clear(); if (opdiag.ShowDialog() == DialogResult.OK) { importCore.LoadFile(opdiag.FileName); var ds = importCore.GetAllTables(false); // for (int i = 0; i < importCore.SheetNames.Count; i++) { var tp=new TabPage {Text= Name = importCore.SheetNames[i]}; tabControl1.TabPages.Add(tp); //添加数据源 var dgv=new DataGridView { //AutoGenerateColumns = false, DataSource = ds.Tables[i], Dock = DockStyle.Fill }; tp.Controls.Add(dgv); } } }使用NPOI读取Excel数据到DataTable
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。