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

翻译|其它|编辑:郝浩|2007-08-22 10:03:05.000|阅读 1108 次

概述:

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

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

二、具体代码。
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 


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:csdn

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP