14
2021
01

C#实现DataSet内数据转化为Excel和Word文件的通用类完整实例

本文实例讲述了C#实现DataSet内数据转化为Excel和Word文件的通用类。分享给大家供大家参考,具体如下:


前不久因为项目的需要写的一个C#把DataSet内数据转化为Excel和Word文件的通用类,这些关于Excel、Word的导出方法,基本可以实现日常须要,其中有些方法可以把数据导出后 生成Xml格式,再导入数据库!有些屏蔽内容没有去掉,保留下来方便学习参考用之。 最后请引用Office相应COM组件,导出Excel对象的一个方法要调用其中的一些方法和属性。


using System;

using System.Collections;

using System.ComponentModel;

using System.Data;

using System.Web;

using System.Web.SessionState;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.HtmlControls;

using System.IO;

using System.Windows.Forms;

using Microsoft.Office.Interop.Excel;

using Microsoft.Office.Interop.Word;

using Microsoft.Office.Core;

using OWC=Microsoft.Office.Interop;

using System.Reflection;

using System.Text;

namespace CaOnLine.ZWDB.DFObject

{

 /// <summary>

 /// ExportFiles 的摘要说明。

 /// 作用:把DataSet数据集内数据转化为Excel、Word文件

 /// 描述:这些关于Excel、Word的导出方法,基本可以实现日常须要,其中有些方法可以把数据导出后

 ///    生成Xml格式,再导入数据库!有些屏蔽内容没有去掉,保留下来方便学习参考用之。

 /// 备注:请引用Office相应COM组件,导出Excel对象的一个方法要调用其中的一些方法和属性。

 /// </summary>

 public class ExportFiles

 {

 /// <summary>

 ///

 /// </summary>

 ///

 #region //构造函数

 public ExportFiles()

 {

  //

  // TODO: 在此处添加构造函数逻辑

  //

 }

 #endregion

 /// <summary>

 /// 调用Excel.dll导出Excel文件

 /// </summary>

 /// <param name="ds"></param>

 ///

 #region // 调用Excel.dll导出Excel文件

     /// <summary>

     ///

     /// </summary>

     /// <param name="ds">DataSet数据庥</param>

     /// <param name="Duser">登录用户(如session["username"].Tostring())可为null或空</param>

     /// <param name="titlename">添加一个报表标题</param>

     /// <param name="filepath">指定文件在服务器上的存放地址(如:Server.MapPath("."))可为null或空</param>

     ///

     /// 为什么在这里设置个filepath?

     /// 原因如下:filepath接收的内容是Server.MapPath(".")这个参数值,这个值在这本类中对

     /// System.Web.HttpServerUtility HServer=new System.Web.HttpServerUtility()的引用出错,因为没有继承Page类

     /// 所以只能以传值的形式调用了,你有好的办法可以修改,那就再好不过了!

 public void DataSetToExcel(DataSet ds,string Duser,string titlename,string filepath)

 {

  //Microsoft.Office.Interop.Owc11() appowc=new Microsoft.Office.Interop.Owc11();

  OWC.Owc11.SpreadsheetClass xlsheet=new Microsoft.Office.Interop.Owc11.SpreadsheetClass();

  #region //屏蔽内容

  ///本来想用下面的这个办法实现的,可在IIS中必须设置相关的权限

  ///所以就放弃了,把代码设置为屏蔽内容,供学习参考!

  ///

//  Microsoft.Office.Interop.Excel.Application app=new Microsoft.Office.Interop.Excel.Application();

//

//  if(app==null)

//  {

//        throw new Exception("系统调用错误(Excel.dll)");

//  }

//  app.Application.Workbooks.Add(true);

//  WorkbookClass oBook=new WorkbookClass();

//      WorksheetClass oSheet=new WorksheetClass();

//

//  //定义表对象与行对象,同时用DataSet对其值进行初始化

//  System.Data.DataTable dt=ds.Tables[0];

//   oSheet.get_Range(app.Cells[1,1],app.Cells[10,15]).HorizontalAlignment=OWC.Owc11.XlHAlign.xlHAlignCenter;

//  DataRow[] myRow=dt.Select();

//  int i=0;

//  int cl=dt.Columns.Count;

//  //取得数据表各列标题

//  for(i=0;i<cl;i++)

//  {

//  app.Cells[1,i+1]=dt.Columns[i].Caption.ToString();

//  //app.Cells.AddComment(dt.Columns[i].Caption.ToString());

//  //oSheet.Cells.AddComment(dt.Columns[i].Caption.ToString());

//  //app.Cells=dt.Columns[i].Caption.ToString();

//  //oSheet.get_Range(app.Cells,app.Cells).HorizontalAlignment=

//  //app.Cells.AddComment=dt.Columns[i].ToString();

//  //oSheet.get_Range(app.Cells,app.Cells).HorizontalAlignment=

//  }

  #endregion

  //定义表对象与行对象,同时用DataSet对其值进行初始化

      System.Data.DataTable dt=ds.Tables[0];

  DataRow[] myRow=dt.Select();

      int i=0;

  int col=1;

  int colday=col+1;

  int colsecond=colday+1;

  int colnumber=colsecond+1;

  int cl=dt.Columns.Count;

  string userfile=null;

  //合并单元格

  xlsheet.get_Range(xlsheet.Cells[col,col],xlsheet.Cells[col,cl]).set_MergeCells(true);

  //添加标题名称

  if(titlename=="" || titlename==null)

    xlsheet.ActiveSheet.Cells[col,col]="添加标题处(高级报表)";

  else

  xlsheet.ActiveSheet.Cells[col,col]=titlename.Trim();

      //判断传值user是否为空

  if(Duser=="" || Duser==null)

  userfile="DFSOFT";

  else

  userfile=Duser;

  //设置标题大小

  xlsheet.get_Range(xlsheet.Cells[col,col],xlsheet.Cells[col,cl]).Font.set_Size(13);

  //加粗标题

  xlsheet.get_Range(xlsheet.Cells[col,col],xlsheet.Cells[col,cl]).Font.set_Bold(true);

   xlsheet.get_Range(xlsheet.Cells[colsecond,col],xlsheet.Cells[colsecond,cl]).Font.set_Bold(true);

  //设置标题水平居中

  xlsheet.get_Range(xlsheet.Cells,xlsheet.Cells).set_HorizontalAlignment(OWC.Owc11.XlHAlign.xlHAlignCenter);

  //设置单元格宽度

  //xlsheet.get_Range(xlsheet.Cells,xlsheet.Cells).set_ColumnWidth(9);

  xlsheet.get_Range(xlsheet.Cells[colday,col],xlsheet.Cells[colday,cl]).set_MergeCells(true);

  xlsheet.ActiveSheet.Cells[colday,col]="日期:"+DateTime.Now.Year.ToString()+"年"+DateTime.Now.Month.ToString()+"月"+DateTime.Now.Day.ToString()+"日 ";

  xlsheet.get_Range(xlsheet.Cells[colday,col],xlsheet.Cells[colday,cl]).set_HorizontalAlignment(OWC.Owc11.XlHAlign.xlHAlignRight);

  //取得数据表各列标题,各标题之间以\t分割,最后一个列标题后加回车符

  for(i=0;i<cl;i++)

  {

  xlsheet.ActiveSheet.Cells[colsecond,i+1]=dt.Columns[i].Caption.ToString();

  }

      //逐行处理数据

  foreach(DataRow row in myRow)

  {

  //当前数据写入

  for(i=0;i<cl;i++)

  {

   xlsheet.ActiveSheet.Cells[colnumber,i+1]=row[i].ToString().Trim();

  }

  colnumber++;

  }

  //设置边框线

  xlsheet.get_Range(xlsheet.Cells[colsecond,col],xlsheet.Cells[colnumber-1,cl]).Borders.set_LineStyle(OWC.Owc11.XlLineStyle.xlContinuous);

  try

  {

  //xlsheet.get_Range(xlsheet.Cells[2,1],xlsheet.Cells[8,15]).set_NumberFormat("¥#,##0.00");

  // System.Web.HttpServerUtility HServer=new System.Web.HttpServerUtility();

  //HServer.MapPath(".")+"//testowc.xls";

  xlsheet.Export(filepath+"//exportfiles//~$"+userfile+".xls",OWC.Owc11.SheetExportActionEnum.ssExportActionNone,OWC.Owc11.SheetExportFormat.ssExportXMLSpreadsheet);

  }

  catch(Exception e)

  {

  throw new Exception("系统调用错误或有打开的Excel文件!"+e);

  }

  //Web页面定义

  HttpResponse resp;

  resp=HttpContext.Current.Response;

  resp.ContentEncoding=System.Text.Encoding.GetEncoding("GB2312");

  resp.AppendHeader("Content-disposition","attachment;filename="+userfile+".xls");

  resp.ContentType="application/ms-excel";

  string path=filepath+"//exportfiles//~$"+userfile+".xls";

  System.IO.FileInfo file = new FileInfo(path);

  resp.Clear();

  resp.AddHeader("content-length",file.Length.ToString());

  resp.WriteFile(file.FullName);

  resp.End();

 }

 #endregion

 /// <summary>

 /// 导出Excel文件类

 /// </summary>

 /// <param name="ds"></param>

 /// <param name="FileName"></param>

 ///

 #region //导出Excel文件类

 public void DataSetToExcel(DataSet ds,string FileName)

 {

  try

  {

  //Web页面定义

  //System.Web.UI.Page mypage=new System.Web.UI.Page();

  HttpResponse resp;

  resp=HttpContext.Current.Response;

  resp.ContentEncoding=System.Text.Encoding.GetEncoding("GB2312");

  resp.AppendHeader("Content-disposition","attachment;filename="+FileName+".xls");

  resp.ContentType="application/ms-excel";

  //变量定义

  string colHeaders=null;

  string Is_item=null;

  //显示格式定义////////////////

  //文件流操作定义

  // FileStream fs=new FileStream(FileName,FileMode.Create,FileAccess.Write);

  //StreamWriter sw=new StreamWriter(fs,System.Text.Encoding.GetEncoding("GB2312"));

  StringWriter sfw=new StringWriter();

  //定义表对象与行对象,同时用DataSet对其值进行初始化

  System.Data.DataTable dt=ds.Tables[0];

  DataRow[] myRow=dt.Select();

  int i=0;

  int cl=dt.Columns.Count;

  //取得数据表各列标题,各标题之间以\t分割,最后一个列标题后加回车符

  for(i=0;i<cl;i++)

  {

   //if(i==(cl-1)) //最后一列,加\n

   // colHeaders+=dt.Columns[i].Caption.ToString();

   //else

   colHeaders+=dt.Columns[i].Caption.ToString()+"\t";

  }

  sfw.WriteLine(colHeaders);

  //sw.WriteLine(colHeaders);

  //逐行处理数据

  foreach(DataRow row in myRow)

  {

   //当前数据写入

   for(i=0;i<cl;i++)

   {

   //if(i==(cl-1))

   //  Is_item+=row[i].ToString()+"\n";

   //else

   Is_item+=row[i].ToString()+"\t";

   }

   sfw.WriteLine(Is_item);

   //sw.WriteLine(Is_item);

   Is_item=null;

  }

  resp.Write(sfw);

  //resp.Clear();

  resp.End();

  }

  catch(Exception e)

  {

        throw e;

  }

 }

 #endregion

 /// <summary>

 /// 数据集转换,即把DataSet转换为Excel对象

 /// </summary>

 /// <param name="ds"></param>

 /// <param name="FileName"></param>

 /// <param name="titlename"></param>

 ///

 #region   //运用html+css生成Excel

 public void DataSetToExcel(DataSet ds,String FileName,string titlename)

 {

  string ExportFileName=null;

  if(FileName==null || FileName=="")

  ExportFileName="DFSOFT";

  else

  ExportFileName=FileName;

  if(titlename=="" || titlename==null)

  titlename="添加标题处(高级报表)";

  //定义表对象与行对象,同时用DataSet对其值进行初始化

  System.Data.DataTable dt=ds.Tables[0];

  DataRow[] myRow=dt.Select();

  int i=0;

  int cl=dt.Columns.Count;

  //Web页面定义

  HttpResponse resp;

  resp=HttpContext.Current.Response;

  resp.Clear();

  resp.ContentEncoding=System.Text.Encoding.GetEncoding("utf-8");

  resp.AppendHeader("Content-disposition","attachment;filename="+ExportFileName+".xls");

  resp.ContentType="application/vnd.ms-excel";

  string BeginTab="<table border='0' cellpadding='0' cellspacing='0' style='border-right:#000000 0.1pt solid;border-top:#000000 0.1pt solid;'>";

  string EndTab="</table>";

  string FileIO=null;

  string MainIO=null;

  string TitleTab="<tr><td colspan='"+cl+"' style='font-size:30px;' align='center'><b>"+titlename+"</b></td></tr><tr><td colspan='"+cl+"' align='right' style='font-size:15px;'>"+DateTime.Now.Year.ToString()+"年"+DateTime.Now.Month.ToString()+"月"+DateTime.Now.Day.ToString()+"日    </td></tr>";

  string BeginTr="<tr>";

  string EndTr="</tr>";

  for(i=0;i<cl;i++)

  {

  FileIO+="<td style='border-left:#000000 0.1pt solid; border-bottom:#000000 1.0pt solid; font-size:15px;' align='center'><b>"+dt.Columns[i].Caption.ToString()+"</b></td>";

  }

  FileIO=BeginTr.ToString()+FileIO.ToString()+EndTr.ToString();

  //逐行处理数据

  foreach(DataRow row in myRow)

  {

  string OutIO=null;

  //当前数据写入

  for(i=0;i<cl;i++)

  {

   OutIO+="<td style='border-left:#000000 0.1pt solid; border-bottom:#000000 1.0pt solid; font-size:15px;' align='center'>"+row[i].ToString()+"</td>";

  }

  MainIO+=BeginTr.ToString()+OutIO.ToString()+EndTr.ToString();

  }

  FileIO="<center><table>"+TitleTab.ToString()+"<tr>"+BeginTab.ToString()+FileIO.ToString()+MainIO.ToString()+EndTab.ToString()+"</tr></table></center>";

  resp.Write(FileIO.ToString());

  resp.End();

 }

 #endregion

 /// <summary>

 /// 导出Word文件类

 /// </summary>

 /// <param name="ds"></param>

 /// <param name="FileName"></param>

 ///

 #region //导出Word文件类

 public void DataSetToWord(DataSet ds,string FileName)

 {

  try

  {

  //Web页面定义

  //System.Web.UI.Page mypage=new System.Web.UI.Page();

  HttpResponse resp;

  resp=HttpContext.Current.Response;

  resp.Clear();

  resp.Buffer=true;

  resp.Charset="utf-8";

  resp.ContentEncoding=System.Text.Encoding.GetEncoding("utf-8");

  resp.AppendHeader("Content-disposition","attachment;filename="+FileName+".doc");

  resp.ContentType="application/ms-word";

  //变量定义

  string colHeaders=null;

  string Is_item=null;

  //显示格式定义////////////////

  //文件流操作定义

  // FileStream fs=new FileStream(FileName,FileMode.Create,FileAccess.Write);

  //StreamWriter sw=new StreamWriter(fs,System.Text.Encoding.GetEncoding("GB2312"));

  StringWriter sfw=new StringWriter();

  //定义表对象与行对象,同时用DataSet对其值进行初始化

  System.Data.DataTable dt=ds.Tables[0];

  DataRow[] myRow=dt.Select();

  int i=0;

  int cl=dt.Columns.Count;

  //取得数据表各列标题,各标题之间以\t分割,最后一个列标题后加回车符

  for(i=0;i<cl;i++)

  {

   //if(i==(cl-1)) //最后一列,加\n

   // colHeaders+=dt.Columns[i].Caption.ToString();

   //else

   colHeaders+=dt.Columns[i].Caption.ToString()+"\t";

  }

  sfw.WriteLine(colHeaders);

  //sw.WriteLine(colHeaders);

  //逐行处理数据

  foreach(DataRow row in myRow)

  {

   //当前数据写入

   for(i=0;i<cl;i++)

   {

   //if(i==(cl-1))

   //  Is_item+=row[i].ToString()+"\n";

   //else

   Is_item+=row[i].ToString()+"\t";

   }

   sfw.WriteLine(Is_item);

   //sw.WriteLine(Is_item);

   Is_item=null;

  }

  resp.Write(sfw);

  //resp.Clear();

  resp.End();

  }

  catch(Exception e)

  {

  throw e;

  }

 }

 #endregion

 /// <summary>

 /// 数据集转换,即把DataSet转换为Word对象

 /// </summary>

 /// <param name="ds"></param>

 /// <param name="titlename"></param>

 ///

 #region // 运行html+css生成Word文件

 public void DataSetToWord(DataSet ds,string FileName,string titlename)

 {

  //调用Office

  //备注:速度太慢放弃应用此方法

  //OWC.Word.Application oWord=new OWC.Word.ApplicationClass();

  //OWC.Word._Document oDoc=new OWC.Word.DocumentClass();

  string ExportFileName=null;

  if(FileName==null || FileName=="")

  ExportFileName="DFSOFT";

  else

  ExportFileName=FileName;

  if(titlename=="" || titlename==null)

  titlename="添加标题处(高级报表)";

  //定义表对象与行对象,同时用DataSet对其值进行初始化

  System.Data.DataTable dt=ds.Tables[0];

  DataRow[] myRow=dt.Select();

  int i=0;

  int cl=dt.Columns.Count;

  #region

//  string FileTitle="<center><table><tr><td><b>报表测试</b></td></tr></table>"+"\n";

//  string EndFile="</center>";

//  //Web页面定义

  HttpResponse resp;

  resp=HttpContext.Current.Response;

  resp.Clear();

  resp.ContentEncoding=System.Text.Encoding.GetEncoding("utf-8");

  resp.AppendHeader("Content-disposition","attachment;filename="+ExportFileName+".doc");

  resp.ContentType="application/vnd.ms-word";

//  System.IO.StringWriter oSW=new StringWriter();

//   System.Web.UI.HtmlTextWriter oHW=new System.Web.UI.HtmlTextWriter(oSW);

//  System.Web.UI.WebControls.DataGrid oDG=new System.Web.UI.WebControls.DataGrid();

//      oDG.DataSource=ds.Tables[0];

//  oDG.DataBind();

//  oDG.RenderControl(oHW);

//  resp.Write(FileTitle.ToString()+oSW.ToString()+EndFile.ToString());

//  resp.End();

  #endregion

  string BeginTab="<table border='0' cellpadding='0' cellspacing='0' style='border-right:#000000 0.1pt solid;border-top:#000000 0.1pt solid;'>";

  string EndTab="</table>";

  string FileIO=null;

  string MainIO=null;

  string TitleTab="<tr><td style='font-size:13px;' align='center'><b>"+titlename+"</b></td></tr><tr><td align='right' style='font-size:15px;'>"+DateTime.Now.Year.ToString()+"年"+DateTime.Now.Month.ToString()+"月"+DateTime.Now.Day.ToString()+"日    </td></tr>";

  string BeginTr="<tr>";

  string EndTr="</tr>";

  for(i=0;i<cl;i++)

  {

  FileIO+="<td style='border-left:#000000 0.1pt solid; border-bottom:#000000 1.0pt solid; font-size:15px;' align='center'><b>"+dt.Columns[i].Caption.ToString()+"</b></td>";

  }

  FileIO=BeginTr.ToString()+FileIO.ToString()+EndTr.ToString();

  //逐行处理数据

  foreach(DataRow row in myRow)

  {

  string OutIO=null;

  //当前数据写入

  for(i=0;i<cl;i++)

  {

   OutIO+="<td style='border-left:#000000 0.1pt solid; border-bottom:#000000 1.0pt solid; font-size:15px;' align='center'>"+row[i].ToString()+"</td>";

  }

  MainIO+=BeginTr.ToString()+OutIO.ToString()+EndTr.ToString();

  }

  FileIO="<center><table>"+TitleTab.ToString()+"<tr>"+BeginTab.ToString()+FileIO.ToString()+MainIO.ToString()+EndTab.ToString()+"</tr></table></center>";

  resp.Write(FileIO.ToString());

  resp.End();

 }

 #endregion

 }

}


« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。