`
leonardleonard
  • 浏览: 799245 次
社区版块
存档分类
最新评论

从DataView中生成Excel报表的方案(C#)

阅读更多
正文:
一、首先要引用一个Excel的组件,我一开始是在Office XP下尝试的,不
成功,后来把XP给干掉,装2k,就成功了,所以这里分享的是Office 2k下
引用相关组件来实现功能的,在工程中引用COM标签中的Microsoft
Excel 9.0 Object Library,添加成功后,引用中会多出三个引用项:
Excel、Office、VBIDE。





二、具体代码。
using System;
using System.Data;
using Excel;
using System.IO;
namespace Test.ExcelCom
{
/// <summary>
/// 将DataView中的数据导入Excel文件中
/// 作者:Rexsp
/// 创建:2004-4-4
/// </summary>
public class OutputExcel
{
#region 私有成员
/// <summary>
/// 数据的DataView
/// </summary>
private DataView dv=null;
/// <summary>
/// 表格标题
/// </summary>
private string title=null;
/// <summary>
/// 输出文件路径
/// </summary>
private string outFilePath=null;
/// <summary>
/// 输入文件名
/// </summary>
private string inputFilePath=null;
#endregion
#region 公共属性
/// <summary>
/// 数据的DataView
/// </summary>
public DataView DV
{
set{dv=value;}
}
/// <summary>
/// 表格标题
/// </summary>
public string Title
{
set{title=value;}
get{return title;}
}
/// <summary>
/// 输出文件路径
/// </summary>
public string OutFilePath
{
set{outFilePath=value;}
get{return outFilePath;}
}
/// <summary>
/// 输入文件路径
/// </summary>
public string InputFilePath
{
set{inputFilePath=value;}
get{return inputFilePath;}
}
#endregion

#region 构造函数
public OutputExcel()
{
}
public OutputExcel(DataView dv,string title)
{
//
// TODO: 在此处添加构造函数逻辑
//
}
#endregion
#region 公共方法
public void CreateExcel()
{
int rowIndex=4;//行起始坐标
int colIndex=1;//列起始坐标
ApplicationClass myApp=null;
Workbook myBook=null;
Worksheet mySheet=null;
//如果文件不存在,则将模板文件拷贝一份作为输出文件
//这里如果通过File.Create来创建文件是不行的,因为xls
//的空文件也有固定的格式,跟文本不一样的,也许有其它
//通过程序直接生成excel的方法,大家可以尝试尝试的
if(!File.Exists(outFilePath))
{
File.Copy(inputFilePath,outFilePath,true);
}
myApp= new ApplicationClass();
myApp.Visible=false;
object oMissiong=System.Reflection.Missing.Value;
myApp.Workbooks.Open(outFilePath,oMissiong,oMissiong,oMissiong,oMissiong,
oMissiong,oMissiong,oMissiong,oMissiong,oMissiong,oMissiong,oMissiong,oMissiong);
myBook=myApp.Workbooks[1];
mySheet=(Worksheet)myBook.ActiveSheet;

//
//取得标题
//
foreach(DataColumn col in dv.Table.Columns)
{
colIndex++;
mySheet.Cells[4,colIndex] = col.ColumnName;
mySheet.get_Range(mySheet.Cells[4,colIndex],mySheet.Cells[4,colIndex]).HorizontalAlignment = XlVAlign.xlVAlignCenter;
//设置标题格式为居中对齐
}
//
//取得表格中的数据
//
foreach(DataRowView row in dv)
{
rowIndex ++;
colIndex = 1;
foreach(DataColumn col in dv.Table.Columns)
{
colIndex ++;
if(col.DataType == System.Type.GetType("System.DateTime"))
{
mySheet.Cells[rowIndex,colIndex] = (Convert.ToDateTime(row[col.ColumnName].ToString())).ToString("yyyy-MM-dd");
mySheet.get_Range(mySheet.Cells[rowIndex,colIndex],mySheet.Cells[rowIndex,colIndex]).HorizontalAlignment = XlVAlign.xlVAlignCenter;//设置日期型的字段格式为居中对齐
}
else
if(col.DataType == System.Type.GetType("System.String"))
{
mySheet.Cells[rowIndex,colIndex] = "'"+row[col.ColumnName].ToString();
mySheet.get_Range(mySheet.Cells[rowIndex,colIndex],mySheet.Cells[rowIndex,colIndex]).HorizontalAlignment = XlVAlign.xlVAlignCenter;//设置字符型的字段格式为居中对齐
}
else
{
mySheet.Cells[rowIndex,colIndex] = row[col.ColumnName].ToString();
}
}
}
//
//加载一个合计行
//
int rowSum = rowIndex + 1;
int colSum = 2;
mySheet.Cells[rowSum,2] = "合计";
mySheet.get_Range(mySheet.Cells[rowSum,2],mySheet.Cells[rowSum,2]).HorizontalAlignment = XlHAlign.xlHAlignCenter;
//
//设置选中的部分的颜色
//
mySheet.get_Range(mySheet.Cells[rowSum,colSum],mySheet.Cells[rowSum,colIndex]).Select();
mySheet.get_Range(mySheet.Cells[rowSum,colSum],mySheet.Cells[rowSum,colIndex]).Interior.ColorIndex = 19;//设置为浅黄色,共计有56种
//
//取得整个报表的标题
//
mySheet.Cells[2,2] = title;
//
//设置整个报表的标题格式
//
mySheet.get_Range(mySheet.Cells[2,2],mySheet.Cells[2,2]).Font.Bold = true;
mySheet.get_Range(mySheet.Cells[2,2],mySheet.Cells[2,2]).Font.Size = 22;
//
//设置报表表格为最适应宽度
//
mySheet.get_Range(mySheet.Cells[4,2],mySheet.Cells[rowSum,colIndex]).Select();
mySheet.get_Range(mySheet.Cells[4,2],mySheet.Cells[rowSum,colIndex]).Columns.AutoFit();
//
//设置整个报表的标题为跨列居中
//
mySheet.get_Range(mySheet.Cells[2,2],mySheet.Cells[2,colIndex]).Select();
mySheet.get_Range(mySheet.Cells[2,2],mySheet.Cells[2,colIndex]).HorizontalAlignment = XlHAlign.xlHAlignCenterAcrossSelection;
//
//绘制边框
//
mySheet.get_Range(mySheet.Cells[4,2],mySheet.Cells[rowSum,colIndex]).Borders.LineStyle = 1;
mySheet.get_Range(mySheet.Cells[4,2],mySheet.Cells[rowSum,2]).Borders[XlBordersIndex.xlEdgeLeft].Weight = XlBorderWeight.xlThick;//设置左边线加粗
mySheet.get_Range(mySheet.Cells[4,2],mySheet.Cells[4,colIndex]).Borders[XlBordersIndex.xlEdgeTop].Weight = XlBorderWeight.xlThick;//设置上边线加粗
mySheet.get_Range(mySheet.Cells[4,colIndex],mySheet.Cells[rowSum,colIndex]).Borders[XlBordersIndex.xlEdgeRight].Weight = XlBorderWeight.xlThick;//设置右边线加粗
mySheet.get_Range(mySheet.Cells[rowSum,2],mySheet.Cells[rowSum,colIndex]).Borders[XlBordersIndex.xlEdgeBottom].Weight = XlBorderWeight.xlThick;//设置下边线加粗
myBook.Save();;
myBook.Close( true,outFilePath,true);
System.Runtime.InteropServices.Marshal.ReleaseComObject(mySheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(myBook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(myApp);
GC.Collect();

}
#endregion
}

}
一点说明:操作Excel的时候,可能会发生Excel进程被锁定,无法退
出,解决方法是在保存完并关闭myBook(工作簿)后,别关闭Excel进
程(//myApp.Quit();)。这样的结果是服务器上始终有一个Excel的
进程。可能会出现asp_net用户操作Excel的权限不够,配置Dcom。运
行Dcomcnfg.exe,找到Excel应用程序,配置其属性,身份验证级别
选"无",身份标识选"交互式用户",安全性页面,启动和访问均给
everyone。注意:查看当前进程中是否有Winword进程存在,如果有且
不能被结束,那么重启动计算机。再次运行你的代码即OK。这样以后
就不会出现权限不够的情况了。
三、调用
#region 测试Excel
QuickItemCollection qic =new QuickItemCollection();
qic.GetAllInfo();
DataView dv= new DataView();
DataTable dt = new DataTable("Excel");
dt.Columns.Add("ID",System.Type.GetType("System.String"));
dt.Columns.Add("ItemName",System.Type.GetType("System.String"));
int qicCount=qic.Count;
for(int i=0;i<qicCount;i++)
{
DataRow dr= dt.NewRow();
dr[0] = qic[i].ID;
dr[1] = qic[i].ItemName;
dt.Rows.Add(dr);
}
OutputExcel ope = new OutputExcel();
ope.DV=dt.DefaultView;
ope.Title="测试生成Excel";
ope.InputFilePath=Server.MapPath("Sample.xls");
ope.OutFilePath=Server.MapPath("Test.xls");
ope.CreateExcel();
#endregion 
 
分享到:
评论

相关推荐

    C#将DataView生成Excel报表

    生成Excel报表的过程通常涉及以下步骤: 1. **连接数据库**:使用ADO.NET或其他数据库访问技术(如Entity Framework)建立与数据库的连接。例如,使用`SqlConnection`对象连接到SQL Server,编写SQL查询语句获取...

    C#操作EXCEL类

    在C#中,操作Excel是一项常见的任务,尤其在数据分析和报表生成方面。在这个场景中,开发者面临的问题是如何根据动态的数据生成美观且具有自定义图表的Excel报表。由于数据表的数量多,数据量大,以及分析字段的不固...

    C#+水晶报表的与报表打印功能

    4. **填充数据**:在C#代码中,通过CrystalReportViewer控件加载报表,并用DataSet或DataView对象填充报表的数据源。例如: ```csharp CrystalReport1 report = new CrystalReport1(); report.SetDataSource(ds);...

    xxx.zip_Excel 流_c#dataset excel_excel

    在IT行业中,尤其是在数据处理和报表...这种方式既高效又灵活,适用于各种需要动态生成Excel报表的场景。在实际项目中,你可能还需要考虑其他因素,如错误处理、样式设置、性能优化等,以确保程序的健壮性和用户体验。

    C#调用操作Excel的一个类

    在本文中,我们将深入探讨如何在C#中使用类来操作Excel文件,特别是在从数据库中读取数据并生成报表的场景下。首先,我们看到的类名为`OutputExcel`,它位于`LogicLayer`命名空间内。这个类的主要功能是将数据视图...

    C#运用水晶报表源码

    在IT行业中,水晶报表(Crystal Reports)是一款广泛应用于数据可视化和报表生成的工具,尤其在.NET框架下,如ASP.NET,它与C#语言结合得尤为紧密。本资源" C#运用水晶报表源码"提供了使用C#编程语言与水晶报表进行...

    C# 导出Excel的6种简单方法实现

    在C#编程中,将数据导出到Excel是常见的需求,尤其在数据分析、报表生成和数据交换场景下。本文将详细介绍六种简单的C#导出Excel的方法,包括数据表、对象集合、数据库、微软网格控件、数组以及CSV数据到Excel的转换...

    C#操作excel(菜鸟专用)

    在日常的软件开发工作中,经常需要处理 Excel 文件,尤其是在数据导出、报表生成等场景中。本篇文章将基于一个具体的 C# 类 `OutputExcel`,详细介绍如何利用 C# 来高效地操作 Excel 文件。 #### 一、类概述 `...

    jansen系列水晶报表教程之报表版调整

    在C#中,可以通过ReportParameter对象设置参数,并在运行时传递值。 4. 分组和排序:水晶报表允许根据特定字段进行数据分组,用户可以在设计时设置分组级别和分组表达式。同时,也可以设置排序规则,决定数据在报表...

    C_水晶报表使用(源代码)

    现在,我们转向C#中的水晶报表使用。在提供的源代码中,你可能会看到以下关键部分: 1. 创建报表对象:使用`CrystalDecisions.CrystalReports.Engine.ReportDocument`类创建报表对象,加载报表模板。 2. 设置数据...

    水晶报表的推模式源码-vs2005

    水晶报表(Crystal Reports)是一款强大的报表设计工具,广泛应用于企业级应用系统中,用于生成各类报表,包括数据统计、分析及展示。在Visual Studio 2005(VS2005)环境下,开发者可以利用水晶报表的推模式(Push ...

    C#水晶报

    **C# 水晶报表 (Crystal Reports) 在 ASP.NET 2.0 中的应用** 水晶报表(Crystal Reports)是一款强大的报告生成工具,尤其在.NET框架下,它为开发者提供了丰富的功能,用于创建、设计和展示复杂的业务报告。C#与...

    《Visual C# .NET精彩编程实例集锦》第6章下

    在C#中,这通常通过执行SQL查询并解析结果集来实现,使用DataTable或DataView对象来存储和处理结果。此外,可能还会涉及到Linq-to-SQL或Entity Framework,提供更高级的数据访问功能。 3. 实例125:如何使用水晶...

    C#编程经验技巧宝典

    58 &lt;br&gt;0081 文本中首字母改为大写 59 &lt;br&gt;0082 C#随机数的产生 59 &lt;br&gt;0083 身份证从15位升至18位算法 60 &lt;br&gt;0084 十进制数转二进制数的算法 60 &lt;br&gt;0085 十进制数转八进制数的算法 61...

    ActiveReports for .NET--灵活强大的.Net 报表制作控件

    数据源属性能在运行时修改,生成ad hoc(动态)报表 灵活的非绑定数据 预览和输出-容易显示 支持C#代码 小型部署程序集,适用于Internet 上使用 TOC/Bookmarks 超链接 输出过滤文件格式为RTF、PDF、...

    Active Report

    DataView,DataTable和任何IListSource 控件数据源属性能在运行时修改,生成ad hoc(动态)报表灵活的非绑定数据预览和输出-容易显示支持C#代码小型部署程序集,适用于Internet 上使用TOC/Bookmarks超链接输出过滤...

    asp.net 转换Access数据库为Excel文件源码

    在ASP.NET开发中,有时我们需要将数据从Access数据库导出到Excel文件,以便于数据分析、报表生成或与其他系统交换数据。这个"asp.net 转换Access数据库为Excel文件源码"提供了一种实现方式,尤其对于使用VB.NET作为...

Global site tag (gtag.js) - Google Analytics