• 1、引言

    1.1解决哪些问题

        现在很多公司用的导出基本上采用的通过gridView导出excel,此种导出存在以下几种问题

       1、数据量大的时候有时导出有时会让浏览器卡死,因为导出的excel不是真正的excel,是html格式的,只是用excel打开,查看方式只需用记事本或其他文本编辑器打开就行了。

       2、 由于导出的是html,用excel打开,会出现以下两个问题:1、所以导出的数据都会弹出一个提示框,“您尝试打开的文件的格式与文件扩展名指定 格式不一致,打开文件前请验证文件没有损坏且来源可信”的对话框2、当修改里面的内容时只能保存一个副本操作及其不方便。3、而且html格式的文档导入 也会存在很大的问题。

    1.2未解决的问题

        1、NPOI导出2007格式和2010格式的很慢,几万数据很可能会卡死。

    2、 NPOI

    2. 1 NPOI简介

    NPOI 是 POI 项目的 .NET 版本。POI是一个开源的Java读写Excel、WORD等微软OLE2组件文档的项目。

    使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写。NPOI是构建在POI 3.x版本之上的,它可以在没有安装Office的情况下对      Word/Excel文档进行读写操作

    2.2 NPOI优势

    (一)传统操作Excel遇到的问题:

    1、如果是.NET,需要在服务器端装Office,且及时更新它,以防漏洞,还需要设定权限允许.NET访问COM+,如果在导出过程中出问题可能导致服务器宕机。

    2、Excel会把只包含数字的列进行类型转换,本来是文本型的,Excel会将其转成数值型的,比如编号000123会变成123。

    3、导出时,如果字段内容以“-”或“=”开头,Excel会把它当成公式进行,会报错。

    4、Excel会根据Excel文件前8行分析数据类型,如果正好你前8行某一列只是数字,那它会认为该列为数值型,自动将该列转变成类似1.42702E+17格式,日期列变成包含日期和数字的。

    5、第二种是直接导出html,修改后缀名为.xls,这个方法有点像骗人的把戏,而且不能再导入

    6、第三种是使用Jet OLEDB引擎来进行导入导出,完全使用sql语句来进行操作,缺点能控制的东西非常有限,比如格式就难以控制

    7、第四中CSV格式的文件其实导出的是文本格式的文件,此种格式的文件优点导出方便而且速度快。但是使用者用excel对数据进行分析后需要对数据进行重新存一份。

    (二)使用NPOI的优势

    1、你不需要在服务器上安装微软的Office,可以避免版权问题。

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

    3、你不用去花大力气维护NPOI,NPOI Team会不断更新、改善NPOI,绝对省成本。

    NPOI之所以强大,并不是因为它支持导出Excel,而是因为它支持导入Excel,并能“理解”OLE2文档结构,这也是其他一些Excel读写库比 较弱的方面。通常,读入并理解结构 远比导出来得复杂,因为导入你必须假设一切情况都是可能的,而生成你只要保证满足你自己需求就可以了,如果把导入需求 和生成需求比做两个集合,那么生成需求通常都是导入需求的子集,这一规律不仅体现在Excel读写库中,也体现在pdf读写库中,目前市面上大部分的 pdf库仅支持生成,不支持导入。

    4、支持excel07格式和简单的10格式的导入导出

    5、支持图片的导入导出

    6、导入导出速度很快

    2.3 NPOI组件构成

    NPOI 2.01,当是.net2.0框架时提供以下使用的dll和配置文件。  

      1、 ICSharpCode.SharpZipLib.dll

      2、 NPOI.dll

      3、 NPOI.OOXML.dll

      4、 NPOI.OpenXml4Net.dll

      5、 NPOI.OpenXml4Net.dll.config

      6、 NPOI.OpenXmlFormats.dll

      7、 NPOI.XML

      如果是.net 3.5框架时提供以下使用的dll和配置文件

      1、 ICSharpCode.SharpZipLib.dll

      2、 NPOI.dll

      3、 NPOI.OOXML.dll

      4、 NPOI.OpenXml4Net.dll

      5、 NPOI.OpenXml4Net.dll.config

      6、 NPOI.OpenXmlFormats.dll

      7、 NPOI.XML

      如果是.net 4.0框架时提供以下使用的dll和配置文件

      1、 ICSharpCode.SharpZipLib.dll

      2、 NPOI.dll

      3、 NPOI.OOXML.dll

      4、 NPOI.OpenXml4Net.dll

      5、 NPOI.OpenXmlFormats.dll

      6、 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格式读写库,这是用户用的最多的命名空间

      2、NPOI.OOXML中包含的模块

      NPOI.XSSF Excel 2007操作库,大部分对象都实现了NPOI.SS的接口

      NPOI.XWPF Word 2007操作库

      3、NPOI.OpenXml4Net.DLL中包含的模块

      只有一个,即NPOI.OpenXml4Net,它是从POI的子项目OpenXml4j移植过来的,其功能类似于NPOI.POIFS,只是 它操作的是OOXML格式。这个模块和微软提供的      System.Packaging功能是一致的,只是System.Packaging支 持.Net 3.0以上,这个支持.NET 2.0。

      4、NPOI.OpenXmlFormats.DLL中包含的模块

      也只有一个,即OpenXmlFormats,它定义了所有OOXML对象和C#对象的映射关系,并协助进行序列化和反序列化,从而使文件读写层和逻辑层分离。

    2.4.3 使用操作

      1、取数据操作,由于导出的数据量很大,不能一次将数据取到内存中,需要分配的将数据取到内存中

           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对数据进行分析后需要对数据进行重新存一份。

[.Net] Excel导入导出各种方式分析的更多相关文章

  1. Excel导入导出各种方式分析

    1.引言 1.1解决哪些问题   现在很多公司用的导出基本上采用的通过gridView导出excel,此种导出存在以下几种问题 1.数据量大的时候有时导出有时会让浏览器卡死,因为导出的excel不是真 ...

  2. 利用反射实现通用的excel导入导出

    如果一个项目中存在多种信息的导入导出,为了简化代码,就需要用反射实现通用的excel导入导出 实例代码如下: 1.创建一个 Book类,并编写set和get方法 package com.bean; p ...

  3. Excel导入导出的业务进化场景及组件化的设计方案(上)

    1:前言 看过我文章的网友们都知道,通常前言都是我用来打酱油扯点闲情的. 自从写了上面一篇文章之后,领导就找我谈话了,怕我有什么想不开. 所以上一篇的(下)篇,目前先不出来了,哪天我异地二次回忆的时候 ...

  4. 关于Excel导入导出的用例设计

    目前,为方便操作,很多系统都会增加批量导入导出的功能.文件导入导出一般格式都是excel.由于用户直接在excel在填写内容,无法控制填写的格 式,加上excel解析比较困难,所以一般涉及到excel ...

  5. Mego(04) - NET简单实现EXCEL导入导出

    前言 相信做过信息系统的朋友都会遇到EXCEL导入导出的相关开发,做过不少EXCEL导入导出后总结起来大致有如下几种方式实现: ADO.NET的OldDb或ODBC连接EXCEL使用DataTable ...

  6. 土制Excel导入导出及相关问题探讨

    转载请注明出处https://www.cnblogs.com/funnyzpc/p/10392085.html 新的一年,又一个开始,不见收获,却见年龄,好一个猪年,待我先来一首里尔克的诗: < ...

  7. java jxl excel 导入导出的 总结(建立超链接,以及目录sheet的索引)

    最近项目要一个批量导出功能,而且要生成一个单独的sheet页,最后后面所有sheet的索引,并且可以点击进入连接.网上搜索了一下,找到一个方法,同时把相关的excel导入导出操作记录一下!以便以后使用 ...

  8. Java之POI的excel导入导出

    一.Apache POI是一种流行的API,它允许程序员使用Java程序创建,修改和显示MS Office文件.这由Apache软件基金会开发使用Java分布式设计或修改Microsoft Offic ...

  9. JAVA Excel导入导出

    --------------------------------------------方式一(新)-------------------------------------------------- ...

随机推荐

  1. C#屏蔽Alt+F4,解决Alt+F4关闭窗体时对话框NO后,线程不退出问题

    //1.将窗体的属性KeyPrieview设置为true //keypreview属性为true的时候,就可以响应键盘事件v //2.在窗体KeyDown事件中加如下代码 private void F ...

  2. MSP430之data type

  3. jq 禁用复选框 和输入框

    $('input').attr("readonly", ""); $('input').attr("disabled", "fal ...

  4. java 基础回顾1

    整理----加自己理解------网上参考----- java封装理念 一 概念: 隐藏对象的属性和实现细节,仅供对外提供公共访问方式. 二 好处 1)  将变量隔离 2)  便于使用 3)  提高重 ...

  5. [Java]链表的打印,反转与删除

    class Node{ public int value; public Node next=null; public Node(int value) { this.value=value; } }p ...

  6. CF1168B Good Triple 性质分析_好题

    题意翻译 给出01串s,求数对[l,r]个数,使得能找到至少一对[x,k],使1<=x,k<=|s|且l<=x<x+2k<=r且s[x]=s[x+k]=s[x+2k] 题 ...

  7. Day 20 python基础总复习

    一.计算机基础 1.1 计算机基础之编程 编程语言是人与计算机之间交流的介质 编程就是写一堆文件 编程为了奴隶计算机,解放劳动力 1.2 计算机组成原理 CPU 控制器:控制硬件 运算器:逻辑运算和算 ...

  8. JDBC对MySQL数据库存储过程的调用

    一.MySQL数据库存储过程: 1.什么是存储过程 存储过程(英文:Stored Procedure)是在大型数据库系统中,为了完成特定功能而编写的一组的SQL语句集.存储过程经编译存储在数据库中,用 ...

  9. [Ynoi2015]此时此刻的光辉

    题目大意: 给定一个序列,每次询问一段区间的数的乘积的约数个数. 解题思路: 在太阳西斜的这个世界里,置身天上之森.等这场战争结束之后,不归之人与望眼欲穿的众人, 人人本着正义之名,长存不灭的过去.逐 ...

  10. <a>标签中的href伪协议 标签: html 2016-12-24 22:38 365人阅读 评论(0)

    <a id="jsPswEdit" class="set-item" href="javascript:;">修改密码</ ...