C#操作EXCEL导出数据报表的类

using System;
using System.Diagnostics;
using System.Collections;
using System.Data;
using Excel;
namespace LTP.Common
{
/// <summary>
/// 操作EXCEL导出数据报表的类
/// </summary>
public class DataToExcel
{
   public DataToExcel()
   {   
   }
   

   #region 操作EXCEL的一个类(需要Excel.dll支持)
  
   private int titleColorindex=15;
   /// <summary>
   /// 标题背景色
   /// </summary>
   public int TitleColorIndex
   {
    set{titleColorindex=value;}
    get{return titleColorindex;}
   }

   private DateTime beforeTime;    //Excel启动之前时间
   private DateTime afterTime;     //Excel启动之后时间

   #region 创建一个Excel示例
   /// <summary>
   /// 创建一个Excel示例
   /// </summary>
   public void CreateExcel()
   {
    Excel.Application excel = new Excel.Application ( ) ;
    excel.Application.Workbooks.Add ( true ) ;
    excel.Cells[ 1 , 1 ] = "第1行第1列" ;
    excel.Cells[ 1 , 2 ] = "第1行第2列" ;
    excel.Cells[ 2 , 1 ] = "第2行第1列" ;
    excel.Cells[ 2 , 2 ] = "第2行第2列" ;
    excel.Cells[ 3 , 1 ] = "第3行第1列" ;
    excel.Cells[ 3 , 2 ] = "第3行第2列" ;
   
    //保存
    excel.ActiveWorkbook.SaveAs("./tt.xls",XlFileFormat.xlExcel9795,null,null,false,false,Excel.XlSaveAsAccessMode.xlNoChange,null,null,null,null,null);
    //打开显示
    excel.Visible = true ;   
//    excel.Quit();
//    excel=null;            
//    GC.Collect();//垃圾回收
   }
   #endregion

   #region 将DataTable的数据导出显示为报表
   /// <summary>
   /// 将DataTable的数据导出显示为报表
   /// </summary>
   /// <param name="dt">要导出的数据</param>
   /// <param name="strTitle">导出报表的标题</param>
   /// <param name="FilePath">保存文件的路径</param>
   /// <returns></returns>
   public string OutputExcel(System.Data.DataTable dt,string strTitle,string FilePath)
   {  
    beforeTime = DateTime.Now;

    Excel.Application excel;
    Excel._Workbook xBk;
    Excel._Worksheet xSt;

    int rowIndex=4;
    int colIndex=1;

    excel= new Excel.ApplicationClass();
    xBk = excel.Workbooks.Add(true);
    xSt = (Excel._Worksheet)xBk.ActiveSheet;

    //取得列标题   
    foreach(DataColumn col in dt.Columns)
    {
     colIndex++;
     excel.Cells[4,colIndex] = col.ColumnName;
    
     //设置标题格式为居中对齐
     xSt.get_Range(excel.Cells[4,colIndex],excel.Cells[4,colIndex]).Font.Bold =true;     
     xSt.get_Range(excel.Cells[4,colIndex],excel.Cells[4,colIndex]).HorizontalAlignment = Excel.XlVAlign.xlVAlignCenter;
     xSt.get_Range(excel.Cells[4,colIndex],excel.Cells[4,colIndex]).Select();
     xSt.get_Range(excel.Cells[4,colIndex],excel.Cells[4,colIndex]).Interior.ColorIndex = titleColorindex;//19;//设置为浅黄色,共计有56种
    }

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


    afterTime = DateTime.Now;

    //显示效果   
    //excel.Visible=true;   
    //excel.Sheets[0] = "sss";

    ClearFile(FilePath);
    string filename = DateTime.Now.ToString("yyyyMMddHHmmssff")+".xls";
    excel.ActiveWorkbook.SaveAs(FilePath+filename,Excel.XlFileFormat.xlExcel9795,null,null,false,false,Excel.XlSaveAsAccessMode.xlNoChange,null,null,null,null,null);
                        
    //wkbNew.SaveAs strBookName;
    //excel.Save(strExcelFileName);
   
    #region   结束Excel进程

    //需要对Excel的DCOM对象进行配置:dcomcnfg


    //excel.Quit();
    //excel=null;            

    xBk.Close(null,null,null);
    excel.Workbooks.Close();
    excel.Quit();
   

    //注意:这里用到的所有Excel对象都要执行这个操作,否则结束不了Excel进程
//    if(rng != null)
//    {
//     System.Runtime.InteropServices.Marshal.ReleaseComObject(rng);
//     rng = null;
//    }
//    if(tb != null)
//    {
//     System.Runtime.InteropServices.Marshal.ReleaseComObject(tb);
//     tb = null;
//    }
    if(xSt != null)
    {
     System.Runtime.InteropServices.Marshal.ReleaseComObject(xSt);
     xSt = null;
    }
    if(xBk != null)
    {
     System.Runtime.InteropServices.Marshal.ReleaseComObject(xBk);
     xBk = null;
    }
    if(excel != null)
    {
     System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);
     excel = null;
    }
    GC.Collect();//垃圾回收
    #endregion

    return filename;

   }
   #endregion

   #region Kill Excel进程

   /// <summary>
   /// 结束Excel进程
   /// </summary>
   public void KillExcelProcess()
   {
    Process[] myProcesses;
    DateTime startTime;
    myProcesses = Process.GetProcessesByName("Excel");

    //得不到Excel进程ID,暂时只能判断进程启动时间
    foreach(Process myProcess in myProcesses)
    {
     startTime = myProcess.StartTime;
     if(startTime > beforeTime && startTime < afterTime)
     {
      myProcess.Kill();
     }
    }
   }
   #endregion

   #endregion

  
   #region 将DataTable的数据导出显示为报表(不使用Excel对象,使用COM.Excel)
  
   #region 使用示例
   /*使用示例:
    * DataSet ds=(DataSet)Session["AdBrowseHitDayList"];
    string ExcelFolder=Assistant.GetConfigString("ExcelFolder");
    string FilePath=Server.MapPath(".")+"//"+ExcelFolder+"//";
   
    //生成列的中文对应表
    Hashtable nameList = new Hashtable();
    nameList.Add("ADID", "广告编码");
    nameList.Add("ADName", "广告名称");
    nameList.Add("year", "年");
    nameList.Add("month", "月");
    nameList.Add("browsum", "显示数");
    nameList.Add("hitsum", "点击数");
    nameList.Add("BrowsinglIP", "独立IP显示");
    nameList.Add("HitsinglIP", "独立IP点击");
    //利用excel对象
    DataToExcel dte=new DataToExcel();
    string filename="";
    try
    {   
     if(ds.Tables[0].Rows.Count>0)
     {
      filename=dte.DataExcel(ds.Tables[0],"标题",FilePath,nameList);
     }
    }
    catch
    {
     //dte.KillExcelProcess();
    }
   
    if(filename!="")
    {
     Response.Redirect(ExcelFolder+"//"+filename,true);
    }
    *
    * */

   #endregion
  
   /// <summary>
   /// 将DataTable的数据导出显示为报表(不使用Excel对象)
   /// </summary>
   /// <param name="dt">数据DataTable</param>
   /// <param name="strTitle">标题</param>
   /// <param name="FilePath">生成文件的路径</param>
   /// <param name="nameList"></param>
   /// <returns></returns>

   public string DataExcel(System.Data.DataTable dt,string strTitle,string FilePath,Hashtable nameList)
   {
    COM.Excel.cExcelFile excel = new COM.Excel.cExcelFile();
    ClearFile(FilePath);
    string filename = DateTime.Now.ToString("yyyyMMddHHmmssff")+".xls";
    excel.CreateFile(FilePath+filename);
    excel.PrintGridLines = false;

    COM.Excel.cExcelFile.MarginTypes mt1 = COM.Excel.cExcelFile.MarginTypes.xlsTopMargin;
    COM.Excel.cExcelFile.MarginTypes mt2 = COM.Excel.cExcelFile.MarginTypes.xlsLeftMargin;
    COM.Excel.cExcelFile.MarginTypes mt3 = COM.Excel.cExcelFile.MarginTypes.xlsRightMargin;
    COM.Excel.cExcelFile.MarginTypes mt4 = COM.Excel.cExcelFile.MarginTypes.xlsBottomMargin;
   
    double height = 1.5;
    excel.SetMargin(ref mt1, ref height);
    excel.SetMargin(ref mt2, ref height);
    excel.SetMargin(ref mt3, ref height);
    excel.SetMargin(ref mt4, ref height);

    COM.Excel.cExcelFile.FontFormatting ff = COM.Excel.cExcelFile.FontFormatting.xlsNoFormat;
    string font = "宋体";
    short fontsize = 9;
    excel.SetFont(ref font, ref fontsize,ref ff);

    byte b1 = 1,
     b2 = 12;
    short s3 = 12;
    excel.SetColumnWidth(ref b1,ref b2,ref s3);    

    string header = "页眉";
    string footer = "页脚";
    excel.SetHeader(ref header);
    excel.SetFooter(ref footer);


    COM.Excel.cExcelFile.ValueTypes vt = COM.Excel.cExcelFile.ValueTypes.xlsText;
    COM.Excel.cExcelFile.CellFont cf = COM.Excel.cExcelFile.CellFont.xlsFont0;
    COM.Excel.cExcelFile.CellAlignment ca = COM.Excel.cExcelFile.CellAlignment.xlsCentreAlign;
    COM.Excel.cExcelFile.CellHiddenLocked chl = COM.Excel.cExcelFile.CellHiddenLocked.xlsNormal;
   
    // 报表标题
    int cellformat = 1;
//    int rowindex = 1,colindex = 3;     
//    object title = (object)strTitle;
//    excel.WriteValue(ref vt, ref cf, ref ca, ref chl,ref rowindex,ref colindex,ref title,ref cellformat);

    int rowIndex=1;//起始行
    int colIndex=0;

     

    //取得列标题    
    foreach(DataColumn colhead in dt.Columns)
    {
     colIndex++;  
     string name=colhead.ColumnName.Trim();
     object namestr=(object)name;
     IDictionaryEnumerator Enum = nameList.GetEnumerator();
     while(Enum.MoveNext())
     {
      if(Enum.Key.ToString().Trim()==name)
      {
       namestr=Enum.Value;
      }
     }    
     excel.WriteValue(ref vt, ref cf, ref ca, ref chl,ref rowIndex,ref colIndex,ref namestr,ref cellformat);    
    }

    //取得表格中的数据   
    foreach(DataRow row in dt.Rows)
    {
     rowIndex ++;
     colIndex = 0;
     foreach(DataColumn col in dt.Columns)
     {
      colIndex ++;
      if(col.DataType == System.Type.GetType("System.DateTime"))
      {
       object str=(object)(Convert.ToDateTime(row[col.ColumnName].ToString())).ToString("yyyy-MM-dd");;  
       excel.WriteValue(ref vt, ref cf, ref ca, ref chl,ref rowIndex,ref colIndex,ref str,ref cellformat);
      }
      else      
      {
       object str=(object)row[col.ColumnName].ToString();
       excel.WriteValue(ref vt, ref cf, ref ca, ref chl,ref rowIndex,ref colIndex,ref str,ref cellformat);
      }
     }
    }
    int ret = excel.CloseFile();

//    if(ret!=0)
//    {
//     //MessageBox.Show(this,"Error!");
//    }
//    else
//    {
//     //MessageBox.Show(this,"请打开文件c://test.xls!");
//    }
    return filename;

   }

   #endregion
  

   #region   清理过时的Excel文件

   private void ClearFile(string FilePath)
   {
    String[] Files=System.IO.Directory.GetFiles(FilePath);
    if(Files.Length>10)
    {
     for(int i=0;i<10;i++)
     {
      try
      {
       System.IO.File.Delete(Files[i]);
      }
      catch
      {
      }

     }
    }
   }
   #endregion


}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值