C#實現(xiàn)文件上傳下載Excel文檔示例代碼
要求
環(huán)境信息:WIN2008SERVER 開發(fā)工具:VS2015 開發(fā)語言:C#
要求:
1.點擊同步數(shù)據(jù)后接口獲取數(shù)據(jù)展示頁面同時過濾無效數(shù)據(jù)并寫入數(shù)據(jù)庫,數(shù)據(jù)可導(dǎo)出Excel并支持分類導(dǎo)出
2.Excel導(dǎo)入確認數(shù)據(jù),調(diào)用服務(wù)處理數(shù)據(jù)后寫入數(shù)據(jù)庫,并支持分類導(dǎo)出
這兩天搞了一個小功能,其他的不說了針對Excel導(dǎo)入導(dǎo)出做一個小總結(jié)
導(dǎo)出文件
這里的文件導(dǎo)出是底層寫好的,個人理解有限而且畢竟屬于公司就不貼具體代碼了,簡單說一下思路
首先是建立導(dǎo)出Excel管理類,用于管理Excel文件導(dǎo)出的模板 樣式 每行的計算方式等等,當然需要在項目中添加該管理類的配置文件去匹配對應(yīng)模板;
1.讀取對應(yīng)配置文件,獲取配置文件模板信息 至于模板如何配置就不說啦xml文件操作園子里面很多篇關(guān)于這個文章

2.根據(jù)XML文件定義模板id遍歷查詢到該模板,這里有緩存機制為了可能處于兩方面考慮,1,防止頻繁讀取遍歷文件從而減少性能缺失 2.弱誤刪配置文件程序不會立即停止工作,監(jiān)控警報會首先暴露這個問題

3.最后就是讀取指定id下面的具體導(dǎo)出設(shè)置,比如標題頭,上限行數(shù),給定簡單默認值等等細節(jié)處理,同時也含有緩存機制

配置文件模板管理大致上有以上幾種功能,下面就是具體數(shù)據(jù)庫導(dǎo)出,還是那樣不能提供具體代碼但是思路可以說一說
導(dǎo)出管理類需要承接很多任務(wù),入數(shù)據(jù)庫查詢,數(shù)據(jù)過濾,導(dǎo)出格式控制,導(dǎo)出日志設(shè)置,導(dǎo)出預(yù)警等等

其實這并不是一個簡單的excel導(dǎo)出工具而是一個小型的導(dǎo)出平臺,承接一個導(dǎo)出實體去設(shè)置導(dǎo)出的各項數(shù)據(jù),但是還是需要開發(fā)者根據(jù)自己的需求去填寫相應(yīng)的模板,導(dǎo)出格式,數(shù)據(jù)驗證,數(shù)據(jù)查詢方式實體承接了導(dǎo)出方式
(xls或者csv等等很多格式)使用者只需要寫入具體導(dǎo)出DB信息,以及導(dǎo)出表名稱和配置文件以及數(shù)據(jù)驗證就可以輕松使用它完成數(shù)據(jù)導(dǎo)出操作

并且,針對文件導(dǎo)出操作尤其是數(shù)據(jù)庫最好由底層實現(xiàn)通過response流發(fā)送到頁面執(zhí)行下載,數(shù)據(jù)相對規(guī)整一些如果在頁面直接執(zhí)行導(dǎo)出頁面有些太沉重了 畢竟這個是可以實現(xiàn)的
導(dǎo)入文件
導(dǎo)入文件首先需要上傳,文件上傳至服務(wù)器指定地址之后再去針對服務(wù)器文件解析,其實原理很簡單,就是通過解析上傳的文件通過OLDB方式獲取解析后的文件DataSet然后在寫入數(shù)據(jù)庫,下面是一個上傳文件格式驗證

具體的讀取方法就很簡單了 網(wǎng)上一搜一大把,不過要區(qū)分一下版本而且不同版本的excel文件行數(shù)上線不同下面貼一個我常用的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;
}
哦對 注意一下,如果用導(dǎo)出方法導(dǎo)出xls文件再用導(dǎo)入方法導(dǎo)入該文件會報錯的喲,我是默認保存.csv 實際就為了確定文件是否被使用過,所以當你的excel文件能導(dǎo)出單相同文件卻導(dǎo)入不了 請嘗試一下重新保存一下.xls格式 在進行導(dǎo)入
相關(guān)文章
C#實現(xiàn)BBcode轉(zhuǎn)為Markdown的方法
這篇文章主要給大家介紹了關(guān)于C#實現(xiàn)BBcode轉(zhuǎn)Markdown的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-02-02
詳解WPF如何使用WriteableBitmap提升Image性能
這篇文章主要為大家詳細介紹了WPF如何使用WriteableBitmap提升Image性能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01
WPF實現(xiàn)在控件上顯示Loading等待動畫的方法詳解
這篇文章主要介紹了WPF 如何在控件上顯示 Loading 等待動畫,文中的示例代碼講解詳細,對我們學(xué)習(xí)或工作有一定幫助,需要的可以參考一下2023-03-03

