DataGrid的数据导入到Excel或CSV

简介: 这几天一直在给我姐姐公司的开发一个新的软件,方便他们使用。这个软件使用C#+Sql Server建设的,基本上算是完成了,但是今天他们提出了一个功能数据的导出功能,我在网上搜索了一下,再CodePorject发现了RKLib的导入导出的源码。

这几天一直在给我姐姐公司的开发一个新的软件,方便他们使用。这个软件使用C#+Sql Server建设的,基本上算是完成了,但是今天他们提出了一个功能数据的导出功能,我在网上搜索了一下,再CodePorject发现了RKLib的导入导出的源码。

 

在导出中文数据时,出现了乱码,大致看了一下估计是数据写入的时候得编码问题,所以就想到了编码更改。所以就更改了一个代码,结果果然实现了支持的中文的导出。

RKLib.Export源码:

// ---------------------------------------------------------
// Rama Krishna's Export class
// Copyright (C) 2004 Rama Krishna. All rights reserved.
// ---------------------------------------------------------

# region Includes...

using System;
using System.Data;
using System.Web;
using System.Web.SessionState;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Xsl;
using System.Threading;

# endregion // Includes...

namespace LetBetter
{
 # region Summary

 /// <summary>
 /// Exports datatable to CSV or Excel format.
 /// This uses DataSet's XML features and XSLT for exporting.
 ///
 /// C#.Net Example to be used in WebForms
 /// -------------------------------------
 /// using MyLib.ExportData;
 ///
 /// private void btnExport_Click(object sender, System.EventArgs e)
 /// {
 ///   try
 ///   {
 ///     // Declarations
 ///     DataSet dsUsers =  ((DataSet) Session["dsUsers"]).Copy( );
 ///     MyLib.ExportData.Export oExport = new MyLib.ExportData.Export("Web");
 ///     string FileName = "UserList.csv";
 ///     int[] ColList = {2, 3, 4, 5, 6};
 ///     oExport.ExportDetails(dsUsers.Tables[0], ColList, Export.ExportFormat.CSV, FileName);
 ///   }
 ///   catch(Exception Ex)
 ///   {
 ///     lblError.Text = Ex.Message;
 ///   }
 /// } 
 /// 
 /// VB.Net Example to be used in WindowsForms
 /// -----------------------------------------
 /// Imports MyLib.ExportData
 ///
 /// Private Sub btnExport_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
 ///
 ///   Try 
 ///  
 ///     'Declarations
 ///  Dim dsUsers As DataSet = (CType(Session("dsUsers"), DataSet)).Copy()
 ///  Dim oExport As New MyLib.ExportData.Export("Win")
 ///  Dim FileName As String = "C://UserList.xls"
 ///  Dim ColList() As Integer = New Integer() {2, 3, 4, 5, 6}   
 ///     oExport.ExportDetails(dsUsers.Tables(0), ColList, Export.ExportFormat.CSV, FileName) 
 ///    
 ///   Catch Ex As Exception
 ///  lblError.Text = Ex.Message
 ///   End Try
 ///  
 /// End Sub
 ///    
 /// </summary>

 # endregion // Summary

 public class Export
 {  
  public enum ExportFormat : int {CSV = 1, Excel = 2}; // Export format enumeration   
  System.Web.HttpResponse response;
  private string appType; 
   
  public Export()
  {
   appType = "Web";
   response = System.Web.HttpContext.Current.Response;
  }

  public Export(string ApplicationType)
  {
   appType = ApplicationType;
   if(appType != "Web" && appType != "Win") throw new Exception("Provide valid application format (Web/Win)");
   if (appType == "Web") response = System.Web.HttpContext.Current.Response;
  }
  
  #region ExportDetails OverLoad : Type#1
  
  // Function  : ExportDetails
  // Arguments : DetailsTable, FormatType, FileName
  // Purpose  : To get all the column headers in the datatable and
  //      exports in CSV / Excel format with all columns

  public void ExportDetails(DataTable DetailsTable, ExportFormat FormatType, string FileName)
  {
   try
   {    
    if(DetailsTable.Rows.Count == 0)
     throw new Exception("There are no details to export.");    
    
    // Create Dataset
    DataSet dsExport = new DataSet("Export");
    DataTable dtExport = DetailsTable.Copy();
    dtExport.TableName = "Values";
    dsExport.Tables.Add(dtExport); 
    
    // Getting Field Names
    string[] sHeaders = new string[dtExport.Columns.Count];
    string[] sFileds = new string[dtExport.Columns.Count];
    
    for (int i=0; i < dtExport.Columns.Count; i++)
    {
     sHeaders[i] = dtExport.Columns[i].ColumnName;
     sFileds[i] = dtExport.Columns[i].ColumnName;     
    }

    if(appType == "Web")
     Export_with_XSLT_Web(dsExport, sHeaders, sFileds, FormatType, FileName);
    else if(appType == "Win")
     Export_with_XSLT_Windows(dsExport, sHeaders, sFileds, FormatType, FileName);
   }   
   catch(Exception Ex)
   {
    throw Ex;
   }   
  }

  #endregion // ExportDetails OverLoad : Type#1

  #region ExportDetails OverLoad : Type#2

  // Function  : ExportDetails
  // Arguments : DetailsTable, ColumnList, FormatType, FileName  
  // Purpose  : To get the specified column headers in the datatable and
  //      exorts in CSV / Excel format with specified columns

  public void ExportDetails(DataTable DetailsTable, int[] ColumnList, ExportFormat FormatType, string FileName)
  {
   try
   {
    if(DetailsTable.Rows.Count == 0)
     throw new Exception("There are no details to export");
    
    // Create Dataset
    DataSet dsExport = new DataSet("Export");
    DataTable dtExport = DetailsTable.Copy();
    dtExport.TableName = "Values";
    dsExport.Tables.Add(dtExport);

    if(ColumnList.Length > dtExport.Columns.Count)
     throw new Exception("ExportColumn List should not exceed Total Columns");
    
    // Getting Field Names
    string[] sHeaders = new string[ColumnList.Length];
    string[] sFileds = new string[ColumnList.Length];
    
    for (int i=0; i < ColumnList.Length; i++)
    {
     if((ColumnList[i] < 0) || (ColumnList[i] >= dtExport.Columns.Count))
      throw new Exception("ExportColumn Number should not exceed Total Columns Range");
     
     sHeaders[i] = dtExport.Columns[ColumnList[i]].ColumnName;
     sFileds[i] = dtExport.Columns[ColumnList[i]].ColumnName;     
    }

    if(appType == "Web")
     Export_with_XSLT_Web(dsExport, sHeaders, sFileds, FormatType, FileName);
    else if(appType == "Win")
     Export_with_XSLT_Windows(dsExport, sHeaders, sFileds, FormatType, FileName);
   }   
   catch(Exception Ex)
   {
    throw Ex;
   }   
  }
  
  #endregion // ExportDetails OverLoad : Type#2

  #region ExportDetails OverLoad : Type#3

  // Function  : ExportDetails
  // Arguments : DetailsTable, ColumnList, Headers, FormatType, FileName 
  // Purpose  : To get the specified column headers in the datatable and 
  //      exorts in CSV / Excel format with specified columns and
  //      with specified headers

  public void ExportDetails(DataTable DetailsTable, int[] ColumnList, string[] Headers, ExportFormat FormatType,
   string FileName)
  {
   try
   {
    if(DetailsTable.Rows.Count == 0)
     throw new Exception("There are no details to export");
    
    // Create Dataset
    DataSet dsExport = new DataSet("Export");
    DataTable dtExport = DetailsTable.Copy();
    dtExport.TableName = "Values";
    dsExport.Tables.Add(dtExport);

    if(ColumnList.Length != Headers.Length)
     throw new Exception("ExportColumn List and Headers List should be of same length");
    else if(ColumnList.Length > dtExport.Columns.Count || Headers.Length > dtExport.Columns.Count)
     throw new Exception("ExportColumn List should not exceed Total Columns");
    
    // Getting Field Names
    string[] sFileds = new string[ColumnList.Length];
    
    for (int i=0; i < ColumnList.Length; i++)
    {
     if((ColumnList[i] < 0) || (ColumnList[i] >= dtExport.Columns.Count))
      throw new Exception("ExportColumn Number should not exceed Total Columns Range");
     
     sFileds[i] = dtExport.Columns[ColumnList[i]].ColumnName;     
    }

    if(appType == "Web")
     Export_with_XSLT_Web(dsExport, Headers, sFileds, FormatType, FileName);
    else if(appType == "Win")
     Export_with_XSLT_Windows(dsExport, Headers, sFileds, FormatType, FileName);
   }   
   catch(Exception Ex)
   {
    throw Ex;
   }   
  }
  
  #endregion // ExportDetails OverLoad : Type#3

  #region Export_with_XSLT_Web

  // Function  : Export_with_XSLT_Web
  // Arguments : dsExport, sHeaders, sFileds, FormatType, FileName
  // Purpose   : Exports dataset into CSV / Excel format

  private void Export_with_XSLT_Web(DataSet dsExport, string[] sHeaders, string[] sFileds, ExportFormat FormatType, string FileName)
  {
   try
   {    
    // Appending Headers
    response.Clear();
    response.Buffer= true;
    
    if(FormatType == ExportFormat.CSV)
    {
     response.ContentType = "text/csv";
     response.AppendHeader("content-disposition", "attachment; filename=" + FileName);
    }  
    else
    {
     response.ContentType = "application/vnd.ms-excel";
     response.AppendHeader("content-disposition", "attachment; filename=" + FileName);
    }

    // XSLT to use for transforming this dataset.      
    MemoryStream stream = new MemoryStream( );
    XmlTextWriter writer = new XmlTextWriter(stream, new System.Text.UnicodeEncoding());
    
    CreateStylesheet(writer, sHeaders, sFileds, FormatType);
    writer.Flush( );
    stream.Seek( 0, SeekOrigin.Begin);

    XmlDataDocument xmlDoc = new XmlDataDocument(dsExport);
    XslTransform xslTran = new XslTransform();    
    xslTran.Load(new XmlTextReader(stream), null, null);
        
    System.IO.StringWriter  sw = new System.IO.StringWriter();
    xslTran.Transform(xmlDoc, null, sw, null);
         
    //Writeout the Content    
    response.Write(sw.ToString());    
    sw.Close(); 
    writer.Close();
    stream.Close();   
    response.End();
   }
   catch(ThreadAbortException Ex)
   {
    string ErrMsg = Ex.Message;
   }
   catch(Exception Ex)
   {
    throw Ex;
   }
  }  
  
  #endregion // Export_with_XSLT

  #region Export_with_XSLT_Windows

  // Function  : Export_with_XSLT_Windows
  // Arguments : dsExport, sHeaders, sFileds, FormatType, FileName
  // Purpose   : Exports dataset into CSV / Excel format

  private void Export_with_XSLT_Windows(DataSet dsExport, string[] sHeaders, string[] sFileds, ExportFormat FormatType, string FileName)
  {
   try
   {    
    // XSLT to use for transforming this dataset.      
    MemoryStream stream = new MemoryStream( );
    XmlTextWriter writer = new XmlTextWriter(stream, System.Text.Encoding.GetEncoding("gb2312"));
    
    CreateStylesheet(writer, sHeaders, sFileds, FormatType);
    writer.Flush( );
    stream.Seek( 0, SeekOrigin.Begin);

    XmlDataDocument xmlDoc = new XmlDataDocument(dsExport);
    XslTransform xslTran = new XslTransform();    
    xslTran.Load(new XmlTextReader(stream), null, null);
        
    System.IO.StringWriter  sw = new System.IO.StringWriter();
    xslTran.Transform(xmlDoc, null, sw, null);
         
    //Writeout the Content         
//    StreamWriter strwriter =  new StreamWriter(FileName);
    StreamWriter strwriter=new StreamWriter(FileName,false,System.Text.Encoding.GetEncoding("gb2312"));
    strwriter.WriteLine(sw.ToString());
    strwriter.Close();
    
    sw.Close(); 
    writer.Close();
    stream.Close(); 
   }   
   catch(Exception Ex)
   {
    throw Ex;
   }
  }  
  
  #endregion // Export_with_XSLT

  #region CreateStylesheet

  // Function  : WriteStylesheet
  // Arguments : writer, sHeaders, sFileds, FormatType
  // Purpose   : Creates XSLT file to apply on dataset's XML file

  private void CreateStylesheet(XmlTextWriter writer, string[] sHeaders, string[] sFileds, ExportFormat FormatType)
  {
   try
   {
    // xsl:stylesheet
    string ns = "http://www.w3.org/1999/XSL/Transform"; 
    writer.Formatting = Formatting.Indented;
    writer.WriteStartDocument( );    
    writer.WriteStartElement("xsl","stylesheet",ns);
    writer.WriteAttributeString("version","1.0");
    writer.WriteStartElement("xsl:output");
    writer.WriteAttributeString("method","text");
    writer.WriteAttributeString("version","4.0");
    writer.WriteEndElement( );
    
    // xsl-template
    writer.WriteStartElement("xsl:template");
    writer.WriteAttributeString("match","/");

    // xsl:value-of for headers
    for(int i=0; i< sHeaders.Length; i++)
    {
     writer.WriteString("/"");
     writer.WriteStartElement("xsl:value-of");
     writer.WriteAttributeString("select", "'" + sHeaders[i] + "'");
     writer.WriteEndElement( ); // xsl:value-of
     writer.WriteString("/"");
     if (i != sFileds.Length - 1) writer.WriteString( (FormatType == ExportFormat.CSV ) ? "," : " " );
    }
        
    // xsl:for-each
    writer.WriteStartElement("xsl:for-each");
    writer.WriteAttributeString("select","Export/Values");
    writer.WriteString("/r/n");    
    
    // xsl:value-of for data fields
    for(int i=0; i< sFileds.Length; i++)
    {     
     writer.WriteString("/"");
     writer.WriteStartElement("xsl:value-of");
     writer.WriteAttributeString("select", sFileds[i]);
     writer.WriteEndElement( ); // xsl:value-of
     writer.WriteString("/"");
     if (i != sFileds.Length - 1) writer.WriteString( (FormatType == ExportFormat.CSV ) ? "," : " " );
    }
        
    writer.WriteEndElement( ); // xsl:for-each
    writer.WriteEndElement( ); // xsl-template
    writer.WriteEndElement( ); // xsl:stylesheet
    writer.WriteEndDocument( ); 
   }
   catch(Exception Ex)
   {
    throw Ex;
   }
  }
  
  #endregion // WriteStylesheet  
 }
       
}

 

在winform下的工程,如果需要中文支持,只需要更改一行代码即可:

将Export_with_XSLT_Windows函数中的:

StreamWriter strwriter =  new StreamWriter(FileName);

更改为:
    StreamWriter strwriter=new StreamWriter(FileName,false,System.Text.Encoding.GetEncoding("gb2312"));

即可。

嘿嘿,很简单吧!

不过需要注意的是:

1、在使用此代码时,需要在工程中添加对System.Web的引用;

2、此代码在执行数据导出时,速度比较慢。我想在下一个版本中,使用我没有以前没有使用过的多线程操作,也许这样可以更改一下速度。(每次工程都要对自己提出挑战)


目录
相关文章
|
8月前
|
Python
如何根据Excel某列数据为依据分成一个新的工作表
在处理Excel数据时,我们常需要根据列值将数据分到不同的工作表或文件中。本文通过Python和VBA两种方法实现该操作:使用Python的`pandas`库按年级拆分为多个文件,再通过VBA宏按班级生成新的工作表,帮助高效整理复杂数据。
|
8月前
|
数据采集 数据可视化 数据挖掘
用 Excel+Power Query 做电商数据分析:从 “每天加班整理数据” 到 “一键生成报表” 的配置教程
在电商运营中,数据是增长的关键驱动力。然而,传统的手工数据处理方式效率低下,耗费大量时间且易出错。本文介绍如何利用 Excel 中的 Power Query 工具,自动化完成电商数据的采集、清洗与分析,大幅提升数据处理效率。通过某美妆电商的实战案例,详细拆解从多平台数据整合到可视化报表生成的全流程,帮助电商从业者摆脱繁琐操作,聚焦业务增长,实现数据驱动的高效运营。
|
10月前
|
存储 安全 大数据
网安工程师必看!AiPy解决fscan扫描数据整理难题—多种信息快速分拣+Excel结构化存储方案
作为一名安全测试工程师,分析fscan扫描结果曾是繁琐的手动活:从海量日志中提取开放端口、漏洞信息和主机数据,耗时又易错。但现在,借助AiPy开发的GUI解析工具,只需喝杯奶茶的时间,即可将[PORT]、[SERVICE]、[VULN]、[HOST]等关键信息智能分类,并生成三份清晰的Excel报表。告别手动整理,大幅提升效率!在安全行业,工具党正碾压手动党。掌握AiPy,把时间留给真正的攻防实战!官网链接:https://www.aipyaipy.com,解锁更多用法!
|
6月前
|
SQL 关系型数据库 MySQL
如何将Excel表的数据导入RDS MySQL数据库?
本文介绍如何通过数据管理服务DMS将Excel文件(转为CSV格式)导入RDS MySQL数据库,涵盖建表、编码设置、导入模式选择及审批执行流程,并提供操作示例与注意事项。
|
数据采集 数据可视化 数据挖掘
利用Python自动化处理Excel数据:从基础到进阶####
本文旨在为读者提供一个全面的指南,通过Python编程语言实现Excel数据的自动化处理。无论你是初学者还是有经验的开发者,本文都将帮助你掌握Pandas和openpyxl这两个强大的库,从而提升数据处理的效率和准确性。我们将从环境设置开始,逐步深入到数据读取、清洗、分析和可视化等各个环节,最终实现一个实际的自动化项目案例。 ####
2386 10
|
存储 数据挖掘 Java
csv和excel
【10月更文挑战第18天】csv和excel
971 5
|
数据采集 存储 JavaScript
自动化数据处理:使用Selenium与Excel打造的数据爬取管道
本文介绍了一种使用Selenium和Excel结合代理IP技术从WIPO品牌数据库(branddb.wipo.int)自动化爬取专利信息的方法。通过Selenium模拟用户操作,处理JavaScript动态加载页面,利用代理IP避免IP封禁,确保数据爬取稳定性和隐私性。爬取的数据将存储在Excel中,便于后续分析。此外,文章还详细介绍了Selenium的基本设置、代理IP配置及使用技巧,并探讨了未来可能采用的更多防反爬策略,以提升爬虫效率和稳定性。
839 4
|
8月前
|
Python
将Excel特定某列数据删除
将Excel特定某列数据删除
|
分布式计算 Hadoop 大数据
从Excel到Hadoop:数据规模的进化之路
从Excel到Hadoop:数据规模的进化之路
305 10
|
存储 Java easyexcel
招行面试:100万级别数据的Excel,如何秒级导入到数据库?
本文由40岁老架构师尼恩撰写,分享了应对招商银行Java后端面试绝命12题的经验。文章详细介绍了如何通过系统化准备,在面试中展示强大的技术实力。针对百万级数据的Excel导入难题,尼恩推荐使用阿里巴巴开源的EasyExcel框架,并结合高性能分片读取、Disruptor队列缓冲和高并发批量写入的架构方案,实现高效的数据处理。此外,文章还提供了完整的代码示例和配置说明,帮助读者快速掌握相关技能。建议读者参考《尼恩Java面试宝典PDF》进行系统化刷题,提升面试竞争力。关注公众号【技术自由圈】可获取更多技术资源和指导。