最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#實(shí)現(xiàn)文件上傳下載Excel文檔示例代碼

 更新時(shí)間:2017年08月29日 16:49:31   作者:流年過(guò)往  
這篇文章主要介紹了C#實(shí)現(xiàn)文件上傳下載Excel文檔示例代碼,需要的朋友可以參考下

要求

環(huán)境信息:WIN2008SERVER  開(kāi)發(fā)工具:VS2015 開(kāi)發(fā)語(yǔ)言:C#

要求:

  1.點(diǎn)擊同步數(shù)據(jù)后接口獲取數(shù)據(jù)展示頁(yè)面同時(shí)過(guò)濾無(wú)效數(shù)據(jù)并寫(xiě)入數(shù)據(jù)庫(kù),數(shù)據(jù)可導(dǎo)出Excel并支持分類導(dǎo)出

  2.Excel導(dǎo)入確認(rèn)數(shù)據(jù),調(diào)用服務(wù)處理數(shù)據(jù)后寫(xiě)入數(shù)據(jù)庫(kù),并支持分類導(dǎo)出

這兩天搞了一個(gè)小功能,其他的不說(shuō)了針對(duì)Excel導(dǎo)入導(dǎo)出做一個(gè)小總結(jié)

導(dǎo)出文件

這里的文件導(dǎo)出是底層寫(xiě)好的,個(gè)人理解有限而且畢竟屬于公司就不貼具體代碼了,簡(jiǎn)單說(shuō)一下思路

首先是建立導(dǎo)出Excel管理類,用于管理Excel文件導(dǎo)出的模板 樣式 每行的計(jì)算方式等等,當(dāng)然需要在項(xiàng)目中添加該管理類的配置文件去匹配對(duì)應(yīng)模板;

1.讀取對(duì)應(yīng)配置文件,獲取配置文件模板信息 至于模板如何配置就不說(shuō)啦xml文件操作園子里面很多篇關(guān)于這個(gè)文章

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

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

配置文件模板管理大致上有以上幾種功能,下面就是具體數(shù)據(jù)庫(kù)導(dǎo)出,還是那樣不能提供具體代碼但是思路可以說(shuō)一說(shuō)

導(dǎo)出管理類需要承接很多任務(wù),入數(shù)據(jù)庫(kù)查詢,數(shù)據(jù)過(guò)濾,導(dǎo)出格式控制,導(dǎo)出日志設(shè)置,導(dǎo)出預(yù)警等等

其實(shí)這并不是一個(gè)簡(jiǎn)單的excel導(dǎo)出工具而是一個(gè)小型的導(dǎo)出平臺(tái),承接一個(gè)導(dǎo)出實(shí)體去設(shè)置導(dǎo)出的各項(xiàng)數(shù)據(jù),但是還是需要開(kāi)發(fā)者根據(jù)自己的需求去填寫(xiě)相應(yīng)的模板,導(dǎo)出格式,數(shù)據(jù)驗(yàn)證,數(shù)據(jù)查詢方式實(shí)體承接了導(dǎo)出方式

(xls或者csv等等很多格式)使用者只需要寫(xiě)入具體導(dǎo)出DB信息,以及導(dǎo)出表名稱和配置文件以及數(shù)據(jù)驗(yàn)證就可以輕松使用它完成數(shù)據(jù)導(dǎo)出操作

并且,針對(duì)文件導(dǎo)出操作尤其是數(shù)據(jù)庫(kù)最好由底層實(shí)現(xiàn)通過(guò)response流發(fā)送到頁(yè)面執(zhí)行下載,數(shù)據(jù)相對(duì)規(guī)整一些如果在頁(yè)面直接執(zhí)行導(dǎo)出頁(yè)面有些太沉重了 畢竟這個(gè)是可以實(shí)現(xiàn)的

導(dǎo)入文件

 導(dǎo)入文件首先需要上傳,文件上傳至服務(wù)器指定地址之后再去針對(duì)服務(wù)器文件解析,其實(shí)原理很簡(jiǎn)單,就是通過(guò)解析上傳的文件通過(guò)OLDB方式獲取解析后的文件DataSet然后在寫(xiě)入數(shù)據(jù)庫(kù),下面是一個(gè)上傳文件格式驗(yàn)證

具體的讀取方法就很簡(jiǎn)單了 網(wǎng)上一搜一大把,不過(guò)要區(qū)分一下版本而且不同版本的excel文件行數(shù)上線不同下面貼一個(gè)我常用的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 = "無(wú)效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} 出錯(cuò),原因:{1}", stringBuilder.ToString(), ex.Message);
 }
 finally
 {
  oleDbConnection.Close();
 }
 return returnValue;
}

哦對(duì) 注意一下,如果用導(dǎo)出方法導(dǎo)出xls文件再用導(dǎo)入方法導(dǎo)入該文件會(huì)報(bào)錯(cuò)的喲,我是默認(rèn)保存.csv 實(shí)際就為了確定文件是否被使用過(guò),所以當(dāng)你的excel文件能導(dǎo)出單相同文件卻導(dǎo)入不了 請(qǐng)嘗試一下重新保存一下.xls格式 在進(jìn)行導(dǎo)入

相關(guān)文章

  • C#使用DirectX.DirectSound播放語(yǔ)音

    C#使用DirectX.DirectSound播放語(yǔ)音

    這篇文章主要為大家詳細(xì)介紹了C#使用DirectX.DirectSound播放語(yǔ)音,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • c#處理3種json數(shù)據(jù)的實(shí)例

    c#處理3種json數(shù)據(jù)的實(shí)例

    這篇文章主要介紹了c#處理包含數(shù)組、對(duì)象的復(fù)雜json數(shù)據(jù)的方法,,需要的朋友可以參考下
    2014-03-03
  • C#實(shí)現(xiàn)BBcode轉(zhuǎn)為Markdown的方法

    C#實(shí)現(xiàn)BBcode轉(zhuǎn)為Markdown的方法

    這篇文章主要給大家介紹了關(guān)于C#實(shí)現(xiàn)BBcode轉(zhuǎn)Markdown的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-02-02
  • C# yield在WCF中的錯(cuò)誤使用(二)

    C# yield在WCF中的錯(cuò)誤使用(二)

    這篇文章主要介紹了C# yield在WCF中的錯(cuò)誤使用(二),本文講解的內(nèi)容據(jù)說(shuō)是99%的開(kāi)發(fā)人員都有可能犯的錯(cuò)誤,需要的朋友可以參考下
    2015-04-04
  • 詳解WPF如何使用WriteableBitmap提升Image性能

    詳解WPF如何使用WriteableBitmap提升Image性能

    這篇文章主要為大家詳細(xì)介紹了WPF如何使用WriteableBitmap提升Image性能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • C# textbox密碼框設(shè)置方式

    C# textbox密碼框設(shè)置方式

    這篇文章主要介紹了C# textbox密碼框設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • WPF實(shí)現(xiàn)在控件上顯示Loading等待動(dòng)畫(huà)的方法詳解

    WPF實(shí)現(xiàn)在控件上顯示Loading等待動(dòng)畫(huà)的方法詳解

    這篇文章主要介紹了WPF 如何在控件上顯示 Loading 等待動(dòng)畫(huà),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定幫助,需要的可以參考一下
    2023-03-03
  • C#并行編程之信號(hào)量

    C#并行編程之信號(hào)量

    這篇文章介紹了C#并行編程之信號(hào)量,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • 深入c# Func委托的詳解

    深入c# Func委托的詳解

    本篇文章是對(duì)c#中的Func委托進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • WinForm入門與基本控件使用詳解

    WinForm入門與基本控件使用詳解

    本文主要介紹了WinForm入門與基本控件使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06

最新評(píng)論

于田县| 永和县| 阿拉善盟| 凉山| 许昌县| 北安市| 汉沽区| 杭锦后旗| 临猗县| 台东县| 芒康县| 大荔县| 宝鸡市| 岳普湖县| 克拉玛依市| 美姑县| 新乡县| 荥经县| 义乌市| 安康市| 新昌县| 静宁县| 琼海市| 乳山市| 临高县| 台北县| 鹤壁市| 三明市| 罗平县| 金川县| 平泉县| 博白县| 辽中县| 阳江市| 闻喜县| 昌乐县| 怀来县| 新津县| 吐鲁番市| 达拉特旗| 长沙县|