[.Net] Excel導入導出各類方式分析

  • 一、引言

    1.1解決哪些問題

        如今不少公司用的導出基本上採用的經過gridView導出excel,此種導出存在如下幾種問題html

       一、數據量大的時候有時導出有時會讓瀏覽器卡死,由於導出的excel不是真正的excel,是html格式的,只是用excel打開,查看方式只需用記事本或其餘文本編輯器打開就好了。sql

       二、 因爲導出的是html,用excel打開,會出現如下兩個問題:一、因此導出的數據都會彈出一個提示框,「您嘗試打開的文件的格式與文件擴展名指定 格式不一致,打開文件前請驗證文件沒有損壞且來源可信」的對話框二、當修改裏面的內容時只能保存一個副本操做及其不方便。三、並且html格式的文檔導入 也會存在很大的問題。瀏覽器

    1.2未解決的問題

        一、NPOI導出2007格式和2010格式的很慢,幾萬數據極可能會卡死。服務器

    二、 NPOI

       2. 1 NPOI簡介

          NPOI 是 POI 項目的 .NET 版本。POI是一個開源的Java讀寫Excel、WORD等微軟OLE2組件文檔的項目。app

          使用 NPOI 你就能夠在沒有安裝 Office 或者相應環境的機器上對 WORD/EXCEL 文檔進行讀寫。NPOI是構建在POI 3.x版本之上的,它能夠在沒有安裝Office的狀況下對      Word/Excel文檔進行讀寫操做框架

    2.2 NPOI優點xss

        (一)傳統操做Excel遇到的問題:編輯器

          一、若是是.NET,須要在服務器端裝Office,且及時更新它,以防漏洞,還須要設定權限容許.NET訪問COM+,若是在導出過程當中出問題可能致使服務器宕機。ui

          二、Excel會把只包含數字的列進行類型轉換,原本是文本型的,Excel會將其轉成數值型的,好比編號000123會變成123。this

          三、導出時,若是字段內容以「-」或「=」開頭,Excel會把它當成公式進行,會報錯。

          四、Excel會根據Excel文件前8行分析數據類型,若是正好你前8行某一列只是數字,那它會認爲該列爲數值型,自動將該列轉變成相似1.42702E+17格式,日期列變成包含日期和數字的。

          五、第二種是直接導出html,修改後綴名爲.xls,這個方法有點像騙人的把戲,並且不能再導入

         六、第三種是使用Jet OLEDB引擎來進行導入導出,徹底使用sql語句來進行操做,缺點能控制的東西很是有限,好比格式就難以控制

         七、第四中CSV格式的文件其實導出的是文本格式的文件,此種格式的文件優勢導出方便並且速度快。可是使用者用excel對數據進行分析後須要對數據進行從新存一份。

    (二)使用NPOI的優點

          一、你不須要在服務器上安裝微軟的Office,能夠避免版權問題。

          二、使用起來比Office PIA的API更加方便,更人性化。

          三、你不用去花大力氣維護NPOI,NPOI Team會不斷更新、改善NPOI,絕對省成本。

         NPOI之因此強大,並非由於它支持導出Excel,而是由於它支持導入Excel,並能「理解」OLE2文檔結構,這也是其餘一些Excel讀寫庫比 較弱的方面。一般,讀入並理解結構 遠比導出來得複雜,由於導入你必須假設一切狀況都是可能的,而生成你只要保證知足你本身需求就能夠了,若是把導入需求 和生成需求比作兩個集合,那麼生成需求一般都是導入需求的子集,這一規律不只體如今Excel讀寫庫中,也體如今pdf讀寫庫中,目前市面上大部分的 pdf庫僅支持生成,不支持導入。

          四、支持excel07格式和簡單的10格式的導入導出

          五、支持圖片的導入導出

          六、導入導出速度很快

      2.3 NPOI組件構成

          NPOI 2.01,當是.net2.0框架時提供如下使用的dll和配置文件。  

      一、 ICSharpCode.SharpZipLib.dll

      二、 NPOI.dll

      三、 NPOI.OOXML.dll

      四、 NPOI.OpenXml4Net.dll

      五、 NPOI.OpenXml4Net.dll.config

      六、 NPOI.OpenXmlFormats.dll

      七、 NPOI.XML

      若是是.net 3.5框架時提供如下使用的dll和配置文件

      一、 ICSharpCode.SharpZipLib.dll

      二、 NPOI.dll

      三、 NPOI.OOXML.dll

      四、 NPOI.OpenXml4Net.dll

      五、 NPOI.OpenXml4Net.dll.config

      六、 NPOI.OpenXmlFormats.dll

      七、 NPOI.XML

      若是是.net 4.0框架時提供如下使用的dll和配置文件

      一、 ICSharpCode.SharpZipLib.dll

      二、 NPOI.dll

      三、 NPOI.OOXML.dll

      四、 NPOI.OpenXml4Net.dll

      五、 NPOI.OpenXmlFormats.dll

      六、 NPOI.XML

    2.4 如何使用NPOI

     2.4.1 使用準備

        將新建項目時所使用的.net框架版本和NPOI相對應,而後對全部dll添加引用

     2.4.2 NPOI組件dll詳細狀況

      1NPOI.DLL中包含的模塊

      NPOI.Util   基礎輔助庫

      NPOI.POIFS   OLE2格式讀寫庫,主要負責處理DocumentInformation

      NPOI.DDF  Microsoft Drawing格式讀寫庫

      NPOI.SS   Excel 2003和Excel 2007操做庫共用的接口庫以及公用模塊實現,如公式計算庫 

      NPOI.HPSF  OLE2的Summary Information和Document Summary Information屬性讀寫庫

      NPOI.HSSF   Excel BIFF格式讀寫庫,這是用戶用的最多的命名空間

      二、NPOI.OOXML中包含的模塊

      NPOI.XSSF Excel 2007操做庫,大部分對象都實現了NPOI.SS的接口

      NPOI.XWPF Word 2007操做庫

      三、NPOI.OpenXml4Net.DLL中包含的模塊

      只有一個,即NPOI.OpenXml4Net,它是從POI的子項目OpenXml4j移植過來的,其功能相似於NPOI.POIFS,只是 它操做的是OOXML格式。這個模塊和微軟提供的      System.Packaging功能是一致的,只是System.Packaging支 持.Net 3.0以上,這個支持.NET 2.0。

      四、NPOI.OpenXmlFormats.DLL中包含的模塊

      也只有一個,即OpenXmlFormats,它定義了全部OOXML對象和C#對象的映射關係,並協助進行序列化和反序列化,從而使文件讀寫層和邏輯層分離。

    2.4.3 使用操做

      一、取數據操做,因爲導出的數據量很大,不能一次將數據取到內存中,須要分配的將數據取到內存中

           Demo中分批取數據方法

    01. 1         BATOStatisticsRPT bllATO = new BATOStatisticsRPT();
    02. 2              // 因爲導出數據量很大 分頁服務取得的數據很大因此分批取數據放到DataTable中
    03. 3             MyPager pager = new MyPager();
    04. 4
    05. 5             pager.PageSize = 5000;//每次取5000條數據
    06. 6
    07. 7             pager.TotalSize = bllATO.GetRecord();
    08. 8
    09. 9             int pageCount = pager.GetPageCount();
    10. 10
    11. 11             DataTable dt = new DataTable();
    12. 12
    13. 13             for (int i = 0; i < pageCount; i++)
    14. 14
    15. 15             {
    16. 16
    17. 17                 DataTable dtTemp = new DataTable();
    18. 18
    19. 19                 dtTemp = bllATO.GetDataTable("", "", pager.PageSize * i, pager.PageSize * (i + 1));
    20. 20
    21. 21                 dt.Merge(dtTemp);
    22. 22
    23. 23             }
    24. 24
    25. 25             return dt;

       其中有一個簡單分頁類代碼爲:

    01. /// <summary>
    02. /// MyPager類
    03. /// </summary>
    04. public class MyPager
    05. {
    06. /// <summary>
    07. /// 總條數
    08. /// </summary>
    09. public int TotalSize { get; set; }
    10.  
    11. /// <summary>
    12. /// 每頁數據量
    13. /// </summary>
    14. public int PageSize { get; set; }
    15.  
    16. /// <summary>
    17. /// 當前頁面
    18. /// </summary>
    19. public int CurrentPageIndex { get; set; }
    20.  
    21. /// <summary>
    22. /// 獲得總頁數
    23. /// </summary>
    24. /// <returns>總頁數</returns>
    25. public int GetPageCount()
    26. {
    27. int totalPageCount;
    28. return totalPageCount = (int)Math.Ceiling((double)TotalSize / PageSize);
    29. }
    30. }

               

    3、導出excel2003格式

      NPOIHelper.TableToExcelForXLSAny(this.GetDataTable(), "excel2003導出");

         NPOIHelPer代碼幫助類代碼爲

      

    001. /// <summary>
    002. /// NPOIHelper類
    003. /// </summary>
    004. public class NPOIHelper
    005. {
    006. #region excel2003超過65535行數據用多個sheet處理
    007. /// <summary>
    008. /// 將DataTable數據導出到Excel文件中(xls) 最大支持65535行
    009. /// </summary>
    010. /// <param name="dt">數據源</param>
    011. /// <param name="excelName">導出文件名稱</param>
    012. public static void TableToExcelForXLSAny(DataTable dt, string excelName)
    013. {
    014. Stopwatch stopWacth = new Stopwatch();
    015. stopWacth.Start();// 開始計時器
    016. HSSFWorkbook hssfworkbook = new HSSFWorkbook();
    017. int rowCount = dt.Rows.Count;
    018. int sheetMaxRow = 65535;
    019.  
    020. //大於65535行數據
    021. if (rowCount > sheetMaxRow)
    022. {
    023. for (int k = 1; k <= rowCount / sheetMaxRow; k++)
    024. {
    025. ISheet sheet = hssfworkbook.CreateSheet(excelName + "_" + k);
    026. //表頭 
    027. IRow row = sheet.CreateRow(0);
    028. for (int i = 0; i < dt.Columns.Count; i++)
    029. {
    030. sheet.SetColumnWidth(i, 30 * 180);// 設置所在列的寬度
    031. ICell cell = row.CreateCell(i);
    032. cell.SetCellValue(dt.Columns[i].ColumnName);
    033. }
    034.  
    035. int m = 0;
    036. //數據 
    037. for (int i = (k - 1) * sheetMaxRow; i < k * sheetMaxRow; i++)
    038. {
    039. IRow row1 = sheet.CreateRow(m + 1);
    040. for (int j = 0; j < dt.Columns.Count; j++)
    041. {
    042. ICell cell = row1.CreateCell(j);
    043. cell.SetCellValue(dt.Rows[i][j].ToString());
    044. }
    045. m++;
    046. }
    047. }
    048.  
    049. if (rowCount % sheetMaxRow != 0)
    050. {
    051. ISheet sheet = hssfworkbook.CreateSheet(excelName + "_" + (rowCount / sheetMaxRow + 1));
    052. //表頭 
    053. IRow row = sheet.CreateRow(0);
    054. for (int i = 0; i < dt.Columns.Count; i++)
    055. {
    056. sheet.SetColumnWidth(i, 30 * 180);// 設置所在列的寬度
    057. ICell cell = row.CreateCell(i);
    058. cell.SetCellValue(dt.Columns[i].ColumnName);
    059. }
    060.  
    061. int m = 0;
    062.  
    063. //數據 
    064. for (int i = (rowCount / sheetMaxRow) * sheetMaxRow; i < rowCount; i++)
    065. {
    066.  
    067. IRow row1 = sheet.CreateRow(m + 1);
    068. for (int j = 0; j < dt.Columns.Count; j++)
    069. {
    070. ICell cell = row1.CreateCell(j);
    071. cell.SetCellValue(dt.Rows[i][j].ToString());
    072. }
    073. m++;
    074. }
    075. }
    076.  
    077. }
    078.  
    079. // 小於65536行  
    080. else
    081. {
    082. ISheet sheet = hssfworkbook.CreateSheet(excelName);
    083. //表頭 
    084. IRow row = sheet.CreateRow(0);
    085. for (int i = 0; i < dt.Columns.Count; i++)
    086. {
    087. sheet.SetColumnWidth(i, 30 * 180);// 設置所在列的寬度
    088. ICell cell = row.CreateCell(i);
    089. cell.SetCellValue(dt.Columns[i].ColumnName);
    090. }
    091.  
    092. //數據 
    093. for (int i = 0; i < dt.Rows.Count; i++)
    094. {
    095. IRow row1 = sheet.CreateRow(i + 1);
    096. for (int j = 0; j < dt.Columns.Count; j++)
    097. {
    098. ICell cell = row1.CreateCell(j);
    099. cell.SetCellValue(dt.Rows[i][j].ToString());
    100. }
    101. }
    102. }
    103.  
    104. System.Web.HttpContext curContext = System.Web.HttpContext.Current;
    105. curContext.Response.Clear();
    106. curContext.Response.ContentType = "application/x-excel";
    107. string filename = HttpUtility.UrlEncode(excelName + DateTime.Now.ToString("yyyyMMddHHmm") + ".xls");
    108. curContext.Response.AddHeader("Content-Disposition", "attachment;filename=" + filename);
    109. hssfworkbook.Write(curContext.Response.OutputStream);
    110. File.AppendAllText(curContext.Server.MapPath("/TestMinutes/TestResult.txt"), "\nNPOI獲得dataTable後導出數據速度:" + stopWacth.ElapsedMilliseconds.ToString()+"毫秒", System.Text.Encoding.UTF8);
    111. stopWacth.Stop();
    112. curContext.Response.End();
    113. }
    114. #endregion
    115.  
    116. #region Excel2003
    117. /// <summary> 
    118. /// 將Excel文件中的數據讀出到DataTable中(xls) 
    119. /// </summary> 
    120. /// <param name="file">文件路徑</param> 
    121. /// <returns>DataTable</returns> 
    122. public static DataTable ExcelToTableForXLS(string file)
    123. {
    124. DataTable dt = new DataTable();
    125. using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read))
    126. {
    127. HSSFWorkbook hssfworkbook = new HSSFWorkbook(fs);
    128. ISheet sheet = hssfworkbook.GetSheetAt(0);
    129.  
    130. //表頭 
    131. IRow header = sheet.GetRow(sheet.FirstRowNum);
    132. List<int> columns = new List<int>();
    133. for (int i = 0; i < header.LastCellNum; i++)
    134. {
    135. object obj = GetValueTypeForXLS(header.GetCell(i) as HSSFCell);
    136. if (obj == null || obj.ToString() == string.Empty)
    137. {
    138. dt.Columns.Add(new DataColumn("Columns" + i.ToString()));
    139. //continue; 
    140. }
    141. else
    142. dt.Columns.Add(new DataColumn(obj.ToString()));
    143. columns.Add(i);
    144. }
    145. //數據 
    146. for (int i = sheet.FirstRowNum + 1; i <= sheet.LastRowNum; i++)
    147. {
    148. DataRow dr = dt.NewRow();
    149. bool hasValue = false;
    150. foreach (int j in columns)
    151. {
    152. dr[j] = GetValueTypeForXLS(sheet.GetRow(i).GetCell(j) as HSSFCell);
    153. if (dr[j] != null && dr[j].ToString() != string.Empty)
    154. {
    155. hasValue = true;
    156. }
    157. }
    158. if (hasValue)
    159. {
    160. dt.Rows.Add(dr);
    161. }
    162. }
    163. }
    164.  
    165. return dt;
    166. }
    167.  
    168. /// <summary> 
    169. /// 將DataTable數據導出到Excel文件中(xls) 
    170. /// </summary> 
    171. /// <param name="dt">數據源</param> 
    172. /// <param name="excelName">excel名稱</param> 
    173. public static void TableToExcelForXLS(DataTable dt, string excelName)
    174. {
    175. HSSFWorkbook hssfworkbook = new HSSFWorkbook();
    176. ISheet sheet = hssfworkbook.CreateSheet("Test");
    177.  
    178. //表頭 
    179. IRow row = sheet.CreateRow(0);
    180. for (int i = 0; i < dt.Columns.Count; i++)
    181. {
    182. ICell cell = row.CreateCell(i);
    183. cell.SetCellValue(dt.Columns[i].ColumnName);
    184. }
    185.  
    186. //數據 
    187. for (int i = 0; i < dt.Rows.Count; i++)
    188. {
    189. IRow row1 = sheet.CreateRow(i + 1);
    190. for (int j = 0; j < dt.Columns.Count; j++)
    191. {
    192. ICell cell = row1.CreateCell(j);
    193. cell.SetCellValue(dt.Rows[i][j].ToString());
    194. }
    195. }
    196.  
    197. System.Web.HttpContext curContext = System.Web.HttpContext.Current;
    198. curContext.Response.Clear();
    199. curContext.Response.ContentType = "application/x-excel";
    200. string filename = HttpUtility.UrlEncode(excelName + DateTime.Now.ToString("yyyyMMddHHmm") + ".xls");
    201. curContext.Response.AddHeader("Content-Disposition", "attachment;filename=" + filename);
    202. hssfworkbook.Write(curContext.Response.OutputStream);
    203. curContext.Response.End();
    204. }
    205.  
    206. /// <summary> 
    207. /// 獲取單元格類型(xls) 
    208. /// </summary> 
    209. /// <param name="cell">單元格</param> 
    210. /// <returns>單元格類型</returns> 
    211. private static object GetValueTypeForXLS(HSSFCell cell)
    212. {
    213. if (cell == null)
    214. return null;
    215. switch (cell.CellType)
    216. {
    217. case CellType.BLANK: //BLANK: 
    218. return null;
    219. case CellType.BOOLEAN: //BOOLEAN: 
    220. return cell.BooleanCellValue;
    221. case CellType.NUMERIC: //NUMERIC: 
    222. return cell.NumericCellValue;
    223. case CellType.STRING: //STRING: 
    224. return cell.StringCellValue;
    225. case CellType.ERROR: //ERROR: 
    226. return cell.ErrorCellValue;
    227. case CellType.FORMULA: //FORMULA: 
    228. default:
    229. return "=" + cell.CellFormula;
    230. }
    231. }
    232. #endregion
    233.  
    234. #region Excel2007和簡單的Excel2010
    235. /// <summary> 
    236. /// 將Excel文件中的數據讀出到DataTable中(xlsx) 
    237. /// </summary> 
    238. /// <param name="file">文件路徑</param> 
    239. /// <returns>DataTable</returns> 
    240. public static DataTable ExcelToTableForXLSX(string file)
    241. {
    242. DataTable dt = new DataTable();
    243. using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read))
    244. {
    245. XSSFWorkbook xssfworkbook = new XSSFWorkbook(fs);
    246. ISheet sheet = xssfworkbook.GetSheetAt(0);
    247.  
    248. // 表頭 
    249. IRow header = sheet.GetRow(sheet.FirstRowNum);
    250. List<int> columns = new List<int>();
    251. for (int i = 0; i < header.LastCellNum; i++)
    252. {
    253. object obj = GetValueTypeForXLSX(header.GetCell(i) as XSSFCell);
    254. if (obj == null || obj.ToString() == string.Empty)
    255. {
    256. dt.Columns.Add(new DataColumn("Columns" + i.ToString()));
    257. // continue; 
    258. }
    259. else
    260. dt.Columns.Add(new DataColumn(obj.ToString()));
    261. columns.Add(i);
    262. }
    263.  
    264. // 數據 
    265. for (int i = sheet.FirstRowNum + 1; i <= sheet.LastRowNum; i++)
    266. {
    267. DataRow dr = dt.NewRow();
    268. bool hasValue = false;
    269. foreach (int j in columns)
    270. {
    271. dr[j] = GetValueTypeForXLSX(sheet.GetRow(i).GetCell(j) as XSSFCell);
    272. if (dr[j] != null && dr[j].ToString() != string.Empty)
    273. {
    274. hasValue = true;
    275. }
    276. }
    277. if (hasValue)
    278. {
    279. dt.Rows.Add(dr);
    280. }
    281. }
    282. }
    283.  
    284. return dt;
    285. }
    286.  
    287. /// <summary> 
    288. /// 將DataTable數據導出到Excel文件中(xlsx) 
    289. /// </summary> 
    290. /// <param name="dt">數據源</param> 
    291. /// <param name="excelName">文件名稱</param> 
    292. public static void TableToExcelForXLSX(DataTable dt, string excelName)
    293. {
    294. XSSFWorkbook xssfworkbook = new XSSFWorkbook();
    295. ISheet sheet = xssfworkbook.CreateSheet("Test");
    296.  
    297. //表頭 
    298. IRow row = sheet.CreateRow(0);
    299. for (int i = 0; i < dt.Columns.Count; i++)
    300. {
    301. ICell cell = row.CreateCell(i);
    302. cell.SetCellValue(dt.Columns[i].ColumnName);
    303. }
    304.  
    305. //數據 
    306. for (int i = 0; i < dt.Rows.Count; i++)
    307. {
    308. IRow row1 = sheet.CreateRow(i + 1);
    309. for (int j = 0; j < dt.Columns.Count; j++)
    310. {
    311. ICell cell = row1.CreateCell(j);
    312. cell.SetCellValue(dt.Rows[i][j].ToString());
    313. }
    314. }
    315.  
    316. System.Web.HttpContext curContext = System.Web.HttpContext.Current;
    317. curContext.Response.Clear();
    318. curContext.Response.ContentType = "application/x-excel";
    319. string filename = HttpUtility.UrlEncode(excelName + DateTime.Now.ToString("yyyyMMddHHmm") + ".xlsx");
    320. curContext.Response.AddHeader("Content-Disposition", "attachment;filename=" + filename);
    321. xssfworkbook.Write(curContext.Response.OutputStream);
    322. curContext.Response.End();
    323. }
    324.  
    325. /// <summary> 
    326. /// 獲取單元格類型(xlsx) 
    327. /// </summary> 
    328. /// <param name="cell">單元格</param> 
    329. /// <returns>單元格類型</returns> 
    330. private static object GetValueTypeForXLSX(XSSFCell cell)
    331. {
    332. if (cell == null)
    333. return null;
    334. switch (cell.CellType)
    335. {
    336. case CellType.BLANK: //BLANK: 
    337. return null;
    338. case CellType.BOOLEAN: //BOOLEAN: 
    339. return cell.BooleanCellValue;
    340. case CellType.NUMERIC: //NUMERIC: 
    341. return cell.NumericCellValue;
    342. case CellType.STRING: //STRING: 
    343. return cell.StringCellValue;
    344. case CellType.ERROR: //ERROR: 
    345. return cell.ErrorCellValue;
    346. case CellType.FORMULA: //FORMULA: 
    347. default:
    348. return "=" + cell.CellFormula;
    349. }
    350. }
    351. #endregion
    352. }

         TableToExcelForXLSAny方法中第一個參數爲DataTable,第二個參數爲報表名稱 ,調用此方法時,因爲excel2003每一個sheet最多支持65535行數據,若是導出的數據量大於65535行時,會分爲多個sheet。

    4、導出excel2007格式

                NPOIHelper.TableToExcelForXLSX(this.GetDataTable(), "excel2007或者excel2010導出");

         TableToExcelForXLSX方法中第一個參數爲DataTable,第二個參數爲報表名稱 

    5、將excel2003導入到DataTable

            DataTable dt = NPOIHelper.ExcelToTableForXLS(Server.MapPath("/TestFile/excel2003導入.xls"));

          ExcelToTableForXLS中的參數爲導入文件的物理路徑

    6、將excel2007導入到DataTable

        DataTable dt = NPOIHelper.ExcelToTableForXLSX(Server.MapPath("/TestFile/excel2007或者excel2010導入.xlsx"));

        ExcelToTableForXLSX中的參數爲導入文件的物理路徑

    2.6 其餘導出幫助類代碼

              CSV導出幫助類代碼

    01. 1 /// <summary>
    02. 2     /// CSVHelper類
    03. 3     /// </summary>
    04. 4     public class CSVHelper
    05. 5     {
    06. 6         /// <summary>
    07. 7         /// 導出CSV格式
    08. 8         /// </summary>
    09. 9         /// <param name="dt">數據源</param>
    10. 10         /// <param name="FileName">保存的文件名稱</param>
    11. 11         public static void DataTableToCSV(DataTable dt, string FileName)
    12. 12         {
    13. 13             Stopwatch stopWacth = new Stopwatch();
    14. 14             stopWacth.Start();// 開始計時器
    15. 15             StringWriter sw = new StringWriter();
    16. 16             StringBuilder sb = new StringBuilder();
    17. 17
    18. 18             //獲得列名
    19. 19             for (int i = 0; i < dt.Columns.Count; i++)
    20. 20             {
    21. 21                 sb.Append(dt.Columns[i].ColumnName);
    22. 22                 if (i != dt.Columns.Count - 1)
    23. 23                 {
    24. 24                     sb.Append(",");
    25. 25                 }
    26. 26             }
    27. 27             sw.WriteLine(sb.ToString());
    28. 28
    29. 29             //獲得每列的數據
    30. 30             foreach (DataRow dr in dt.Rows)
    31. 31             {
    32. 32                 for (int i = 0; i < dt.Columns.Count; i++)
    33. 33                 {
    34. 34                     sw.Write(dr[i]);
    35. 35                     if (i != dt.Columns.Count - 1)
    36. 36                     {
    37. 37                         sw.Write(",");
    38. 38                     }
    39. 39                 }
    40. 40
    41. 41                 sw.WriteLine("");
    42. 42             }
    43. 43
    44. 44             sw.Close();
    45. 45             System.Web.HttpContext curContext = System.Web.HttpContext.Current;
    46. 46             curContext.Response.Clear();
    47. 47             curContext.Response.AddHeader("Content-Disposition", "attachment; filename=" + curContext.Server.UrlEncode(FileName) + ".csv");
    48. 48             curContext.Response.ContentType = "application/ms-excel";
    49. 49             curContext.Response.ContentEncoding = System.Text.Encoding.Default; // 採用默認編碼輸出
    50. 50             curContext.Response.Write(sw);
    51. 51             File.AppendAllText(curContext.Server.MapPath("/TestMinutes/TestResult.txt"), "\nCSV獲得dataTable後導出數據速度:"+stopWacth.ElapsedMilliseconds.ToString()+"毫秒", System.Text.Encoding.UTF8);
    52. 52             stopWacth.Stop();
    53. 53             curContext.Response.End();
    54. 54         }
    55. 55     }

    2.6 附加說明

     CSVNPOI的比較

     CSV文件簡單說明:

      每條記錄佔一行

      以逗號爲分隔符

      逗號先後的空格會被忽略

      字段中包含有逗號,該字段必須用雙引號括起來

      字段中包含有換行符,該字段必須用雙引號括起來

      字段先後包含有空格,該字段必須用雙引號括起來

      字段中的雙引號用兩個雙引號表示

      字段中若是有雙引號,該字段必須用雙引號括起來

      字段中若是有太長的數字,該字段必須單引號括起來

      日期格式不用作特殊處理

      第一條記錄,能夠是字段名      

     CSV優勢:

      CSV格式的文件其實導出的是文本格式的文件,此種格式的文件優勢導出方便並且比NPOI速度快。

    CSV缺點:

      使用者用excel對數據進行分析後須要對數據進行從新存一份。

相關文章
相關標籤/搜索