C# NPOI 讀取Excel數據,附案例源碼


項目結構

 

注意:需要引入NPOI類庫

C#代碼

Form1.cs

using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace NPOIDemo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private const int DEFAULT_CHECK_CELL_NUM = 4;
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                DataTable dt=ReadExcelData(@"C:\Users\apple\Desktop\Test.xls");
                MessageBox.Show("ok");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
           
        }
        /// <summary>
        /// 讀取Excel中數據
        /// </summary>
        /// <param name="filePath"></param>
        private DataTable ReadExcelData(object filePath)
        {
            try
            {
                if (!File.Exists(filePath.ToString()))
                {
                    throw new Exception("文件不存在!");
                }
                DataTable dtExcel = InitDataTable();
                FileStream fsRead = new FileStream(filePath.ToString(), FileMode.Open);
                //創建工作薄
                IWorkbook workBook = new HSSFWorkbook(fsRead);
                //獲取Sheet
                ISheet sheet = workBook.GetSheetAt(0);
                //獲取Excel中的行數
                int ExcelRowsCount = sheet.LastRowNum;
                Assert.IsTrue(ExcelRowsCount == 1, "未讀到Excel數據!");
                IRow currentRow;
                DataRow dr;
                for (int i = 1; i < ExcelRowsCount; i++)
                {
                    dr = dtExcel.NewRow();
                    //當前行數據
                    currentRow = sheet.GetRow(i);
                    SetCurrentRowValue(dtExcel, dr, currentRow, currentRow.LastCellNum);
                }
                return dtExcel;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        /// <summary>
        /// 初始化DataTable
        /// </summary>
        /// <returns></returns>
        private DataTable InitDataTable()
        {
            DataTable dt_excel = new DataTable();
            dt_excel.Columns.Add("A");
            dt_excel.Columns.Add("B");
            dt_excel.Columns.Add("C");
            dt_excel.Columns.Add("D");
            return dt_excel;
        }
        /// <summary>
        /// 讀取到的Excel的單元格數量
        /// </summary>
        /// <param name="currentCellNum"></param>
        private void CheckExcelCellNum(int readCurrentRowCellNum)
        {
            Assert.IsTrue(readCurrentRowCellNum > DEFAULT_CHECK_CELL_NUM, "Excel單元格列數超過:"+DEFAULT_CHECK_CELL_NUM+"");
        }
        /// <summary>
        /// 給DataTable動態賦值
        /// </summary>
        /// <param name="dr">DataTable當前行</param>
        /// <param name="currentRow">Excel當前行數據</param>
        /// <param name="currentCellNum">Excel的列數</param>
        private void SetCurrentRowValue(DataTable dtExcel, DataRow dr,IRow currentRow, int currentCellNum)
        {
            dr.BeginEdit();
            for (int j = 0; j < currentCellNum; j++)
            {
                if (j >= DEFAULT_CHECK_CELL_NUM) break;
                dr[j]= currentRow.GetCell(j).ToString().Trim();
            }
            dr.EndEdit();
            dtExcel.Rows.Add(dr);
        }
    }
}

Assert.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace NPOIDemo
{
    public static class Assert
    {
        public static void IsTrue(bool flag,string msg)
        {
            if (flag)
            {
                throw new Exception(msg);
            }
        }
    }
}

演示

  演示過程中,提示另外一個進程xxxx的,是因為NPOI讀取Excel的時候,Excel不可以打開,我們關閉,然后再次執行即可

項目下載

鏈接:https://pan.baidu.com/s/1YLer2fgV6QhJIQVsxqozJQ 
提取碼:30a9 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM