1. 程式人生 > >C#實戰017:Excel操作-計算單元格時出現的型別轉換問題解決

C#實戰017:Excel操作-計算單元格時出現的型別轉換問題解決

     今天遇到個問題,在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;
            }
        }
    }
}