第一篇:告別ASPNET操作EXCEL的煩惱(總結(jié)篇)
Copy From 告別ASP.NET操作EXCEL的煩惱(總結(jié)篇)
公元19XX年前,關(guān)于EXCEL的操作就如滔滔江水,連綿不絕,真正操作EXCEL我也是從去年下半年開始的,有些比較復(fù)雜的年度報(bào)表之類的,做起來也有點(diǎn)費(fèi)力,不過還是都能畫出來了,關(guān)于EXCEL的報(bào)表導(dǎo)出,考慮到導(dǎo)出耗時(shí)的問題我主要采用AJAX來做的,分別捕捉幾個(gè)起止?fàn)顟B(tài),給客戶端提示3個(gè)狀態(tài):正在檢索數(shù)據(jù)。。---》準(zhǔn)備導(dǎo)出數(shù)據(jù)。。(只是從數(shù)據(jù)庫(kù)成功取出,還沒有讀寫excel文件)--》正在讀寫文件--》導(dǎo)出數(shù)據(jù)成功,當(dāng)然如果哪一過程出錯(cuò),都有對(duì)應(yīng)的提示,只所以想到寫這篇文章,主要是因?yàn)榻衲暧袀€(gè)系統(tǒng)的部分EXCEL的操作也讓我做,順便結(jié)合之前操作EXCEL的經(jīng)驗(yàn)作一下總結(jié),可能也算不上什么,對(duì)于絕大多數(shù)來說也沒什么技術(shù)含量,網(wǎng)上一搜一大把,但我想還是有必要總結(jié)一下,至少能給園子里的新手些許幫助,OK,Let's Go...一.程序操作EXCEL的應(yīng)用主要還是在統(tǒng)計(jì)報(bào)表方面,您可能會(huì)考慮讀EXCEL模板,也可能會(huì)考慮沒必要讀模板,其實(shí)讀不讀模板都能達(dá)到一樣的效果,看實(shí)際情況而用了。
1.讀模板的話,首先模板存放在某個(gè)路徑下,根據(jù)模板把從數(shù)據(jù)庫(kù)里取出的數(shù)據(jù)寫回EXCEL然后生成一個(gè)新的EXCEL存放都另一個(gè)路徑以供下載,模板不變。
我這里的EXCEL操作主要是在VS2005里的,VS2003也可以的,不過沒怎么研究03里的操作(文章最后我會(huì)把05,03的示例下載地址貼上)vs05中操作EXCEL直接引用.NET自帶的COM組件,添加后項(xiàng)目的bin目錄下會(huì)自動(dòng)出現(xiàn)
Interop.Excel.dll這個(gè)DLL(需安裝office2003 excel,下面的說明及示例都是基于office2003的,版本不同調(diào)用可能會(huì)不一樣)頁面的命名空間引用 using Excel;下面是調(diào)用模板的一段代碼
1#region 使用模板導(dǎo)出Excel表 2case“ReportByTemp”: 3 { 4
DataView dv = Cache[“ReportByTemp”] as DataView;6//建立一個(gè)Excel.Application的新進(jìn)程
Excel.Application app =new Excel.Application();8if(app ==null)9 { 10return;11 } 12 app.Visible =false;13 app.UserControl =true;14 Workbooks workbooks = app.Workbooks;15 _Workbook workbook = workbooks.Add(template_path +“EXCEL測(cè)試模板.xls”);//這里的Add方法里的參數(shù)就是模板的路徑 Sheets sheets = workbook.Worksheets;17 _Worksheet worksheet =(_Worksheet)sheets.get_Item(1);//模板只有一個(gè)sheet表 18if(worksheet ==null)19 { 20return;21 } 22
23int rowNum =0;24for(int i =0;i < span> dv.Count;i++)25 { 26 rowNum = i +1;27 worksheet.Cells[3+ i, 1] = rowNum;28 worksheet.Cells[3+ i, 2] = dv[i].Row[0].ToString();29 worksheet.Cells[3+ i, 3] = dv[i].Row[1].ToString();30
excelOperate.SetBold(worksheet, worksheet.Cells[3+ i, 1], worksheet.Cells[3+ i, 1]);//黑體
excelOperate.SetHAlignCenter(worksheet, worksheet.Cells[3+ i, 1], worksheet.Cells[3+ i, 3]);//居中
worksheet.get_Range(worksheet.Cells[3+ i, 1], worksheet.Cells[3+ i, 3]).Borders.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);34
} 36
tick = DateTime.Now.Ticks.ToString();38 save_path = temp_path +“"+ tick +”.xls“;39 workbook.SaveAs(save_path, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);40 excelOperate.Dispose(worksheet, workbook, app);//關(guān)閉Excel進(jìn)程 41
} 43break;44#endregion 效果如下:
2.不讀模板的話,調(diào)用的時(shí)候其實(shí)會(huì)繼承一個(gè)空白模板,然后寫入數(shù)據(jù),程序畫表頭,最終達(dá)到一樣的效果,程序如下:
1#region 不使用模板生成Excel表 2case”ReportByNone“: 3 { 4
DataView dv = Cache[”ReportByNone“] as DataView;6//建立一個(gè)Excel.Application的新進(jìn)程
Excel.Application app =new Excel.Application();8if(app ==null)9 { 10return;11 } 12 app.Visible =false;13 app.UserControl =true;14 Workbooks workbooks = app.Workbooks;15 _Workbook workbook = workbooks.Add(XlWBATemplate.xlWBATWorksheet);//這里的Add方法里的參數(shù)就相當(dāng)于繼承了一個(gè)空模板(暫這樣理解吧)16 Sheets sheets = workbook.Worksheets;17 _Worksheet worksheet =(_Worksheet)sheets.get_Item(1);18if(worksheet ==null)19 { 20return;21 } 22 worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[1, 3]).Merge(Missing.Value);//橫向合并 worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[1, 1]).Value2 =”EXCEL測(cè)試一“;25 excelOperate.SetBold(worksheet, worksheet.Cells[1, 1], worksheet.Cells[1, 1]);//黑體 26 excelOperate.SetHAlignCenter(worksheet, worksheet.Cells[1, 1], worksheet.Cells[1, 1]);//居中 excelOperate.SetBgColor(worksheet, worksheet.Cells[1, 1], worksheet.Cells[1, 1], System.Drawing.Color.Red);//背景色 excelOperate.SetFontSize(worksheet, worksheet.Cells[1, 1], worksheet.Cells[1, 1], 16);//字體大小 excelOperate.SetRowHeight(worksheet, worksheet.Cells[1, 1], worksheet.Cells[1, 1], 32.25);//行高 worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[1, 1]).Borders.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);//黑色連續(xù)邊框 31
worksheet.Cells[2, 1] =”序號(hào)“;33 worksheet.Cells[2, 2] =”公司“;34 worksheet.Cells[2, 3] =”部門“;35 excelOperate.SetBold(worksheet, worksheet.Cells[2, 1], worksheet.Cells[2, 3]);//黑體 36 worksheet.get_Range(worksheet.Cells[2, 1], worksheet.Cells[2, 3]).Borders.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);37 excelOperate.SetHAlignRight(worksheet, worksheet.Cells[2, 1], worksheet.Cells[2, 3]);38 excelOperate.SetBgColor(worksheet, worksheet.Cells[2, 1], worksheet.Cells[2, 3], System.Drawing.Color.Silver);//背景色 39int rowNum =0;40for(int i =0;i < span> dv.Count;i++)41 { 42 rowNum = i +1;43 worksheet.Cells[3+ i, 1] = rowNum;
導(dǎo)
出44 worksheet.Cells[3+ i, 2] = dv[i].Row[0].ToString();45 worksheet.Cells[3+ i, 3] = dv[i].Row[1].ToString();46
excelOperate.SetBold(worksheet, worksheet.Cells[3+ i, 1], worksheet.Cells[3+ i, 1]);//黑體
excelOperate.SetHAlignCenter(worksheet, worksheet.Cells[3+ i, 1], worksheet.Cells[3+ i, 3]);//居中
worksheet.get_Range(worksheet.Cells[3+ i, 1], worksheet.Cells[3+ i, 3]).Borders.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);//設(shè)置邊框顏色,不然打印預(yù)覽,會(huì)非常不雅觀 50
} 52 excelOperate.SetColumnWidth(worksheet, ”A“, 10);53 excelOperate.SetColumnWidth(worksheet, ”B“, 20);54 excelOperate.SetColumnWidth(worksheet, ”C“, 20);55 worksheet.Name =”導(dǎo)出EXCEL測(cè)試一“;56
tick = DateTime.Now.Ticks.ToString();58 save_path = temp_path +”“+ tick +”.xls“;59 workbook.SaveAs(save_path, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);60 excelOperate.Dispose(worksheet, workbook, app);//關(guān)閉Excel進(jìn)程 61
} 63break;64
65#endregion 效果如下:
以上我給了兩個(gè)最簡(jiǎn)單的操作說明,下面詳細(xì)說一下對(duì)于一些稍微復(fù)雜的報(bào)表的生成處理
二.對(duì)于復(fù)雜的EXCEL報(bào)表的生成處理,無非是縱向合并相同的數(shù)據(jù)行及嵌套縱向合并等一些操作,下面就幾個(gè)具有針對(duì)性的報(bào)表作下說明.1.要生成相對(duì)復(fù)雜的EXCEL表,在從數(shù)據(jù)庫(kù)取數(shù)據(jù)時(shí),要注意先按照合理的要求排好序,有時(shí)候可能order by后面要跟好幾個(gè)字段,而且這幾個(gè)字段誰先誰后也要注意,因?yàn)檫@些會(huì)直接影響報(bào)表呈現(xiàn)的效果,比如你的EXCEL表要按月份統(tǒng)計(jì)國(guó)內(nèi)外的項(xiàng)目,顯示出來的時(shí)候要多個(gè)項(xiàng)目相同的人連續(xù),那么排序就可能要這樣order by 月份,項(xiàng)目類別,用戶ID,項(xiàng)目ID(這是寫好的視圖,基于視圖來檢索的),這個(gè)排序的字段順序就不能變了,變了的話就不太好生成想要的形式了,如下圖: 這個(gè)也是動(dòng)態(tài)畫的,用了個(gè)簡(jiǎn)單的模板,模板就一個(gè)表頭,沒多大意義,除非表頭很復(fù)雜而且在列表中不需要重畫,考慮模板就比較好,向上面那個(gè)一月份國(guó)際的和其它月份的都是需要重畫表頭的。至于合并,如果不是嵌套的合并,我們可以在向模板循環(huán)寫數(shù)據(jù)的時(shí)候直接控制,比如下面一個(gè)簡(jiǎn)單的寫法:
1for(i =0;i < span> table.Rows.Count;i++)2 { 3 bidName = table.Rows[index][”BIDNAME“].ToString();4if(table.Rows[i][”BIDNAME“].ToString()== bidName)5 { 6 projNum++;7 worksheet.Cells[5+ i, 2] = table.Rows[i][”PROJNO“];8 worksheet.Cells[5+ i, 3] = table.Rows[i][”PROJNAME“];9 worksheet.Cells[5+ i, 4] = table.Rows[i][”STAT_DATE“];10 worksheet.Cells[5+ i, 5] = table.Rows[i][”PROJTYPE“];11 worksheet.Cells[5+ i, 6] = table.Rows[i][”CONTENT“];12 worksheet.Cells[5+ i, 7] = table.Rows[i][”O(jiān)PENDT“];13 worksheet.Cells[5+ i, 8] = table.Rows[i][”O(jiān)PENADDRESS“];14 worksheet.Cells[5+ i, 9] = table.Rows[i][”REV_DATE“];15 worksheet.Cells[5+ i, 10] = table.Rows[i][”BID_UNIT“];16 worksheet.Cells[5+ i, 11] = table.Rows[i][”AGT_AMOUNT“];17 worksheet.Cells[5+ i, 12] = table.Rows[i][”CURRENCY“] +”:“+ table.Rows[i][”BIDSER_AMOUNT“];18 worksheet.Cells[5+ i, 13] = table.Rows[i][”SENDDATE“];19 worksheet.Cells[5+ i, 14] = table.Rows[i][”CURRENCY“] +”:“+ table.Rows[i][”BIDPRICE“];20 worksheet.Cells[5+ i, 15] = table.Rows[i][”BOOKAMOUNT“];21 worksheet.Cells[5+ i, 16] = table.Rows[i][”CURRENCY“] +”:“+ table.Rows[i][”BAIL_AMOUNT“];22 worksheet.Cells[5+ i, 17] = table.Rows[i][”USERNAME“];23 worksheet.Cells[5+ i, 18] = table.Rows[i][”SECOND_USER“];24 worksheet.Cells[5+ i, 19] =”“;25 worksheet.get_Range(worksheet.Cells[5+ i, 1], worksheet.Cells[5+ i, 19]).Borders.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);26continue;27 } 28 worksheet.get_Range(worksheet.Cells[5+ rowid, 1], worksheet.Cells[5+ i-1, 1]).Merge(Missing.Value);//將第一列按投標(biāo)單位合并 worksheet.get_Range(worksheet.Cells[5+ rowid, 1], worksheet.Cells[5+ rowid, 1]).Value2 = bidName +”(“+ projNum.ToString()+”個(gè)項(xiàng)目)“;//合并后的單元格內(nèi)容
合并單元格的時(shí)候也要注意一個(gè)問題,就是合并的單元格必須是為空的,不然在執(zhí)行合并時(shí),會(huì)提示“合并后的單元格的值將丟失”,具體不這樣提示的,大致是這個(gè)意思,一般我們合并都單元格相同的內(nèi)容,在合并前我們先保存那個(gè)值,再清空后合并,上面的代碼中把worksheet.Cell[5+rowid,1]這里系列的單元格的值空出來了,沒寫數(shù)據(jù),而且最后合并了再寫值,避免了去循環(huán)清空。
2.嵌套的合并向上面那樣做可能控制比較麻煩,而且思路可能很混亂,我們可以考慮先循環(huán)填充所有的數(shù)據(jù),在循環(huán)出來要合并的列,比如像下面的這張表 先循環(huán)填充數(shù)據(jù),如下:
1int index =0, rownum =0;2string ProjNo =”“;3for(i =0;i < span> table.Rows.Count;i++)4 { 5 ProjNo = table.Rows[index][”PROJNO“].ToString();6if(table.Rows[i][”PROJNO“].ToString()== ProjNo)7 { 8 wksheet.Cells[3+ i, 1] = rownum +1;9 wksheet.Cells[3+ i, 2] =”'“+ table.Rows[i][”PROJNO“];//加上單引號(hào)保證以0開頭的字符原樣輸出 10 wksheet.Cells[3+ i, 3] =”'“+ table.Rows[i][”PROJNAME“];11 wksheet.Cells[3+ i, 4] =”'“+ table.Rows[i][”PA_NAME“];12 wksheet.Cells[3+ i, 5] =”'“+ table.Rows[i][”BIDER_NAME“];13 wksheet.Cells[3+ i, 6] = table.Rows[i][”BAIL_AMOUNT“];14 wksheet.Cells[3+ i, 7] = table.Rows[i][”NOT_BACK“];15 wksheet.get_Range(wksheet.Cells[3+ i, 1], wksheet.Cells[3+ i, 7]).Borders.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);16continue;17 } 18 index = i;20 rownum++;21 i--;22 } 下面合并前三列相同內(nèi)容的單元:
1//合并前三列操作 2int m =1, rowid =3, k;3string projName =”“;4for(k =3;k < span> i +2;k++)5 { 6if(Convert.ToInt32(wksheet.get_Range(wksheet.Cells[k, 1], wksheet.Cells[k, 1]).Value2)== m)7 { 8 ProjNo = wksheet.get_Range(wksheet.Cells[k, 2], wksheet.Cells[k, 2]).Value2.ToString();9 projName = wksheet.get_Range(wksheet.Cells[k, 3], wksheet.Cells[k, 3]).Value2.ToString();10 wksheet.get_Range(wksheet.Cells[k, 1], wksheet.Cells[k, 1]).Value2 =”“;11 wksheet.get_Range(wksheet.Cells[k, 2], wksheet.Cells[k, 2]).Value2 =”“;12 wksheet.get_Range(wksheet.Cells[k, 3], wksheet.Cells[k, 3]).Value2 =”“;13continue;14 } 15 wksheet.get_Range(wksheet.Cells[rowid, 1], wksheet.Cells[k-1, 1]).Merge(Missing.Value);16 wksheet.get_Range(wksheet.Cells[rowid, 1], wksheet.Cells[rowid, 1]).Value2 = m;17 wksheet.get_Range(wksheet.Cells[rowid, 2], wksheet.Cells[k-1, 2]).Merge(Missing.Value);19 wksheet.get_Range(wksheet.Cells[rowid, 2], wksheet.Cells[rowid, 2]).Value2 =”'“+ ProjNo;20 wksheet.get_Range(wksheet.Cells[rowid, 3], wksheet.Cells[k-1, 3]).Merge(Missing.Value);22 wksheet.get_Range(wksheet.Cells[rowid, 3], wksheet.Cells[rowid, 3]).Value2 =”'“+ projName;23 m++;25 rowid = k;26 k--;27 } 28//跳出循環(huán)后合并最后一個(gè)招標(biāo)項(xiàng)目 29 wksheet.get_Range(wksheet.Cells[rowid, 1], wksheet.Cells[k-1, 1]).Merge(Missing.Value);31 wksheet.get_Range(wksheet.Cells[rowid, 1], wksheet.Cells[rowid, 1]).Value2 = m;32
wksheet.get_Range(wksheet.Cells[rowid, 2], wksheet.Cells[k-1, 2]).Merge(Missing.Value);34 wksheet.get_Range(wksheet.Cells[rowid, 2], wksheet.Cells[rowid, 2]).Value2 =”'“+ ProjNo;35
wksheet.get_Range(wksheet.Cells[rowid, 3], wksheet.Cells[k-1, 3]).Merge(Missing.Value);37 wksheet.get_Range(wksheet.Cells[rowid, 3], wksheet.Cells[rowid, 3]).Value2 =”'“+ projName;下面合并標(biāo)段列
1//合并標(biāo)段列 2
index =0;rowid =3;//重置變量 4string pa_name =string.Empty;//標(biāo)段名稱 5for(k =3;k < span> i +2;k++)6 { 7 pa_name = table.Rows[index][”PA_NAME“].ToString();8if(wksheet.get_Range(wksheet.Cells[k, 4], wksheet.Cells[k, 4]).Value2.ToString()== pa_name)9 { 10 wksheet.get_Range(wksheet.Cells[k, 4], wksheet.Cells[k, 4]).Value2 =”“;11continue;12 } 13 wksheet.get_Range(wksheet.Cells[rowid, 4], wksheet.Cells[k-1, 4]).Merge(Missing.Value);14 wksheet.get_Range(wksheet.Cells[rowid, 4], wksheet.Cells[rowid, 4]).Value2 =”'“+ pa_name;15 index = k-3;16 rowid = k;17 k--;18 19 } 20//退出循環(huán)時(shí)合并最后一個(gè)項(xiàng)目的標(biāo)段 wksheet.get_Range(wksheet.Cells[rowid, 4], wksheet.Cells[k-1, 4]).Merge(Missing.Value);22 wksheet.get_Range(wksheet.Cells[rowid, 4], wksheet.Cells[rowid, 4]).Value2 =”'“+ pa_name;23 tick = DateTime.Now.ToString(”yyyyMMddhhmmss“);24 save_path = temp_path +”“+ tick +”保證金收退情況表.xls“;25 Session[”BailBackID“] = tick +”保證金收退情況表.xls“;26 Session[”_BailBack“] =”true“;27 workbook.SaveAs(save_path, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);28 excelOperate.Dispose(worksheet, workbook, app);//關(guān)閉Excel進(jìn)程 29//DownLoad(save_path);30//Page_Close();
當(dāng)然,上面的操作中會(huì)進(jìn)行好幾次循環(huán),在性能方面不太可取,園子里的兄弟也許會(huì)有更好的方法,小弟不吝賜教了
下面我們看下幾個(gè)效果圖:
(注意:這里提示的導(dǎo)出數(shù)據(jù)是指從數(shù)據(jù)庫(kù)成功取出數(shù)據(jù),還沒有操作EXCEL對(duì)象,剛開始已經(jīng)說過了,當(dāng)然這個(gè)提示文字換成其它的也可以)
整個(gè)過程采用AJAX提示的,一來不刷新,二來導(dǎo)出時(shí)間比較長(zhǎng)的話,可以給客戶一個(gè)良好的體驗(yàn)效果,否可,用戶一點(diǎn)導(dǎo)出按鈕,半天沒反應(yīng)也沒提示,客戶就覺得怎么這么慢的,是不是你們程序有問題,指責(zé)一大堆,有了這么些交互提示信息,讓客戶多等幾分鐘也能承受。
3.生成的表格包含多個(gè)sheet的操作,比如下面一種情況
繪制這張表的要求是根據(jù)選擇某年的幾月到幾月,生成這個(gè)幾個(gè)月的一個(gè)綜合情況的sheet,然后分別生成這幾個(gè)月的單獨(dú)的sheet表,生成上面表的模板,包含兩個(gè)sheet,一個(gè)綜合月份的sheet和一個(gè)單獨(dú)月份的sheet,因?yàn)閱为?dú)月份的sheet表現(xiàn)形式都是一樣的,我們可以根據(jù)選擇的月份個(gè)數(shù)Copy幾個(gè)sheet就可以了
Workbooks workbooks = app.Workbooks;2
_Workbook workbook = workbooks.Add(template_path +”招標(biāo)單位年度招標(biāo)情況逐月統(tǒng)計(jì)表.xls“);4 Sheets sheets = workbook.Worksheets;5 _Worksheet Yearsheet =(_Worksheet)sheets.get_Item(1);6 _Worksheet worksheet =(_Worksheet)sheets.get_Item(2);7if(worksheet ==null)8 { 9return;10 } 11for(int i =1;i < span> monthCount;i++)12 worksheet.Copy(Missing.Value, workbook.Worksheets[2]);//月統(tǒng)計(jì)工作薄
Yearsheet的操作就不說了,和前面幾個(gè)一樣操作,關(guān)鍵是月份的sheet的生成,其實(shí)就是循環(huán)操作get_Item(i),代碼如下
1//////////////////////////////////////每月詳細(xì)統(tǒng)計(jì)//////////////////////////////////// 2
3int item_id =2;4 rowNum =0;book_Amount =0;index =0;5 bid_Amount =”“;bidser_Amount =”“;agent_Amount =0;//清空變量 6 _Worksheet ws =null;7for(int i =0;i < span> tableMM.Rows.Count;i++)8 { 9 rowNum++;10 Month = tableMM.Rows[index][”DATE_MONTH“].ToString();11if(tableMM.Rows[i][”DATE_MONTH“].ToString()== Month)12 { 13 ws =(_Worksheet)sheets.get_Item(item_id);14 ws.Cells[3+ rowNum-1, 1] = rowNum;15 ws.Cells[3+ rowNum-1, 2] = tableMM.Rows[i][”PROJNO“];16 ws.Cells[3+ rowNum-1, 3] = tableMM.Rows[i][”PROJNAME“];17 ws.Cells[3+ rowNum-1, 4] = tableMM.Rows[i][”BID_TYPE“];18 ws.Cells[3+ rowNum-1, 5] = tableMM.Rows[i][”BID_MODE“];19 ws.Cells[3+ rowNum-1, 6] = tableMM.Rows[i][”O(jiān)PENDT“];20 ws.Cells[3+ rowNum-1, 7] = tableMM.Rows[i][”O(jiān)PENADDRESS“];21 ws.Cells[3+ rowNum-1, 8] = tableMM.Rows[i][”BID_UNIT“];22 ws.Cells[3+ rowNum-1, 9] = tableMM.Rows[i][”NOTICE_NO“].ToString().Replace(”神華國(guó)貿(mào)“, ”“);23 ws.Cells[3+ rowNum-1, 10] = tableMM.Rows[i][”BOOKAMOUNT“];24 ws.Cells[3+ rowNum-1, 11] = tableMM.Rows[i][”BIDPRICE“] +”(“+ tableMM.Rows[i][”CURRENCY“] +”)“;25 ws.Cells[3+ rowNum-1, 12] = tableMM.Rows[i][”BIDSER_AMOUNT“] +”(“+ tableMM.Rows[i][”CURRENCY“]+”)“;26 ws.Cells[3+ rowNum-1, 13] = tableMM.Rows[i][”AGT_AMOUNT“];27 ws.Cells[3+ rowNum-1, 14] =”“;28 ws.get_Range(ws.Cells[3+ rowNum-1, 1], ws.Cells[3+ rowNum-1, 14]).Borders.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);29continue;30 } 31
萬萬32 ws.Cells[1, 1] = year +”年“+ bidName + GetMonth(Month)+”月份招標(biāo)項(xiàng)目情況一覽表“;33
34//每月合計(jì)
sql =” SELECT CURRENCY, NVL(SUM(BIDPRICE),0)AS BIDPRICE,NVL(SUM(BOOKAMOUNT),0)AS BOOKAMOUNT,NVL(SUM(BIDSER_AMOUNT),0)AS BIDSER_AMOUNT,NVL(SUM(AGT_AMOUNT),0)AS AGT_AMOUNT FROM IBS_V_BID_MONTHLY_STAT“+ SqlFilter + 36” AND DATE_YEAR ='“+ year +”' AND COMPANY_ID=“+ biderID +” AND DATE_MONTH ='“+ Month +”'“+ 37” GROUP BY CURRENCY“;38 System.Data.DataTable dt1 = OracleHelper.RetDataTable(sql);39for(int m =0;m < span> dt1.Rows.Count;m++)40 { 41 bid_Amount += dt1.Rows[m][”BIDPRICE“] +”(“+dt1.Rows[m][”CURRENCY“] +”)rt“;42 book_Amount +=float.Parse(dt1.Rows[m][”BOOKAMOUNT“].ToString());43 bidser_Amount += dt1.Rows[m][”BIDSER_AMOUNT“] +”(“+ dt1.Rows[m][”CURRENCY“] +”)rt“;44 agent_Amount +=float.Parse(dt1.Rows[m][”AGT_AMOUNT“].ToString());45 } 46
ws.Cells[3+ rowNum-1, 3] =”合 計(jì)“;48 ws.Cells[3+ rowNum-1, 10] = book_Amount;49 ws.Cells[3+ rowNum-1, 11] = bid_Amount;50 ws.Cells[3+ rowNum-1, 12] = bidser_Amount;51 ws.Cells[3+ rowNum-1, 13] = agent_Amount;52 ws.get_Range(ws.Cells[3+ rowNum-1, 1], ws.Cells[3+ rowNum-1, 14]).Borders.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);53 ws.Name = GetMM(Month);54
item_id++;56 index = i;//匯總下一個(gè)月份的招標(biāo)項(xiàng)目 57 i--;58 rowNum =0;book_Amount =0;59 bid_Amount =”“;bidser_Amount =”“;agent_Amount =0;//清空變量 60 } 61
62//跳出循環(huán)時(shí)進(jìn)行最后一個(gè)月份的項(xiàng)目匯總
用的是oracle數(shù)據(jù)庫(kù),所以上面那個(gè)sql語句。。呵呵
上面大致說得就差不多了,因?yàn)槭遣粩嘌h(huán)的什么的,可能對(duì)于大的數(shù)據(jù)量讀寫來說,比較好性能,如果大家有什么更好的方法,可以指點(diǎn)下,為了彌補(bǔ)等待時(shí)間過長(zhǎng),所以才結(jié)合了AJAX來處理。
萬萬
最后我把做的一個(gè)小demo的鏈接帖出來給大家,還有一些空模板和對(duì)應(yīng)生成的數(shù)據(jù)表給大家對(duì)照看下,尤其相對(duì)復(fù)雜一些的表畫應(yīng)該是能畫出來的,主要看大家采用什么樣的方法,能少循環(huán)一次就盡量少循環(huán),呵呵~~~ http:// = ” 8 } 9else
10if(resp.value ==“NO”)11 { 12 $('tipMsg').innerHTML = “沒有找到符合該查詢條件的數(shù)據(jù)”;13 $('btnExcel').disabled = false;14 } 15else 16 { 17 $('tipMsg').innerHTML = “警告:導(dǎo)出數(shù)據(jù)出錯(cuò)”;18 $('btnExcel').disabled = false;19 } 20 21 22 } 1function RedirectUrl()2 { 3 $('tipMsg').innerHTML = “portCallback);5function ReportCallback(resp)6 { 7if(resp.value!=”Error“&& resp.value!=”“)8 {
正在讀寫報(bào)表文件,請(qǐng)稍后
”;
準(zhǔn)備導(dǎo)出數(shù)據(jù),請(qǐng)稍等
“;7 setTimeout(”RedirectUrl()“,1000);//延時(shí)體驗(yàn)
var ajax =new ajax_request(”ExcelReport.aspx?flag=ReportByTemp&“+Math.random(), ”“, ”“, Re 9 $('btnExcel').disabled = false;10 $('tipMsg').innerHTML = ”數(shù)據(jù)導(dǎo)出成功!“;11 Open(”XLS_DownLoad.aspx?path=“+resp.value);//window.location.href = resp.value;// 12 } 13else 14 { 15 $('btnExcel').disabled = false;16 $('tipMsg').innerHTML = ”文件讀寫出錯(cuò),請(qǐng)檢查文件模板是否存在或?qū)ξ募欠裼凶x寫權(quán)限!";17 } 18 } 19 20 } 21
22function Open(url)23{ 24 window.open(url,'newwindow','height=1,width=1,top=1500,left=1500,toolbar=no,menubar=no,scrollbars=yes,location=no,status=no')25} ExcelReportCallback(resp)原本是一個(gè)回調(diào)函數(shù),但是里面調(diào)用了一個(gè)RedirectUrl()方法,這個(gè)方法又包含了一個(gè)回調(diào)函數(shù),這樣就形成了回調(diào)的嵌套,之所以這么做,是因?yàn)?,第一個(gè)回調(diào)是處理從數(shù)據(jù)庫(kù)取出數(shù)據(jù)成功與否,如果成功了跳轉(zhuǎn)到畫EXCEL的頁面,這樣的話會(huì)出現(xiàn)一個(gè)空白頁等生成好后出現(xiàn)下載框,后來覺得是否可以嵌套一個(gè)回調(diào)來繼續(xù)一次異步操作,這樣就不會(huì)出現(xiàn)長(zhǎng)時(shí)間等待的空白頁面了,而是生成好EXCEL后返回地址,或者可以返回一個(gè)文件名到XLS_DownLoad.aspx頁面直接下載,但是XLS_DownLoad.aspx也是要出現(xiàn)的,我嘗試過讓下載后這個(gè)頁面自動(dòng)關(guān)閉,無賴做不到,所以把Open()方法里的數(shù)據(jù)值調(diào)得讓頁面不顯示,但是狀態(tài)欄還是有顯示的。
到這里算是寫完了,決定奢侈下,放到首頁下:),總覺得首頁的文章只有高手才能放,而且放到首頁也是一種奢侈,希望對(duì)園子里的某些人有一定的幫助吧~~
第二篇:aspnet總結(jié)
學(xué)習(xí)ASP.NET,我是從VFP、ASP轉(zhuǎn)型而來的。
我學(xué)習(xí)的ASP.NET,走的是asp.net(c#)+Sql2005這條路。
之前學(xué)習(xí)VFP時(shí),就對(duì)數(shù)據(jù)庫(kù)是了深刻的了解,對(duì)CS結(jié)構(gòu)的項(xiàng)目有了大概的認(rèn)識(shí)與體驗(yàn)。如今學(xué)習(xí)ASP.NET,速度要比他人快得多,至少更容易上手。
關(guān)于這方面的學(xué)習(xí),我的重點(diǎn)放在BS結(jié)構(gòu)的網(wǎng)站項(xiàng)目上,我不太喜歡CS結(jié)構(gòu)的程序;因?yàn)槲矣X得,CS結(jié)構(gòu)的程序,要想讓別人看到,除非別人知道并擁有您的軟件,或者購(gòu)買您的CS程序,否則,沒有人會(huì)知道您的程序的。
但是,BS結(jié)構(gòu)的網(wǎng)站程序,就不同了,您可以將您的網(wǎng)站發(fā)布到互聯(lián)網(wǎng)上,這樣,就可以讓很多的陌生的不知名的可遇不可求的網(wǎng)友來訪問您的網(wǎng)站,從而,他們就會(huì)知道您的網(wǎng)站程序,這更能充分體現(xiàn)出一個(gè)程序的價(jià)值所在。
這兩者的區(qū)別就在于,CS結(jié)構(gòu)的程序,必須安裝到任何一個(gè)客戶端才能使用;而BS結(jié)構(gòu)的程序,只需要配置好服務(wù)器,連網(wǎng)的計(jì)算機(jī),在隨時(shí)隨地都能打開您的網(wǎng)站;這不僅省去了安裝的麻煩,同時(shí)更有效的解決了時(shí)間和空間的限制、打破資源的局限性,讓網(wǎng)站程序的價(jià)值得以充分體現(xiàn)出來。
之前我學(xué)習(xí)ASP,是通過dw學(xué)習(xí)的,當(dāng)時(shí),就覺得非常麻煩,尤其是html標(biāo)簽文件與ASP代碼,是同放在一個(gè)文件里面的,這就產(chǎn)生了大量的冗余的代碼,修改的時(shí)候覺得非常麻煩,即不容易維護(hù)、更不容易修改。看上去,眼睛都花了。
還好,轉(zhuǎn)向ASP.NET的學(xué)習(xí),正符合自己的個(gè)性思維,在學(xué)習(xí)的過程中,如魚得水,僅需要學(xué)習(xí)一下基本的操作和語法,其它基本沒有障礙。
學(xué)習(xí)了ASP.NET的代碼分離模式與無刷新技術(shù),認(rèn)識(shí)到了網(wǎng)站的真正的結(jié)構(gòu),最終才對(duì)BS結(jié)構(gòu)的網(wǎng)站程序有了進(jìn)一步的認(rèn)識(shí)。
同時(shí),對(duì)SQL大型數(shù)據(jù)庫(kù)的認(rèn)識(shí)才有了質(zhì)的改變。
第三篇:aspnet軟件開發(fā)學(xué)習(xí)總結(jié)
asp.net學(xué)習(xí)經(jīng)驗(yàn)總結(jié)
通過幾個(gè)月的學(xué)習(xí),我初步掌握ASP.NET開發(fā)平臺(tái)的基本知識(shí),也通過老師的教學(xué),完成了實(shí)際項(xiàng)目中的應(yīng)用。由于大學(xué)學(xué)習(xí)中打下了較為扎實(shí)的C#基礎(chǔ),所以在選擇開發(fā)平臺(tái)學(xué)習(xí)時(shí)選擇了ASP.NET開發(fā)平臺(tái)。ASP.NET是基于網(wǎng)絡(luò)的交互開發(fā)平臺(tái),可以通過微軟的C#語言以及Visual Studio 2010開發(fā)環(huán)境進(jìn)行開發(fā)。
在學(xué)習(xí)ASP.NET之前,對(duì)網(wǎng)絡(luò)交互的開發(fā)平臺(tái)是非常陌生的。并不知道如何才能實(shí)現(xiàn)網(wǎng)站的開發(fā)和實(shí)現(xiàn)。通過ASP.NET的學(xué)習(xí),我成功的使用WEB2.0和MVC2.0兩種架構(gòu)模式分別開發(fā)了資訊類網(wǎng)站和商務(wù)類網(wǎng)站。下面我將對(duì)開發(fā)過程的學(xué)習(xí)進(jìn)行總結(jié)。
首先是資訊類網(wǎng)站的開發(fā),選擇使用了方便入手的web2.0架構(gòu)平臺(tái)。Web2.0以邏輯上的表示層、數(shù)據(jù)訪問層、業(yè)務(wù)邏輯層。通過三層架構(gòu)間函數(shù)的調(diào)用,可以增加系統(tǒng)的安全性,也可以提高代碼的可讀性。通過對(duì)資訊類網(wǎng)站的開發(fā)我逐漸熟悉了ASP.NET的開發(fā)過程以及交互模式,通過與ADO.NET的配合使用,完成了與數(shù)據(jù)庫(kù)的交互工作。半個(gè)月的時(shí)間初步完成了資訊類新聞網(wǎng)的開發(fā)工作,實(shí)現(xiàn)了用戶注冊(cè)、登錄,分欄目顯示圖文新聞信息,點(diǎn)擊查看詳情。后臺(tái)實(shí)現(xiàn)了對(duì)用戶角色的管理以及新聞的管理、編輯、上傳工作。較完整的理解了ASP.NET中WEB2.0架構(gòu)的基本開發(fā)過程。對(duì)三層架構(gòu)有了初步的理解和認(rèn)識(shí)。接下來的時(shí)間我學(xué)習(xí)了使用MVC2.0開發(fā)商務(wù)網(wǎng)站。MVC同樣是三層架構(gòu)模型。與WEB開發(fā)架構(gòu)的主要區(qū)別在于,MVC是物理上的三層架構(gòu),而WEB是邏輯上的三層架構(gòu)。MVC解放了路由機(jī)制,使得頁面的交互速度大幅提高。通過訪問controler層,調(diào)用DAL層函數(shù),使用MODEL層存儲(chǔ)數(shù)據(jù),使用DBHELPER類中的通用方法,實(shí)現(xiàn)參數(shù)的傳遞,以及與數(shù)據(jù)庫(kù)的交互,最終將參數(shù)返回到VIEW層,實(shí)現(xiàn)頁面的顯示。MVC架構(gòu)的開發(fā)優(yōu)勢(shì)在于,給了程序員絕對(duì)的自由,可以通過JS、JQ寫出各種需要的顯示效果,頁面的可讀性和自由性也大大提高。同時(shí),MVC也兼顧了WEB的優(yōu)點(diǎn),方便了代碼的模塊化傳遞,增加代碼的復(fù)用性,提高代碼的可讀性。通過一個(gè)半月的開發(fā)工作,我成功實(shí)現(xiàn)了商務(wù)網(wǎng)站的基本功能,實(shí)現(xiàn)了支付接口,前臺(tái)的注冊(cè)登錄,商品展示、購(gòu)買。后臺(tái)的訂單管理,用戶管理以及角色授權(quán)等功能。
通過學(xué)習(xí)ASP.NET我基本熟悉了網(wǎng)站的開發(fā)模式、架構(gòu)以及開發(fā)流程,通過實(shí)際項(xiàng)目的演練,也讓我能夠?qū)⒋髮W(xué)學(xué)習(xí)中的理論運(yùn)用到實(shí)踐?,F(xiàn)階段所需要的就是繼續(xù)加深C#的學(xué)習(xí)深度,了解JS、JQ庫(kù)的寫作規(guī)范,爭(zhēng)取能夠盡早使用自己編寫的JS庫(kù)完成個(gè)人網(wǎng)站的建設(shè)開發(fā)工作。很感謝成都華育國(guó)際的老師和同學(xué)在這幾個(gè)月時(shí)間里給我的幫助,讓我能夠在ASP.NET的開發(fā)中達(dá)到入門水平。希望通過自身的努力,將自己的技術(shù)進(jìn)一步提高。
第四篇:告別煩惱青春飛揚(yáng)
告別煩惱青春飛揚(yáng)
———靠山中學(xué)八年五班心里主題班會(huì)方案
活動(dòng)地點(diǎn):靠山中學(xué)八年五班教室
活動(dòng)時(shí)間:2010 6 8
活動(dòng)背景
學(xué)生走進(jìn)初二,面臨著社會(huì)家庭和學(xué)校給予的太多的學(xué)習(xí)壓力的同時(shí),生理及心理也發(fā)生了很大變化,學(xué)生有太多的困惑,擾亂了他們的正常生活。在這樣的前提下,我們召開了此次班會(huì),希望全體同學(xué)們從班會(huì)中有所感悟,有所收獲,擺脫困境,輕松快樂的走進(jìn)初三。
活動(dòng)目的1.正確面對(duì)考試,積極向上,尋找正確的學(xué)習(xí)方法。
2.男女生正常交往,純真的友誼最美好。
3.體會(huì)父母的良苦用心,與父母常溝通。
活動(dòng)準(zhǔn)備活動(dòng)
1.收集班級(jí)事例
活動(dòng)過程
本次班會(huì)共三大版塊:
第一版塊:中學(xué)生活的困惑
1.開場(chǎng)白
2.心理劇《請(qǐng)你幫幫我》
3.心理小組解惑
第二版塊:走出青蘋果樂園
1.《一位男生的獨(dú)白》
2.辯論《男女生是否可以交往》
3.詩朗誦《我為少男少女歌唱》
4.成長(zhǎng)誓言
第三版塊:走不出的港灣
1.一位男生的苦惱
2.解惑,講述與父母親的真實(shí)故事
3.共唱《感恩的心》
活動(dòng)總結(jié)及效果分析
本次班會(huì),收到的效果非常好,是一堂成功的班會(huì),因?yàn)槊课煌瑢W(xué)都熱情洋溢的參與,所有的事例與講談,絕對(duì)是從他們內(nèi)心真切涌出,達(dá)到了情感共鳴。心理班會(huì)的目的就是能在孩子們的心靈上激起一層漣漪送去一份養(yǎng)分,而這次班會(huì)達(dá)到了。真心希望同學(xué)們?cè)诎鄷?huì)中有所思有所悟,擺脫困惑,快樂地生活,輕松地學(xué)習(xí)。
第五篇:告別計(jì)算錯(cuò)誤的煩惱
告別計(jì)算錯(cuò)誤的煩惱——快樂學(xué)數(shù)學(xué)
在小學(xué)數(shù)學(xué)計(jì)算教學(xué)和解題過程中,計(jì)算錯(cuò)誤常常困擾著教師和學(xué)生。如:在計(jì)算時(shí),學(xué)生不是看錯(cuò)數(shù)字,就是寫錯(cuò)數(shù)字;不是抄錯(cuò)數(shù)字,就是漏寫符號(hào);不是加法忘了進(jìn)位,就是減法忘了退位;不是加法當(dāng)乘法做,就是計(jì)算順序顛倒;甚至?xí)霈F(xiàn)一些無法理解的錯(cuò)誤。錯(cuò)誤發(fā)生后,學(xué)生懊悔,老師責(zé)備,家長(zhǎng)埋怨。
怎樣減少小學(xué)生的計(jì)算錯(cuò)誤,提高計(jì)算的準(zhǔn)確率,讓學(xué)生快樂輕松學(xué)數(shù)學(xué)呢? 對(duì)于學(xué)生計(jì)算中的錯(cuò)誤,我們不能以“馬虎”、“粗心大意”一言以避之。我們只有透過計(jì)算錯(cuò)誤現(xiàn)象查找錯(cuò)誤的原因和本質(zhì),對(duì)癥下藥,才能讓我們的學(xué)生徹底糾正計(jì)算中出現(xiàn)的錯(cuò)誤,快樂學(xué)數(shù)學(xué)。下面,我就結(jié)合自己的
教學(xué)實(shí)踐談?wù)剬W(xué)生計(jì)算錯(cuò)誤的類型、錯(cuò)誤成因及解決途徑。
一、小學(xué)生計(jì)算錯(cuò)誤的類型
計(jì)算錯(cuò)誤錯(cuò)誤通常是指計(jì)算結(jié)果不正確。由于學(xué)生千差萬別,個(gè)體之間存在著很大的差異性,因此學(xué)生出現(xiàn)的計(jì)算錯(cuò)誤也各不一樣。我歸納了一下,計(jì)算錯(cuò)誤大體有以下幾種類型:
1、感知性造成的錯(cuò)誤——誤認(rèn)
誤認(rèn)是學(xué)生在認(rèn)讀數(shù)字過程中造成的錯(cuò)誤。主要是由于學(xué)生做作業(yè)三心二意不專心,沒有認(rèn)真細(xì)致的審題習(xí)慣造成的一種錯(cuò)誤。這種錯(cuò)誤有兩種類型,一種是認(rèn)錯(cuò)了數(shù)字,如:計(jì)算53-18正確結(jié)果應(yīng)該是35,而往往得出錯(cuò)誤結(jié)果17或45,得出前一個(gè)結(jié)果的原因是把53誤認(rèn)成35,得出45的原因是沒有退位(有時(shí),加法沒有進(jìn)位);另一種是認(rèn)錯(cuò)符號(hào),如:口算5×4的正確結(jié)果是20,而寫成9,原因是把運(yùn)算符號(hào)看錯(cuò)了。
2、意志品質(zhì)問題造成的錯(cuò)誤——誤寫 誤寫也叫筆下誤,就是本來計(jì)算正確,但在寫答案結(jié)果時(shí)出現(xiàn)了腦中想的和手上寫的不相符筆誤而產(chǎn)生的錯(cuò)誤。如:在計(jì)算148÷4時(shí),豎式計(jì)算正確得結(jié)果37,而在橫式上忘記寫結(jié)果或?qū)懗?3。如:在137÷3時(shí),豎式計(jì)算正確,橫式寫成:137÷3=46,那就可能有兩種情況:要么是忘了寫余數(shù),要么就是不知道寫余數(shù)。
3、技能性錯(cuò)誤——誤算
誤算是指在計(jì)算過程中出現(xiàn)的錯(cuò)誤。這種錯(cuò)誤通常有以下幾種情形:
(1)算理錯(cuò)誤。學(xué)生沒有掌握正確的算理和計(jì)算法則,而導(dǎo)致計(jì)算錯(cuò)誤。例如:把5÷5=1錯(cuò)算成5÷5=0,把3×0=0錯(cuò)算成3×0=3,把3+5×4=23錯(cuò)算成3+5×4=32,把30-8÷2=26錯(cuò)算成30-8÷2=11,把1/2+1/3=5/6錯(cuò)算成等于2/5,把3.25÷0.5=6.5錯(cuò)算成等于65等。
(2)口算有誤??谒阌姓`就是學(xué)生在筆算時(shí),運(yùn)用口算列式計(jì)算相加、減、乘或除時(shí)出現(xiàn)錯(cuò)誤。如:計(jì)算368×56不是得出正確結(jié)果20976,而得出錯(cuò)誤結(jié)果20966就屬于這種情況。
4、思維定勢(shì)錯(cuò)誤——誤判
定勢(shì)錯(cuò)誤是學(xué)生對(duì)已學(xué)的知識(shí)已真正掌握了,卻未能準(zhǔn)確、熟練的運(yùn)用而造成的錯(cuò)誤。有些題目鮮明突出,易在腦中留下較深刻的印象,形成較強(qiáng)的信息,產(chǎn)生定勢(shì)作用,這種思維定勢(shì)會(huì)使學(xué)生的正確思維受到干擾。特別是簡(jiǎn)便運(yùn)算,當(dāng)碰到與強(qiáng)信息相類似的外來信息時(shí),原有的強(qiáng)信息被激活,產(chǎn)生思維干擾。如當(dāng)學(xué)生計(jì)算400÷25×4,就有學(xué)生計(jì)算成400÷25×4=400÷100=4。分析其原因,25×4=100是一個(gè)強(qiáng)信息,這一強(qiáng)信息抑制了學(xué)生在同級(jí)計(jì)算中按從左往右的順序依次計(jì)算的法則的正常運(yùn)用,造成計(jì)算錯(cuò)誤(表面上看像運(yùn)算法則應(yīng)用錯(cuò)誤,實(shí)際上是思維定勢(shì)錯(cuò)誤);又如2.8×3.3+2.8×5.7,象這類題在運(yùn)用乘法分配律時(shí)括號(hào)里面的兩數(shù)之和一般是整
十、整百或整千數(shù),這是一個(gè)強(qiáng)信息,受其干擾,學(xué)生就會(huì)算成2.8×3.3+2.8×5.7=2.8×(3.3+5.7)=2.8×10=28。這些都是思維定勢(shì)產(chǎn)生的錯(cuò)誤。
造成這些計(jì)算錯(cuò)誤的原因是什么,我們?nèi)绾螏椭鷮W(xué)生解決?
二、小學(xué)生計(jì)算錯(cuò)誤的原因分析及解決途徑
1、對(duì)于感知性造成的錯(cuò)誤——誤認(rèn)
造成這種錯(cuò)誤主要是受小學(xué)生本身的年齡、個(gè)性、興趣、理解能力、知識(shí)水平等方面的因素影響,他們的注意不穩(wěn)定,不持久,注意的范圍不廣,易被無關(guān)因素吸引而出現(xiàn)“分心”現(xiàn)象,常常會(huì)出現(xiàn)顧此失彼,丟三落四。
解決辦法:一是加強(qiáng)有意注意的培養(yǎng),訓(xùn)練注意分配能力,提高注意能力;二是培養(yǎng)學(xué)生認(rèn)真細(xì)致的學(xué)習(xí)習(xí)慣,提高認(rèn)讀的正確率;三是教師作業(yè)要合理設(shè)計(jì)和安排,避免重復(fù)的機(jī)械訓(xùn)練。
2、對(duì)于意志品質(zhì)問題造成的錯(cuò)誤——誤寫
這種錯(cuò)誤主要是沒有認(rèn)真審題造成的。對(duì)于這種錯(cuò)誤,我們要從源頭抓起,要他們多讀題,培養(yǎng)學(xué)生認(rèn)真細(xì)致的審題習(xí)慣(開始1題讀至少3遍,把計(jì)算結(jié)果與橫式結(jié)果對(duì)照檢查,隨著審題能力的提高,以后逐漸減少。)。
3、對(duì)于技能性錯(cuò)誤——誤算
這種錯(cuò)誤主要是學(xué)生在小學(xué)數(shù)學(xué)計(jì)算學(xué)習(xí)中,沒有把數(shù)的概念和運(yùn)算法則掌握好,理解得不夠透徹,還有就是缺乏扎實(shí)的基礎(chǔ)知識(shí)和熟練的基本口算技能。
解決辦法:一是要加強(qiáng)計(jì)算的概念認(rèn)識(shí),讓他們熟練掌握運(yùn)算定律和法則;二是要加強(qiáng)口算能力的培養(yǎng),提高口算的質(zhì)量;三是要加強(qiáng)估算能力的培養(yǎng),提高運(yùn)算速度和準(zhǔn)確率;四是要強(qiáng)化養(yǎng)成教育,使學(xué)生養(yǎng)成驗(yàn)算檢查的好習(xí)慣。
4、對(duì)于思維定勢(shì)錯(cuò)誤——誤判
思維定勢(shì)從積極的一面來看,能使學(xué)生借助以往的經(jīng)驗(yàn),促使問題得以迅速解決。從消極得一面來看,也往往導(dǎo)致思維的僵化,不能適應(yīng)變化了的情況,阻礙了多角度的靈活思維的發(fā)展,而仍按原有的思維方式考慮問題,從而導(dǎo)致錯(cuò)誤的發(fā)生。
解決辦法:設(shè)計(jì)針對(duì)性練習(xí),排除干擾因素。我們都知道小學(xué)數(shù)學(xué)中有許多計(jì)算既有聯(lián)系又有區(qū)別,因此在計(jì)算教學(xué)過程中,教師要注意根據(jù)學(xué)生的實(shí)際情況設(shè)計(jì)一些針對(duì)性練習(xí),以便排除各種干擾,充分利用定勢(shì)的積極一面,克服消極影響,提高計(jì)算的正確率。其中,對(duì)教學(xué)中學(xué)生容易忽略的環(huán)節(jié),應(yīng)作必要的突出,或采用反例,進(jìn)行專項(xiàng)訓(xùn)練或?qū)Ρ缺嫖?,以保證開始就讓學(xué)生形成正確鮮明的印象,力求減少因定勢(shì)而產(chǎn)生的失誤。
莎士比亞在《理查二世》一文中說過這樣的一句話:容忍禍根亂源而不加糾正,危險(xiǎn)已是無可避免的。對(duì)于學(xué)生計(jì)算中的錯(cuò)誤,我們不能以“馬虎”、“粗心大意”一言以避之。在教學(xué)過程中,我們要認(rèn)真找出學(xué)生計(jì)算中出現(xiàn)錯(cuò)誤的原因,對(duì)癥下藥,采取相應(yīng)的措施,防止和糾正學(xué)生計(jì)算中錯(cuò)誤的發(fā)生,讓計(jì)算錯(cuò)誤的煩惱不再來,讓學(xué)生享受數(shù)學(xué)學(xué)習(xí)的樂趣,輕松學(xué)數(shù)學(xué)。