C#實現文件上傳下載Excel文檔示例代碼
要求
環(huán)境信息:WIN2008SERVER 開發(fā)工具:VS2015 開發(fā)語言:C#
要求:
1.點擊同步數據后接口獲取數據展示頁面同時過濾無效數據并寫入數據庫,數據可導出Excel并支持分類導出
2.Excel導入確認數據,調用服務處理數據后寫入數據庫,并支持分類導出
這兩天搞了一個小功能,其他的不說了針對Excel導入導出做一個小總結
導出文件
這里的文件導出是底層寫好的,個人理解有限而且畢竟屬于公司就不貼具體代碼了,簡單說一下思路
首先是建立導出Excel管理類,用于管理Excel文件導出的模板 樣式 每行的計算方式等等,當然需要在項目中添加該管理類的配置文件去匹配對應模板;
1.讀取對應配置文件,獲取配置文件模板信息 至于模板如何配置就不說啦xml文件操作園子里面很多篇關于這個文章
2.根據XML文件定義模板id遍歷查詢到該模板,這里有緩存機制為了可能處于兩方面考慮,1,防止頻繁讀取遍歷文件從而減少性能缺失 2.弱誤刪配置文件程序不會立即停止工作,監(jiān)控警報會首先暴露這個問題
3.最后就是讀取指定id下面的具體導出設置,比如標題頭,上限行數,給定簡單默認值等等細節(jié)處理,同時也含有緩存機制
配置文件模板管理大致上有以上幾種功能,下面就是具體數據庫導出,還是那樣不能提供具體代碼但是思路可以說一說
導出管理類需要承接很多任務,入數據庫查詢,數據過濾,導出格式控制,導出日志設置,導出預警等等
其實這并不是一個簡單的excel導出工具而是一個小型的導出平臺,承接一個導出實體去設置導出的各項數據,但是還是需要開發(fā)者根據自己的需求去填寫相應的模板,導出格式,數據驗證,數據查詢方式實體承接了導出方式
(xls或者csv等等很多格式)使用者只需要寫入具體導出DB信息,以及導出表名稱和配置文件以及數據驗證就可以輕松使用它完成數據導出操作
并且,針對文件導出操作尤其是數據庫最好由底層實現通過response流發(fā)送到頁面執(zhí)行下載,數據相對規(guī)整一些如果在頁面直接執(zhí)行導出頁面有些太沉重了 畢竟這個是可以實現的
導入文件
導入文件首先需要上傳,文件上傳至服務器指定地址之后再去針對服務器文件解析,其實原理很簡單,就是通過解析上傳的文件通過OLDB方式獲取解析后的文件DataSet然后在寫入數據庫,下面是一個上傳文件格式驗證
具體的讀取方法就很簡單了 網上一搜一大把,不過要區(qū)分一下版本而且不同版本的excel文件行數上線不同下面貼一個我常用的excel到dataset方法
public static ReturnValue ReadExcelToDataSet(string xlsFullFileName, bool isHDR, bool isIMEX, int limitSheetCount, bool isOnlyVerify) { ReturnValue returnValue = new ReturnValue(); string fileExt = UploadFileUtils.GetFileExt(xlsFullFileName); if (string.IsNullOrEmpty(fileExt) || !StringUtils.IsInLimitStr("xls,xlsx", fileExt)) { returnValue.HasError = true; returnValue.ReturnCode = 1; returnValue.Message = "無效excel文件后綴"; return returnValue; } if (!File.Exists(xlsFullFileName)) { returnValue.HasError = true; returnValue.ReturnCode = 2; returnValue.Message = "文件不存在"; return returnValue; } StringBuilder stringBuilder = new StringBuilder(); string str; if ("xlsx".Equals(fileExt, StringComparison.CurrentCultureIgnoreCase)) { stringBuilder.Append("Provider=Microsoft.ACE.OLEDB.12.0"); str = "Excel 12.0;"; } else { stringBuilder.Append("Provider=Microsoft.Jet.OLEDB.4.0"); str = "Excel 8.0;"; } stringBuilder.Append(";Data Source=" + xlsFullFileName); stringBuilder.Append(";Extended Properties=\"" + str); if (isHDR) { stringBuilder.Append(";HDR=Yes"); } if (isIMEX) { stringBuilder.Append(";IMEX=1"); } stringBuilder.Append("\""); ExcelUtils.log.Debug(stringBuilder.ToString()); OleDbConnection oleDbConnection = new OleDbConnection(stringBuilder.ToString()); try { oleDbConnection.Open(); DataTable oleDbSchemaTable = oleDbConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" }); if (oleDbSchemaTable == null || oleDbSchemaTable.Rows.Count == 0) { returnValue.HasError = true; returnValue.ReturnCode = 3; returnValue.Message = "讀取不到sheet的信息"; ReturnValue result = returnValue; return result; } if (isOnlyVerify) { returnValue.HasError = false; returnValue.Message = "讀取sheet信息正確"; returnValue.PutValue("dtSheet", oleDbSchemaTable); ReturnValue result = returnValue; return result; } int num = oleDbSchemaTable.Rows.Count; if (limitSheetCount > 0 && limitSheetCount < oleDbSchemaTable.Rows.Count) { num = limitSheetCount; } string[] array = new string[num]; for (int i = 0; i < num; i++) { array[i] = oleDbSchemaTable.Rows[i]["TABLE_NAME"].ToString(); } DataSet dataSet = new DataSet(); for (int j = 0; j < num; j++) { string text = "select * from [" + array[j] + "]"; ExcelUtils.log.Debug(text); OleDbCommand selectCommand = new OleDbCommand(text, oleDbConnection); OleDbDataAdapter oleDbDataAdapter = new OleDbDataAdapter(selectCommand); DataTable dataTable = new DataTable(array[j]); oleDbDataAdapter.Fill(dataTable); dataSet.Tables.Add(dataTable); } returnValue.HasError = false; returnValue.PutValue("dtSheet", oleDbSchemaTable); returnValue.PutValue("arrTableName", array); returnValue.ReturnObject = dataSet; returnValue.Message = "讀取成功"; } catch (Exception ex) { returnValue.HasError = true; returnValue.ReturnCode = -100; returnValue.ReturnException = ex; returnValue.Message = ex.Message; ExcelUtils.log.WarnFormat("ReadExcelToDataSet sbConn={0} 出錯,原因:{1}", stringBuilder.ToString(), ex.Message); } finally { oleDbConnection.Close(); } return returnValue; }
哦對 注意一下,如果用導出方法導出xls文件再用導入方法導入該文件會報錯的喲,我是默認保存.csv 實際就為了確定文件是否被使用過,所以當你的excel文件能導出單相同文件卻導入不了 請嘗試一下重新保存一下.xls格式 在進行導入