假导出Excel功能实现,按CSV格式快速导出功能代码参考(追求代码追求简洁复用)浙江杭州
2011-03-18 23:10 通用C#系统架构 阅读(7124) 评论(33) 编辑 收藏 举报我们辛苦录入的数据都希望能有重复利用的价值,一方面这些基础数据需要有数据库级的重复利用,程序级别的重复利用,另一方面还需要直接可以方便的导出倒入的功能比较好,虽然我们自己制作的统计分析功能很强大,但是还是没有Office Excel这么灵活强大,毕竟人家是世界级别的,我们的产品暂时还没能力能跟这个匹敌,这个是实话。
使用我们软件的客户经常需要有导出数据的实际工作需要,导出的数据功能的最重要的意图是数据能重复利用,辛辛苦苦录入了某一个系统中的数据无法重复利用,或者很难重复利用,那是很残忍的事情,是严重浪费生命的事情,我们尽量不要让客户折磨能重复利用的都重复利用。
在走火入魔C#.NET通用权限管理系统组件源码里,有一个假导出Excel功能,可供大家参考一下。具体实现功能如下:任何信息管理系统中,若有必要都做个导出功能比较好。
很多东西其实老早就发明了,但是真正普及都需要一个过程,100年前轿车就被发明了,到了100年后才普及得厉害,走火入魔C#.NET通用权限管理系统也一样被推广了3年左右,再过几年也会全国都普及了,大家都慢慢的认可了,就象论坛程序一个道理没几个人自己写了,直接买个现成的拿来用用就可以了,没几个SB会自己埋头苦干论坛程序了,通用权限到今天为止已经销售了200多套,未来的3年内,应该全国到处都会用这个来开发信息化管理系统,客户不会允许你瞎折腾了,浪费生命、搞得死去活来何必,直接拿过来用用配置一下,就完事了,省心省事。
中国有几亿农民,日子过得蛮苦的,美国可能只有几百万农民就可以了,应为他们都用工具大规模批量生成,我们国内有多少开发人员都在重复劳动?我做过的10年的路又会有 多少个人走过,跟我有同样想法的人,会有多过多少,他们可能都没能坚持,没我有毅力,不怕挨骂、不怕被拍砖头、不怕别人不购买、不怕当炮灰。
任何信息管理系统,都需要一个铜墙铁壁的经得起考验的权限配置管理工具、这个若是从头开始做,需要几年的时间完善,没必要生命浪费在这个上,每个10年以上工作经验的程序员,都能做出一个有重复利用价值的工具,我们的生产力就可以得到提高,社会就会进步。
导出数据功能是导出当前页面上的数据,全部导出是指所有的数据。
导出CVS时会遇到文件名乱码、文件乱码的问题,WEB里还会遇到直接打开还是另存为的问题等。
代码参考如下:
全部导出:
2 {
3 // 全部导出Excel
4 DataTable dataTable = ServiceManager.Instance.OrganizeService.GetDT(UserInfo);
5 dataTable.DefaultView.Sort = BaseOrganizeTable.FieldParentId + ", " + BaseOrganizeTable.FieldSortCode;
6 this.ExportExcel(this.grdOrganize, dataTable.DefaultView, @"\Modules\Export\", "组织机构.csv");
7 }
导出当前页面:
2 {
3 // 导出Excel
4 this.ExportExcel(this.grdOrganize, @"\Modules\Export\", "组织机构.csv");
5 }
2 /// <summary>
3 /// 检查文件是否存在
4 /// </summary>
5 /// <param name="fileName">文件名</param>
6 /// <returns>是否存在</returns>
7 private bool FileExist(string fileName)
8 {
9 if (System.IO.File.Exists(fileName))
10 {
11 string targetFileName = System.IO.Path.GetFileName(fileName);
12 if (MessageBox.Show(AppMessage.Format(AppMessage.MSG0236, targetFileName), AppMessage.MSG0000, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
13 {
14 System.IO.File.Delete(fileName);
15 }
16 else
17 {
18 return true;
19 }
20 }
21 return false;
22 }
23 #endregion
24
25 #region private void ExportExcel(DataGridView dataGridView, DataView dataView, string directory, string fileName) 导出Excel
26 /// <summary>
27 /// 导出Excel
28 /// </summary>
29 /// <param name="dataGridView">表格控件</param>
30 /// <param name="dataView">数据表格</param>
31 /// <param name="directory">目录</param>
32 /// <param name="fileName">文件名</param>
33 public void ExportExcel(DataGridView dataGridView, DataView dataView, string directory, string fileName)
34 {
35 // 开始忙了
36 this.Cursor = Cursors.WaitCursor;
37 string directoryName = BaseSystemInfo.StartupPath + directory;
38 if (!Directory.Exists(directoryName))
39 {
40 Directory.CreateDirectory(directoryName);
41 }
42 string file = BaseSystemInfo.StartupPath + directory + fileName;
43 if (!this.FileExist(file))
44 {
45 BaseExportCSV.ExportCSV(dataGridView, dataView, file);
46 Process.Start(file);
47 }
48 // 已经忙完了
49 this.Cursor = Cursors.Default;
50 }
51 #endregion
52
53 public void ExportExcel(DataGridView dataGridView, string directory, string fileName)
54 {
55 ExportExcel(dataGridView, (DataView)(dataGridView.DataSource), directory, fileName);
56 }
相关工具包的代码如下:
// All Rights Reserved , Copyright (C) 2011 , Hairihan TECH, Ltd.
//-------------------------------------------------------------------------------------
using System.Data;
using System.IO;
using System.Text;
using System.Web;
using System.Windows.Forms;
namespace DotNet.WinForm.Utilities
{
using DotNet.Utilities;
/// <summary>
/// BaseExportCSV
/// 导出CSV格式数据
///
/// 修改纪录
///
/// 2009.07.08 版本:3.0 JiRiGaLa 更新完善程序,将方法修改为静态方法。
/// 2007.08.11 版本:2.0 JiRiGaLa 更新完善程序。
/// 2006.12.01 版本:1.0 JiRiGaLa 新创建。
///
/// 版本:3.0
///
/// <author>
/// <name>JiRiGaLa</name>
/// <date>2009.07.08</date>
/// </author>
/// </summary>
public class BaseExportCSV
{
#region public static StringBuilder GetCSVFormatData(DataTable dataTable) 通过DataTable获得CSV格式数据
/// <summary>
/// 通过DataTable获得CSV格式数据
/// </summary>
/// <param name="dataTable">数据表</param>
/// <returns>CSV字符串数据</returns>
public static StringBuilder GetCSVFormatData(DataTable dataTable)
{
StringBuilder StringBuilder = new StringBuilder();
// 写出表头
foreach (DataColumn DataColumn in dataTable.Columns)
{
StringBuilder.Append(DataColumn.ColumnName.ToString() + ",");
}
StringBuilder.Append("\n");
// 写出数据
foreach (DataRowView dataRowView in dataTable.DefaultView)
{
foreach (DataColumn DataColumn in dataTable.Columns)
{
StringBuilder.Append(dataRowView[DataColumn.ColumnName].ToString() + ",");
}
StringBuilder.Append("\n");
}
return StringBuilder;
}
#endregion
#region public static StringBuilder GetCSVFormatData(DataSet dataSet) 通过DataSet获得CSV格式数据
/// <summary>
/// 通过DataSet获得CSV格式数据
/// </summary>
/// <param name="dataSet">数据集</param>
/// <returns>CSV字符串数据</returns>
public static StringBuilder GetCSVFormatData(DataSet dataSet)
{
StringBuilder StringBuilder = new StringBuilder();
foreach (DataTable dataTable in dataSet.Tables)
{
StringBuilder.Append(GetCSVFormatData(dataTable));
}
return StringBuilder;
}
#endregion
#region public static void ExportCSV(DataTable dataTable, string fileName) 导出CSV格式文件
/// <summary>
/// 导出CSV格式文件
/// </summary>
/// <param name="dataTable">数据表</param>
/// <param name="fileName">文件名</param>
public static void ExportCSV(DataTable dataTable, string fileName)
{
StreamWriter StreamWriter = new StreamWriter(fileName, false, System.Text.Encoding.GetEncoding("gb2312"));
StreamWriter.WriteLine(GetCSVFormatData(dataTable).ToString());
StreamWriter.Flush();
StreamWriter.Close();
}
#endregion
#region public static void ExportCSV(DataSet dataSet, string fileName) 导出CSV格式文件
/// <summary>
/// 导出CSV格式文件
/// </summary>
/// <param name="dataSet">数据集</param>
/// <param name="fileName">文件名</param>
public static void ExportCSV(DataSet dataSet, string fileName)
{
StreamWriter StreamWriter = new StreamWriter(fileName, false, System.Text.Encoding.GetEncoding("gb2312"));
StreamWriter.WriteLine(GetCSVFormatData(dataSet).ToString());
StreamWriter.Flush();
StreamWriter.Close();
}
#endregion
#region public static void ExportCSV(DataGridView dataGridView, string fileName) 导出CSV格式文件
/// <summary>
/// 导出CSV格式文件
/// </summary>
/// <param name="dataGridView">表格控件</param>
/// <param name="fileName">文件名</param>
public static void ExportCSV(DataGridView dataGridView, string fileName)
{
ExportCSV(dataGridView, (DataView)(dataGridView.DataSource), fileName);
}
#endregion
#region public static void ExportCSV(DataGridView dataGridView, DataView dataView, string fileName) 导出CSV格式文件
/// <summary>
/// 导出CSV格式文件
/// </summary>
/// <param name="dataGridView">表格控件</param>
/// <param name="dataView">数据表</param>
/// <param name="fileName">文件名</param>
public static void ExportCSV(DataGridView dataGridView, DataView dataView, string fileName)
{
StreamWriter streamWriter = new StreamWriter(fileName, false, System.Text.Encoding.GetEncoding("gb2312"));
StringBuilder stringBuilder = new StringBuilder();
// 写出表头
for (int i = 0; i < dataGridView.Columns.Count; i++)
{
if (dataGridView.Columns[i].Visible && (dataGridView.Columns[i].DataPropertyName.ToUpper() != BaseBusinessLogic.SelectedColumn.ToUpper()))
{
stringBuilder.Append(dataGridView.Columns[i].HeaderText + ",");
}
}
streamWriter.WriteLine(stringBuilder.ToString());
// 写出数据
foreach (DataRowView dataRowView in dataView)
{
stringBuilder = new StringBuilder();
for (int i = 0; i < dataGridView.Columns.Count; i++)
{
if (dataGridView.Columns[i].Visible && (dataGridView.Columns[i].DataPropertyName.ToUpper() != BaseBusinessLogic.SelectedColumn.ToUpper()))
{
stringBuilder.Append(dataRowView[dataGridView.Columns[i].DataPropertyName].ToString() + ",");
}
}
streamWriter.WriteLine(stringBuilder.ToString());
}
streamWriter.Flush();
streamWriter.Close();
}
#endregion
/*
#region public static void GetResponseCSV(DataTable dataTable, string fileName) 在浏览器中获得CSV格式文件
/// <summary>
/// 在浏览器中获得CSV格式文件
/// </summary>
/// <param name="dataTable">数据表</param>
/// <param name="fileName">输出文件名</param>
public static void GetResponseCSV(DataTable dataTable, string fileName)
{
HttpContext.Current.Response.ClearHeaders();
HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
HttpContext.Current.Response.AppendHeader("Content-disposition", "attachment;filename=" + fileName);
HttpContext.Current.Response.ContentType = "application/ms-excel";
HttpContext.Current.Response.Write(GetCSVFormatData(dataTable).ToString());
HttpContext.Current.Response.End();
}
#endregion
#region public static void GetResponseCSV(DataSet dataSet, string fileName) 在浏览器中获得CSV格式文件
/// <summary>
/// 在浏览器中获得CSV格式文件
/// </summary>
/// <param name="dataSet">数据集</param>
/// <param name="fileName">输出文件名</param>
public static void GetResponseCSV(DataSet dataSet, string fileName)
{
HttpContext.Current.Response.ClearHeaders();
HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
HttpContext.Current.Response.AppendHeader("Content-disposition", "attachment;filename=" + fileName);
HttpContext.Current.Response.ContentType = "application/ms-excel";
HttpContext.Current.Response.Write(GetCSVFormatData(dataSet).ToString());
HttpContext.Current.Response.End();
// 读取文件下载
//String OutTemplateCSV = Server.MapPath("~/DownLoadFiles/ExcelExport/Common/Log/LogGeneral.csv");
//StreamWriter StreamWriter = new StreamWriter(OutTemplateCSV, false, System.Text.Encoding.GetEncoding("gb2312"));
//StreamWriter.WriteLine(this.GetCSVFormatData(dataSet).ToString());
//StreamWriter.Flush();
//StreamWriter.Close();
//Response.Redirect("http://www.cnblogs.com/../DownLoadFiles/ExcelExport/Common/Log/LogGeneral.csv");
}
#endregion
*/
}
}