如題:將execl 匯入DataTable 表格欄位
無使用到的欄位瘋狂報錯,刪除該欄位後又顯示別的欄位錯誤
已從新新增一份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;
}
}
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 瀏覽物件中尋找過了,並沒有 FirstCellUsed、 LastCellUsed 這兩個屬性啊,您是自定義的嗎?
seamushahaaaaa菩薩:看您要不要用 Google Meet 加入會議,分享螢幕我看看。我現在在線。感恩感恩 南無阿彌陀佛
seamushahaaaaa菩薩慈悲:我看您好像只是要讀取 workSheet 工作表中已有(使用)的值,如果是這樣,那您可以將原方法內的程式碼以下,試試看:
(詳回答處。方便統一程。此略。感恩感恩 南無阿彌陀佛)