NPOI-讀取excel進DataTable

2023.03.31更新: 發現如果有空行,可能會被讀取到, 因而多做防呆, 修改如下:

        public static DataTable getexcel(String fileName)

        {

            DataTable dt = new DataTable();

            try

            {

                IWorkbook workbook = null; //新建IWorkbook對象 

                FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read);

                if (fileName.IndexOf(".xlsx") > 0) // 2007版本 

                {

                    workbook = new HSSFWorkbook(fileStream); //xlsx數據讀入workbook 

                }

                else if (fileName.IndexOf(".xls") > 0) // 2003版本 

                {

                    workbook = new HSSFWorkbook(fileStream); //xls數據讀入workbook 

                }

                ISheet sheet = workbook.GetSheetAt(0); //獲取第一個工作表 

                IRow row;// = sheet.GetRow(0); //新建當前工作表行數據 

                // MessageBox.Show(sheet.LastRowNum.ToString());

                row = sheet.GetRow(0); //row讀入頭部

                if (row != null)

                {

                    for (int m = 0; m < row.LastCellNum; m++) //表頭 

                    {

                        string cellValue = row.GetCell(m).ToString(); //獲取i行j列數據 

                        //Console.WriteLine(cellValue);

                        dt.Columns.Add(cellValue);

                    }

                }

                for (int i = 1; i <= sheet.LastRowNum; i++) //對工作表每一行 

                {

                    System.Data.DataRow dr = dt.NewRow();

                    row = sheet.GetRow(i); //row讀入第i行數據 

                    if (row != null)

                    {

                        if (row.LastCellNum > 0)  // 2023.03.28 有時空行好像會造成多了空白列,因而加此判斷

                        {

                            for (int j = 0; j < row.LastCellNum; j++) //對工作表每一列 

                            {

                                object currCell = row.GetCell(j);

                                if (currCell != null)

                                {

                                    string cellValue = currCell.ToString(); //獲取i行j列數據 

                                    //Console.WriteLine(cellValue);

                                    dr[j] = cellValue;

                                }

                            }

                            dt.Rows.Add(dr);

                        }

                    }

                }

                //Console.ReadLine();//這個有問題,讀不出來,反正它只是debug用的,所以取消它

                fileStream.Close();

                return dt;

            }

            finally

            { }

        }



---------------------------------------------------------------------------

為何要寫這個常用的功能? 因為昨天debug一個既有的讀取excel功能時, 發現當有些選填欄位如果不填,最後讀取出的資料是順序錯亂的。


後來找一陣子, 測試後發現用下面方式寫可以處理好: (ref. https://ithelp.ithome.com.tw/articles/10212249)

        /// <summary>

        /// 讀Excel.

        /// </summary>

        /// <param name="fileName"></param>

        /// <returns></returns>

        public static DataTable getexcel(String fileName)

        {

            DataTable dt = new DataTable();

            try

            {            

                IWorkbook workbook = null; //新建IWorkbook對象 

                FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read);

                if (fileName.IndexOf(".xlsx") > 0) // 2007版本 

                {

                    workbook = new XSSFWorkbook(fileStream); //xlsx數據讀入workbook 

                }

                else if (fileName.IndexOf(".xls") > 0) // 2003版本 

                {

                    workbook = new HSSFWorkbook(fileStream); //xls數據讀入workbook 

                }

                ISheet sheet = workbook.GetSheetAt(0); //獲取第一個工作表 

                IRow row;// = sheet.GetRow(0); //新建當前工作表行數據 

                // MessageBox.Show(sheet.LastRowNum.ToString());

                row = sheet.GetRow(0); //row讀入頭部

                if (row != null)

                {

                    for (int m = 0; m < row.LastCellNum; m++) //表頭 

                    {

                        string cellValue = row.GetCell(m).ToString(); //獲取i行j列數據 

                        //Console.WriteLine(cellValue);

                        dt.Columns.Add(cellValue);

                    }

                }

                for (int i = 1; i <= sheet.LastRowNum; i++) //對工作表每一行 

                {

                    System.Data.DataRow dr = dt.NewRow();

                    row = sheet.GetRow(i); //row讀入第i行數據 

                    if (row != null)

                    {

                        for (int j = 0; j < row.LastCellNum; j++) //對工作表每一列 

                        {

                            string cellValue = row.GetCell(j).ToString(); //獲取i行j列數據 

                            //Console.WriteLine(cellValue);

                            dr[j] = cellValue;

                        }

                    }

                    dt.Rows.Add(dr);

                }

                //Console.ReadLine();//這個有問題,讀不出來,反正它只是debug用的,所以取消它

                fileStream.Close();

                return dt;

            }

            catch(Exception ex)

            {

                throw ex;

            }

            return dt;

        }

留言

熱門文章