DataGrid的数据导入到Excel或CSV
这几天一直在给我姐姐公司的开发一个新的软件,方便他们使用。这个软件使用C#+Sql Server建设的,基本上算是完成了,但是今天他们提出了一个功能数据的导出功能,我在网上搜索了一下,再CodePorject发现了RKLib的导入导出的源码。
在导出中文数据时,出现了乱码,大致看了一下估计是数据写入的时候得编码问题,所以就想到了编码更改。所以就更改了一个代码,结果果然实现了支持的中文的导出。
RKLib.Export源码:
// ---------------------------------------------------------
// Rama Krishnas 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 DataSets 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 datasets 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、此代码在执行数据导出时,速度比较慢。我想在下一个版本中,使用我没有以前没有使用过的多线程操作,也许这样可以更改一下速度。(每次工程都要对自己提出挑战)
请确认安装好Excel2013,如何安装Excel2013请自行上网搜索。 Excel2013下载网盘链接: https://pan.baidu.com/s/1MdF2pTxlJqZMqILcW2PeBA 密码: rxuv 这个安装包中有破解软件KMSpico,当中有使用说明..txt,请阅读后安装软件,关键点是要用管理员权限操作。
相关文章
- Excel表格复制到word中
- Pandas指定样式保存excel数据的N种姿势
- Excel应用程序如何创建数据透视表
- java - poi - excel导入无法获取正确行数 getLastRowNum() - getPhysicalNumberOfRows() 不正确的原因
- 根据要求合并excel表格中数据
- .NET操作Excel高效低内存的开源框架 - MiniExcel
- 【Excel】+根据指定字符截取数据
- 【Excel】+数据合并(TEXTJOIN)
- 使用OpenXML将Excel内容读取到DataTable中
- 数据库导入Excel数据的简易方法
- 《数据分析实战 基于EXCEL和SPSS系列工具的实践》一1.3 数据分析的几大抓手
- 微软免费RPA工具Power Automate Desktop教程之 实现Excel自动化的10步指南
- Excel VLOOKUP实用教程之 04 vlookup如何实现三变量查找,三个条件字段查询数据?(教程含数据excel)
- Excel VLOOKUP实用教程之 03 使用下拉列表作为查找值vlookup?(教程含数据excel)
- 为何要使用SQL管理公司数据, Excel 可能无法满足公司所有数据需求的 6 大原因
- 在 Excel 中使用正则表达式进行查找与替换
- EXCEL-REPLACE()替换字符串最后几位 删除字符串最后几位
- Excel-转换单元格格式的函数或“方法”汇总
- Unity 之 Excel表格转换为Unity用的文件格式 -- ScriptableObject,Json,XML 全部搞定
- mysql中数据导出成excel文件语句
- VBA在Excel中的应用(一):改变符合条件单元格的背景颜色
- Matlab 操作 Excel 复制 Sheet、添加单元格批注
- [Excel知识技能] Txt文件数据批量导入Excel