DataView中数据生成Excel方案(转)

正文:

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

二、具体代码。

 

 

 

 

 

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,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

{

       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文档

posted @ 2012-09-12 00:10  为乐而来  阅读(404)  评论(0编辑  收藏  举报