王朝网络
分享
 
 
 

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

王朝c#·作者佚名  2006-01-09
宽屏版  字体: |||超大  

前言:

前几天一同事问我如何利用C#将数据导到Excel文件当中,当时比较忙没有

顾得上去研究,今天特地研究了一下,基本搞定,下面就具体介绍如何将

DataView中的数据按照一定格式存到Excel文件当中。

正文:

一、首先要引用一个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

一点说明:这段代码的前半部分读过我那篇《一种快速存取订阅条目的方

案》的读者应该认得的,其实也就是一个把集合类中数据填充到

DataView中的过程,后面的就是调用。Sample.xls是个新建的空的

Sample.xls,然后执行完毕后,就会生成Test.xls文档,我执行后的

结果如下图:

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有