C#里面操作Excel 挺复杂的

前言:
前几天一同事问我如何利用C#将数据导到Excel文件当中,当时比较忙没有
顾得上去研究,今天特地研究了一下,基本搞定,下面就具体介绍如何将
DataView中的数据按照一定格式存到Excel文件当中。
正文:
一、首先要引用一个Excel的组件,我一开始是在Office XP下尝试的,不
成功,后来把XP给干掉,装2k,就成功了,所以这里分享的是Office 2k下
引用相关组件来实现功能的,在工程中引用COM标签中的Microsoft
Excel 9.0 Object Library,添加成功后,引用中会多出三个引用项:
Excel、Office、VBIDE。

 
引用Excel组件
 
 
二、具体代码。
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
}

}
posted @ 2006-10-26 15:34  小y  阅读(988)  评论(0编辑  收藏  举报