iT邦幫忙

1

execl 跑 DataTable 一直顯示 : Object reference not set to an instance of an object

  • 分享至 

  • xImage

如題:將execl 匯入DataTable 表格欄位https://ithelp.ithome.com.tw/upload/images/20230324/20156443N3BzmPS8pC.png

無使用到的欄位瘋狂報錯,刪除該欄位後又顯示別的欄位錯誤
https://ithelp.ithome.com.tw/upload/images/20230324/20156443ploTOjuGT9.png

已從新新增一份execl用[值] 方式貼上也是如此

以下為程式碼

感謝各位大神

public static DataTable ImportExceltoDatatable(string strFilePath, int intSheetNumber)
        {

            // Open the Excel file using ClosedXML.
            // Keep in mind the Excel file cannot be open when trying to read it
            using (XLWorkbook workBook = new XLWorkbook(strFilePath))
            {
                //Read the first Sheet from Excel file.
                IXLWorksheet workSheet = workBook.Worksheet(intSheetNumber);

                //Create a new DataTable.
                DataTable dt = new DataTable();

                //Loop through the Worksheet rows.
                bool firstRow = true;
                foreach (IXLRow row in workSheet.Rows())
                {
                    //Use the first row to add columns to DataTable.
                    if (firstRow)
                    {
                        foreach (IXLCell cell in row.Cells())
                        {
                            dt.Columns.Add(cell.Value.ToString());
                        }
                        firstRow = false;
                    }
                    else
                    {
                        //Add rows to DataTable.
                        dt.Rows.Add();
                        int i = 0;

                        foreach (IXLCell cell in row.Cells(row.FirstCellUsed().Address.ColumnNumber, row.LastCellUsed().Address.ColumnNumber))
                        {
                            dt.Rows[dt.Rows.Count - 1][i] = cell.Value.ToString();
                            i++;
                        }
                    }
                }

                return dt;
            }





        }
菩薩慈悲:這種訊息就是誤把動態的物件當作靜態的類別來用了。記得用 new 建立該類別的執行個體(set to an instance of an object)(即物件Object )就是了。感恩感恩 南無阿彌陀佛
天黑 iT邦研究生 5 級 ‧ 2023-03-24 14:19:58 檢舉
幫你google 黑大有一篇 可以參考 https://blog.darkthread.net/blog/npoi-convert-xls-to-datatable/
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
孫守真任真甫
iT邦研究生 4 級 ‧ 2023-03-24 14:10:14

seamushahaaaaa菩薩慈悲:我看您好像只是要讀取 workSheet 工作表中已有(使用)的值,如果是這樣,那您可以將原方法內的程式碼以下,試試看:

public static DataTable ImportExceltoDatatable(string strFilePath, int intSheetNumber)
        {

            // Open the Excel file using ClosedXML.
            // Keep in mind the Excel file cannot be open when trying to read it
            using (XLWorkbook workBook = new XLWorkbook(strFilePath))
            {
                //Read the first Sheet from Excel file.
                IXLWorksheet workSheet = workBook.Worksheet(intSheetNumber);

                //Create a new DataTable.
                DataTable dt = new DataTable();

                //Loop through the Worksheet rows.
                bool firstRow = true;
                //!!!!!僅取用workSheet已有資料內容的部分!!!!!
                foreach (IXLRow row in workSheet.UsedRange.Rows())
                {
                    //Use the first row to add columns to DataTable.
                    if (firstRow)
                    {
                        foreach (IXLCell cell in row.Cells())
                        {
                            dt.Columns.Add(cell.Value.ToString());
                        }
                        firstRow = false;
                    }
                    else
                    {
                        //Add rows to DataTable.
                        dt.Rows.Add();
                        int i = 0;

                        foreach (IXLCell cell in row.Cells)
                        {
                            dt.Rows[dt.Rows.Count - 1][i] = cell.Value.ToString();
                            i++;
                        }
                    }
                }

                return dt;
            }
        }

seamushahaaaaa菩薩慈悲:

我看您的程式碼這裡的 row 應該是外面 Excel的 row ,那就要看您的 Excel 工作表 workSheet的 rows,有沒有大於一列了。
用監看檢查 workSheet.Rows 的 Count 的值是多少? 而 workSheet.Rows[1]的值是否有效!


public static DataTable

看到"static"就是不能用 new

DataTable dt = new DataTable();
這樣一看就知道錯了。new 是用在沒有static宣告的類別上喔。有興趣再深入討論。感恩感恩 南無阿彌陀佛

DataTable在這裡靜態(static)方法不是類別 (只是這方法與類別DataTable同名??) ;看來是我急了。應該是菩薩您用 row (row.Cells(……)) 這個物件時沒有 new= 給它一個有效物件。往錯誤發生的行向前找看看 row 是怎麼取得的…… 阿彌陀佛

看更多先前的回應...收起先前的回應...

阿彌陀佛

//Add rows to DataTable.
                        dt.Rows.Add();
                        int i = 0;

                        foreach (IXLCell cell in row.Cells(row.FirstCellUsed().Address.ColumnNumber, row.LastCellUsed().Address.ColumnNumber))
                        {
                            dt.Rows[dt.Rows.Count - 1][i] = cell.Value.ToString();
                            i++;
                        }
                        }

從這邊去找尋嗎?

seamushahaaaaa菩薩慈悲:是的。往前去看這個 row 是怎麼來的 有沒有給它設定一個有效的值(菩薩您可以在前面一點設置中斷點,再逐步或逐程序檢視看看,注意這裡的 row 是怎麼來的) 感恩感恩 南無阿彌陀佛

該先定義row為"" 嗎?

row 既是物件,不是字串,是不能定義為空字串("")的。
row = null;
才對。然而這樣的設定/指定的話,您就沒有給 row 值 就會出現上列的錯誤
得去找出 row 的類別是什麼 (可用 Ctrl + i 在 row 上快速查看 row 的類別,或 Shift + F2 或按滑鼠右鍵選查看定義的功能,看看 row的定義是什麼 也就知道它的類別是何屬了。) , 用 類別 row = new 類別(); 這樣的陳述才行。
但您要確定這樣 new 出來的 row.Cells(……)會能抓到東西、會有東西才行,但至少不會出現您上開碰到的錯誤訊息了,因為您已經將 row 設定檔為一個用 類別() 建構子建構出來的實例(執行個體)了。感恩感恩 南無阿彌陀佛

dt.Rows.Add();
        int i = 0;

        foreach (IXLCell cell in row.Cells(row.FirstCellUsed().Address.ColumnNumber, row.LastCellUsed().Address.ColumnNumber))
                        

這裡沒見您定義 row 是什麼啊 看看 Add方法回傳的是不是 row 類別,若是的話您要:

        // row 使用前宣告一下,它在這個 else 區塊內是和外面的 row 是不同的兩個東西(=物件=object)
       //類別 row =dt.Rows.Add();
       var 類別 row =dt.Rows.Add();
       int i = 0;   
       foreach (IXLCell cell in row.Cells(row.FirstCellUsed().Address.ColumnNumber, row.LastCellUsed().Address.ColumnNumber))

我看您的程式碼這裡的 row 應該是外面 Excel的 row ,那就要看您的 Excel 工作表 workSheet的 rows,有沒有大於一列了。
用監看檢查 workSheet.Rows 的 Count 的值是多少? 而 workSheet.Rows[1]的值是否有效!

剛才問Bing大菩薩也在Excel 瀏覽物件中尋找過了,並沒有 FirstCellUsedLastCellUsed 這兩個屬性啊,您是自定義的嗎?

seamushahaaaaa菩薩:看您要不要用 Google Meet 加入會議,分享螢幕我看看。我現在在線。感恩感恩 南無阿彌陀佛

seamushahaaaaa菩薩慈悲:我看您好像只是要讀取 workSheet 工作表中已有(使用)的值,如果是這樣,那您可以將原方法內的程式碼以下,試試看:
(詳回答處。方便統一程。此略。感恩感恩 南無阿彌陀佛)

我要發表回答

立即登入回答