上回說到讀取Excel表格的時候,讀取到的第一個表在實際運行中并不是Sheet1這個表,可能是一個中文表名,也可能是Sheet1。所以首先可以改進這個地方,代碼如下:
DataTable sheetsName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,new object[]{null,null,null,"Table"}); //得到所有sheet的名字 string firstSheetName=null; for(int n=0;n<sheetsName.Rows.Count;n++) if(sheetsName.Rows[n][2].ToString()=="Sheet1$") firstSheetName = sheetsName.Rows[n][2].ToString(); //得到第一個sheet的名字我們可以用if來判斷找這個表名,這樣就可以節省部分時間和精力。在aspx頁面上,可以設置一個label標簽來顯示后臺處理過程中的提示信息。
后來出現了列數或者行數過多的情況,所以在處理數據的過程中,又對處理語句中進行了修改。根據上回的代碼,此次修改后的代碼如下所示:
int i, j; int region = 0; //獲取作物ID值 cropnumber = int.Parse(CropID.Text.ToString()); //獲得更新數據庫類型 if (mianji.Checked == true) //遇到播種面積時新增數據庫條目 { if (exceldt.Rows.Count == 40&&exceldt.Columns.Count==60) { for (i = 2; i < 40; i++) //省份 { if (i == 3 || i == 9 || i == 13 || i == 21 || i == 28 || i == 34) //跳過空白區域 continue; //讀取地域ID值 string PRoname = exceldt.Rows[i][0].ToString().Replace(" ", ""); string sqlstr = "select Region_ID from [DimRegion] where Province_Name='" + proname + "'"; DataTable dt = new DataTable(); dt = BaseClass1.ReadTable(sqlstr); region = int.Parse(dt.Rows[0][0].ToString()); float area = 0; for (j = 1; j < 60; j++) //時間 { if (exceldt.Rows[i][j].ToString() == "") area = 0; else area = float.Parse(exceldt.Rows[i][j].ToString()); string str = "insert into[FactCropProducts](Time_ID,Region_ID,Croptype_ID,Area) values(" + j + "," + region + "," + cropnumber + "," + area + ")"; BaseClass1.execsql(str); } } InfoExcel.Text = "播種面積信息添加成功!"; } else { InfoExcel.Text = "Excel表格列數或者行數錯誤!行數為:"+exceldt.Rows.Count+",列數為:"+exceldt.Columns.Count; } }此處可以首先對要處理的數據表進行列數與行數判斷。如果過多或者過少則不進行數據庫的添加或者修改,否則處理過程中發現問題則需要對數據庫再進行刪除操作,費時費力。【發現的問題】在實際操作過程中,讀取的表格數據可能會出現空白換行或者其他字符的形式。而這里需要的是一個浮點數,于是處理過程中會報異常情況。這個地方的處理還是比較不太好處理的。有些單元格的數據為“.”或者“0.4.”,所以現在還是需要一個思路去處理類似于這樣的異常數據。
新聞熱點
疑難解答