C#實戰017:Excel操作-計算單元格時出現的型別轉換問題解決
阿新 • • 發佈:2018-11-24
今天遇到個問題,在A表中提取值a,在B表提取值b,然後再將a、b的值計算到C表中,由於要牽涉到計算,所以要把獲取的資料進行型別轉換,這裡我們本來是想用 Convert.ToInt32進行強制轉換的,結果在運算的時候出現問題,迴圈一次之後就報錯了,而第一次獲取的資料卻又是對的。。。
將a註釋掉,b資料能全部獲取的到,但註釋掉b來獲取a資料時就出現了問題,同樣是迴圈資料並強制轉換,b能成功,a卻失敗了
Worksheet ws1 = ((Worksheet)wb.Worksheets["客戶排配計劃"]);//方法一:指定工作表名稱讀取 Worksheet ws2 = ((Worksheet)wb.Worksheets["刀具壽命"]);//方法一:指定工作表名稱讀取 Worksheet ws3 = ((Worksheet)wb.Worksheets["刀具預估數量"]);//方法一:指定工作表名稱讀取 //獲取工作表中的行數 int ws1RowsCount = ws1.UsedRange.Rows.Count; //獲取工作表中的列數 int ws1ColumnsCount = ws1.UsedRange.Columns.Count; int ws2RowsCount = ws2.UsedRange.Rows.Count; for (int i = 3; i < ws2RowsCount; i++) { for (int k = 3; k < ws1RowsCount; k++) { if ((ws3.Cells[i, 2]).Text == (ws1.Cells[k, 2]).Text) { for (int l = 1; l < ws1ColumnsCount - 1; l++) { int a = Convert.ToInt32((ws1.Cells[k, l + 2]).Text); int b = Convert.ToInt32((ws2.Cells[i, 7]).Text); ws3.Cells[i, l + 5] = a / b; } } } }
單獨獲取通過Console.WriteLine(ws1.Cells[k, l + 2]).Text)卻可以獲取到所有的資料,所以關鍵問題還是在型別轉換上出現了異常,嘗試用int.Parse(ws1.Cells[k, l + 2]).Tex)轉換也同樣出現異常。
int.Parse()也是是一種類容轉換:表示將數字內容的字串轉為int型別, 如果字串為空,則丟擲ArgumentNullException異常; 如果字串內容不是數字,則丟擲FormatException異常; 如果字串內容所表示數字超出int型別可表示的範圍,則丟擲OverflowException異常;
奇怪的是既然錯了,為什麼還能執行這麼多。。。,剛好是表2的一次迴圈,70多條資料都被讀取到了
那麼遇到這種問題該怎麼辦呢,大家可以嘗試下用這種方式去解決,int.TryParse 和 int.Parse很類似,但它不會產生異常,轉換成功返回 true,轉換失敗返回 false。
int a = 0; //定義一個變數
bool ws1value = int.TryParse((ws1.Cells[k, l + 2]).Text, out a);
int.TryParse((ws1.Cells[k, l + 2]).Text, out a),其中第一個引數代表被轉換的引數,第二個引數為轉換後的引數 int型別,成功返回True,失敗返回False,下面是迴圈程式碼:
for (int i = 3; i < ws2RowsCount; i++)
{
for (int k = 3; k < ws1RowsCount; k++)
{
if ((ws3.Cells[i, 2]).Text == (ws1.Cells[k, 2]).Text)
{
for (int l = 1; l < ws1ColumnsCount - 1; l++)
{
int a = 0;
bool ws1value = int.TryParse((ws1.Cells[k, l + 2]).Text, out a);
int b = 0;
bool ws2value = int.TryParse((ws2.Cells[i, 7]).Text, out b);
//int b = Convert.ToInt32((ws2.Cells[i, 7]).Text);
Console.WriteLine(a / b);
ws3.Cells[i, l + 5] = a / b;
}
}
}
}