NPOI 读取Excel文件

      private void buttonExcel_Click(object sender, EventArgs e)
        {
            FileStream fs = null;
            List<ISheet> lstISheet = new List<ISheet>();
            string Msg = "";
            string filePath = "";
            //初始化一个OpenFileDialog类
            OpenFileDialog fileDialog = new OpenFileDialog();
            //判断用户是否正确的选择了文件
            if (fileDialog.ShowDialog() == DialogResult.OK)
            {
                //获取用户选择文件的后缀名
                string extension = Path.GetExtension(fileDialog.FileName);
                //声明允许的后缀名
                string[] str = new string[] { ".xls", ".xlsx" };
                if (!((IList)str).Contains(extension))
                {
                    MessageBox.Show("仅能选择Excel文件");
                }
                else
                {
                    filePath = fileDialog.FileName;
                }
            }
            if(filePath!="")
            {
                IWorkbook book2003; IWorkbook book2007;
                bool bl2003 = true; bool bl2007 = true;
                fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite);
                try
                {
                     book2003 = new HSSFWorkbook(fs);// 2003版本
                     int t = 0;
                     while (true)
                     {
                         try
                         {
                             ISheet sheettemp = book2003.GetSheetAt(t);
                             lstISheet.Add(sheettemp);
                             t = t + 1;
                         }
                         catch (Exception ex)
                         {
                             break;
                         }
                     }
                }
                catch (Exception ex)
                {
                    bl2003 = false;
                    Msg = ex.Message.ToString() + "\r\n" + ex.StackTrace.ToString();
                    fs.Dispose();
                    fs.Close();
                }
                //
                if(bl2003==false)
                {
                    fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite);
                    try
                    {
                          book2007 = new XSSFWorkbook(fs);// 2007版本
                          int t = 0;
                          while (true)
                          {
                              try
                              {
                                  ISheet sheettemp = book2007.GetSheetAt(t);
                                  lstISheet.Add(sheettemp);
                                  t = t+1;
                              }
                              catch (Exception ex)
                              {
                                  break;
                              }
                          }
                    }
                    catch (Exception ex)
                    {
                        bl2007 = false;
                        Msg = ex.Message.ToString() + "\r\n" + ex.StackTrace.ToString();
                    }

                }
                ReLstDataTable(lstISheet);
                fs.Dispose();
                fs.Close();

            }
        }
        public List<DataTable> ReLstDataTable(List<ISheet> lstISheet)
        {
            List<DataTable> lstTable = new List<DataTable>();
            for (int t = 0; t < lstISheet.Count; t++)
            {
                ISheet sheet = lstISheet[t];
                int rowCount = sheet.LastRowNum;//总行数
                if (rowCount > 0)
                {
                    IRow firstRow = sheet.GetRow(0);//第一行
                    int cellCount = firstRow.LastCellNum;//列数
                    DataTable dt = new DataTable();
                    int startRow = 1;//如果第一行是列名,则从第二行开始读取
                    for (int i = firstRow.FirstCellNum; i < cellCount; ++i)
                    {
                        ICell cell = firstRow.GetCell(i);
                        if (cell != null)
                        {
                            if (cell.StringCellValue != null)
                            {
                                DataColumn column = new DataColumn(cell.StringCellValue);
                                dt.Columns.Add(column);
                            }
                        }
                    }
                    //------------------------------------------------
                    //填充行
                    for (int i = startRow; i <= rowCount; ++i)
                    {
                        IRow row = sheet.GetRow(i);
                        if (row == null) continue;

                        DataRow dataRow = dt.NewRow();
                        for (int j = row.FirstCellNum; j < cellCount; ++j)
                        {
                            ICell cell = row.GetCell(j);
                            if (cell == null)
                            {
                                dataRow[j] = "";
                            }
                            else
                            {
                                //CellType(Unknown = -1,Numeric = 0,String = 1,Formula = 2,Blank = 3,Boolean = 4,Error = 5,)
                                switch (cell.CellType)
                                {
                                    case CellType.Blank:
                                        dataRow[j] = "";
                                        break;
                                    case CellType.Numeric:
                                        short format = cell.CellStyle.DataFormat;
                                        //对时间格式(2015.12.5、2015/12/5、2015-12-5等)的处理
                                        if (format == 14 || format == 31 || format == 57 || format == 58)
                                            dataRow[j] = cell.DateCellValue;
                                        else
                                            dataRow[j] = cell.NumericCellValue;
                                        break;
                                    case CellType.String:
                                        dataRow[j] = cell.StringCellValue;
                                        break;
                                }
                            }
                        }
                        dt.Rows.Add(dataRow);
                    }
                    //------------------------------------------------
                    lstTable.Add(dt);
                }
            }
            return lstTable;
        }

原文地址:https://www.cnblogs.com/lanyubaicl/p/8447027.html

时间: 2024-10-30 04:15:23

NPOI 读取Excel文件的相关文章

NPOI读取excel文件导出数据, 而此时文件正在打开中抛异常怎么办

项目中需要用到一些数值表格, 方便起见都是用excel来的. 而如果excel正打开中, 直接使用npoi制作的工具来导出数据的话, 在这一行将会异常: workbook = new XSSFWorkbook(filepath); 其实只是读取的话, 并不需要获得它完整的使用权限, 那么用file.open然后再new workbook行不行? 也不行. 其实看那些excel其他软件的做法就很简单了, 首先执行一次copy string tmpFile = "~tooltmp.xlsx"

NPOI读取Excel文件

string strExtName = Path.GetExtension(strFilePath); if (strExtName.Equals(".xls") || strExtName.Equals(".xlsx")) { using (FileStream file = new FileStream(strFilePath, FileMode.Open, FileAccess.Read)) { ISheet sheet = null; if (strExtN

NPOI读取Excel,导入数据到Excel练习01

NPOI 2.2.0.0,初级读取导入Excel 1.读取Excel,将数据绑定到dgv上 1 private void button1_Click(object sender, EventArgs e) 2 { 3 List<Book> books = new List<Book>(); 4 //1.读取Excel文件 5 using (FileStream fsReder = File.OpenRead("练习.xlsx")) 6 { 7 //2.创建工作簿

NPOI操作excel——利用反射机制,NPOI读取excel数据准确映射到数据库字段

> 其实需求很明确,就是一大堆不一样的excel,每张excel对应数据库的一张表,我们需要提供用户上传excel,我们解析数据入库的功能实现. 那么,这就涉及到一个问题:我们可以读出excel的表头,但是怎么知道每个表头具体对应数据库里面的字段呢? 博主经过一段时间的思考与构思,想到一法:现在的情况是我们有excel表A,对应数据库表B,但是A与B具体属性字段的映射关系我们不知.那我们是不是可以有一个A到B的映射文件C呢? 我想,说到这,大家就很明了了... 第一步:为每张excel创建一个与

使用NPOI读取Excel数据到DataTable

现在XML文件的存储格式大行其道,但是也不是适用于所有情况,很多单位的数据交换还是使用Excel的形式.这就使得我们需要读取Excel内的数据,加载到程序中进行处理.但是怎样有效率的读取,怎样使程序保持健壮,这需要很大的努力. 我们如果要写一个动态链接库会很花费时间和精力,这就使得开源项目是个很有效率的选择. 在各类关于Excel的开源项目中NPOI是中国的程序员发起的,他的一大好处是直接处理Ole文件,用户不必安装Office.现在发展到2.0还可以自动判断Excel文件版本,我们自己判断文件

《.NET学习笔记》——使用NPOI读取Excel导入数据和导出Excel的功能

前提:由于有差不多两年时间没有进行B/S项目开发了,换了新工作,项目中要求有Excel导入数据库的功能,故保存下来供以后查看. 一.使用jQuery的uploadify插件完成选择文件并上传的功能: (1)先引入相关文件: <script src="../Scripts/uploadify/swfobject.js" type="text/javascript"></script> <link href="../Scripts

读取Excel文件的两种方法

第一种方法:传统方法,采用OleDB读取EXCEL文件, 优点:写法简单,缺点:服务器必须安有此组件才能用,不推荐使用 private DataSet GetConnect_DataSet2(string fileName) { DataSet myDataSet = new DataSet(); //创建一个数据链接 string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = " + fileName +

NPOI读取Excel到集合对象

之前做过的项目中有个需要读取Excel文件内容的需求,因此使用NPOI实现,写下以下代码,这个只是一个代码段,还有很多地方需要优化,希望能对大家有所帮助 public static IList<T> ReadListFromStream<T>(string fileName, Stream stream, bool ignoreFirstLine) where T : new() { string extendsion = Path.GetExtension(fileName).T

使用NPOI读取Excel数据并写入SQLite

首先,我们来建一个数据库,我们就叫Hello.db(不一定是db后缀,你可以sqlite,sqlite3,db3)都可以作为识别,然后往里面建一个空的表格,如下图所示 然后建一个Excel表格,往表格里面写入一些数据,我这里只是Demo形式,可以根据自己的实际情况,稍作修改 然后开始建一个新的项目,我这里用的是WPF,你可以使用Core,Console,Winform都可以,我这里提供思路,仅供参考 然后引用一下图中的dll程序集,主要是SQLite和NPOI,你可以到Nuget去下载,Nuge