日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

循序渐进开发WinForm项目(5)--Excel数据的导入导出操作

發布時間:2023/12/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 循序渐进开发WinForm项目(5)--Excel数据的导入导出操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

隨筆背景:在很多時候,很多入門不久的朋友都會問我:我是從其他語言轉到C#開發的,有沒有一些基礎性的資料給我們學習學習呢,你的框架感覺一下太大了,希望有個循序漸進的教程或者視頻來學習就好了。

其實也許我們每天面對的太多東西了,覺得很多都稀松平常了,即使很細微的地方,可能我們都已經形成習慣了。反過來,如果我們切換到其他領域,如IOS、android,那么開始我們可能對里面很多設計的規則不甚了解,開始可能也是一頭霧水。

本篇繼續上一篇《循序漸進開發WinForm項目(4)--Winform界面模塊的集成使用》,繼續介紹如何循序漸進開發Winform項目,介紹業務模塊常見的導入導出操作的功能實現,使得我們能夠快速,高效開發常見的模塊功能。

上篇隨筆我們介紹到自動代碼生成的界面如下所示,具備了導入、導出操作,這個操作是針對Excel進行的。

下面我們來介紹這個在很多模塊里面常見的Excel導入、Excel導出操作是如何實現的。

1、Excel數據的導出操作

由于我為了演示的目的,我在客戶信息表里面只是設計了幾個代表性的字段,下面我們來看看代碼生成工具自動生成的界面后臺代碼是如何的。

/// <summary>/// 導出Excel的操作/// </summary>private void btnExport_Click(object sender, EventArgs e){string file = FileDialogHelper.SaveExcel(string.Format("{0}.xls", moduleName));if (!string.IsNullOrEmpty(file)){string where = GetConditionSql();List<CustomerInfo> list = BLLFactory<Customer>.Instance.Find(where);DataTable dtNew = DataTableHelper.CreateTable("序號|int,姓名,年齡,創建人,創建時間");DataRow dr;int j = 1;for (int i = 0; i < list.Count; i++){dr = dtNew.NewRow();dr["序號"] = j++;dr["姓名"] = list[i].Name;dr["年齡"] = list[i].Age;dr["創建人"] = list[i].Creator;dr["創建時間"] = list[i].CreateTime;dtNew.Rows.Add(dr);}try{string error = "";AsposeExcelTools.DataTableToExcel2(dtNew, file, out error);if (!string.IsNullOrEmpty(error)){MessageDxUtil.ShowError(string.Format("導出Excel出現錯誤:{0}", error));}else{if (MessageDxUtil.ShowYesNoAndTips("導出成功,是否打開文件?") == System.Windows.Forms.DialogResult.Yes){System.Diagnostics.Process.Start(file);}}}catch (Exception ex){LogTextHelper.Error(ex);MessageDxUtil.ShowError(ex.Message);}}}

上面的代碼中,FileDialogHelper.SaveExcel?函數是調用公用類庫模塊,彈出一個選擇保存文件的對話框,如果你沒有這個類,你可以自己添加代碼實現這個操作(這就是公用類庫的好處,在使用的時候能夠快速調用,減少代碼,提高效率)。

然后根據客戶錄入的條件檢索需要的數據內容:string where = GetConditionSql();

接著就是構建一個相關字段的表格對象:DataTableHelper.CreateTable,這里面也是使用公用類庫來方便創建各種字段的表格,默認字段為字符串格式,如果需要如整形格式的,可以通過|進行分割,如“序號|int” 。

創建DataTable對象后,我們遍歷對象集合,把它里面的數據一行行的賦值給DataRow對象就可以了。

for (int i = 0; i < list.Count; i++){dr = dtNew.NewRow();dr["序號"] = j++;dr["姓名"] = list[i].Name;dr["年齡"] = list[i].Age;dr["創建人"] = list[i].Creator;dr["創建時間"] = list[i].CreateTime;dtNew.Rows.Add(dr);}

賦值后,就是需要把DataTable對象轉換為Excel的操作過程了,這里操作分為兩步,第一是創建Excel文檔,第二個是寫數據的表頭和數據行信息,也就是數據的寫入操作,這里面我們把它封裝在公用類庫里面,方便模塊之間的調用。

導出Excel模塊采用了基于Aspose.Cell的組件進行數據的寫入操作:AsposeExcelTools.DataTableToExcel2

導出完成后,我們提示用戶是否打開Excel文件。

if (MessageDxUtil.ShowYesNoAndTips("導出成功,是否打開文件?") == System.Windows.Forms.DialogResult.Yes) {System.Diagnostics.Process.Start(file); }

最終,完成功能后,我們運行程序,導出Excel數據的效果如下所示。

2、Excel數據的導入操作

相對于數據的導出操作,Excel數據的導入操作會稍微麻煩一點,你至少需要選擇一個文件,文件最好以固定的模板進行導入,因此為了讓用戶確認數據的有效性,我們最好能提供了一個把Excel數據顯示出來再確認導入的過程,這樣可以減少導入錯誤數據的可能。

我們知道,這種常見的導入操作,很多業務模塊可能都需要,因此有必要考慮把它抽象出來,作為一個通用的導入模塊,這樣我們可以多次利用,非常方便,因此我們提煉這個通用導入的模塊特性如下所示。

Excel數據的導入模塊,默認生成界面的時候,也已經一并生成了,我們來看看其中的代碼。

private string moduleName = "客戶信息";/// <summary>/// 導入Excel的操作/// </summary> private void btnImport_Click(object sender, EventArgs e){string templateFile = string.Format("{0}-模板.xls", moduleName);FrmImportExcelData dlg = new FrmImportExcelData();dlg.SetTemplate(templateFile, System.IO.Path.Combine(Application.StartupPath, templateFile));dlg.OnDataSave += new FrmImportExcelData.SaveDataHandler(ExcelData_OnDataSave);dlg.OnRefreshData += new EventHandler(ExcelData_OnRefreshData);dlg.ShowDialog();}

其中FrmImportExcelData 是一個界面基礎模塊中定義的一個通用導入模塊,里面實現了一些如顯示Excel數據,模板信息關聯,保存數據的接口等操作。我們來看看它的程序運行的效果。

其中我們通過代碼?dlg.SetTemplate?指定模板就是用來關聯Excel模板信息的,我們讓可以盡可能的選擇正確的模板進行錄入數據。

用戶通過第2的標識,指定要導入的Excel數據文件,選擇文件后,數據會自動顯示出來方便確認。

但我們選擇保存數據的操作的時候,這個通用模塊會執行保存的邏輯代碼,并調用由創建者實現的代碼邏輯,如上面代碼的dlg.OnDataSave就是在執行保存的時候,執行的代碼邏輯,我們來看看生成的一些代碼實現。

bool ExcelData_OnDataSave(DataRow dr){bool success = false;bool converted = false;DateTime dtDefault = Convert.ToDateTime("1900-01-01");DateTime dt;CustomerInfo info = new CustomerInfo();info.Name = dr["姓名"].ToString();info.Age = dr["年齡"].ToString().ToInt32();info.Creator = dr["創建人"].ToString();converted = DateTime.TryParse(dr["創建時間"].ToString(), out dt);if (converted && dt > dtDefault){info.CreateTime = dt;}success = BLLFactory<Customer>.Instance.Insert(info);return success;}

我們知道,導入的時候,是遍歷每行Excel進行數據保存操作的,因此我們這里給出了一個一行的操作代碼即可:bool ExcelData_OnDataSave(DataRow dr),里面的邏輯,在數據保存的時候會被模塊進行調用。

上面的操作,是一條條的進行操作,如果累計超過3條記錄出錯,模塊提示是否繼續還是退出。

這里面并沒有采用事務的操作,對于一些如Sqlite的大批量的數據操作(速度提升很快),建議采用事務進行處理,關于這個可以參考《Winform開發框架之通用數據導入導出操作的事務性操作完善》進行修改調整。

最后,我們的Excel數據導入完成后,為了及時更新主界面的數據,我們也定義了一個事件作為回調,如下所示。

dlg.OnRefreshData += new EventHandler(ExcelData_OnRefreshData);

這個事件的實現代碼就是在主界面的數據綁定更新。

void ExcelData_OnRefreshData(object sender, EventArgs e){BindData();}

循序漸進開發WInform項目--系列文章導引:

《循序漸進開發WinForm項目(5)--Excel數據的導入導出操作》

《循序漸進開發WinForm項目(4)--Winform界面模塊的集成使用》

《循序漸進開發WinForm項目(3)--Winform界面層的項目設計》

《循序漸進開發WinForm項目(2)--項目代碼的分析》

《循序漸進開發WinForm項目(1) --數據庫設計和項目框架的生成》

本文轉自博客園伍華聰的博客,原文鏈接:循序漸進開發WinForm項目(5)--Excel數據的導入導出操作,如需轉載請自行聯系原博主。



總結

以上是生活随笔為你收集整理的循序渐进开发WinForm项目(5)--Excel数据的导入导出操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。