前言: 前几天一同事问我如何利用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文档,我执行后的 结
|