找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1517|回复: 2

[分享] C#操作EXCEL

[复制链接]

已领礼包: 6个

财富等级: 恭喜发财

发表于 2014-8-31 13:30:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

一个小东西,C#调用Excel作报表的源代码放在这儿给大家看看。关于代码的构成,在源代码中已经有完整的代码注释了。

下面的这个类中,主要完成的功能是从数据库中逐字段读出数据,设置格式后,在Excel中显示出来。

在这个类中,有两个参数传进来,一个是它的数据源,另一个是整个报表的标题字符串,具体看代码就应该知道了。



  1. using System;
  2. using System.Data;
  3. using Excel;

  4. namespace LogicLayer
  5. {
  6. ///<summary>
  7. /// OutputExcel 的摘要说明
  8. ///</summary>
  9. public class OutputExcel
  10. {
  11.   public OutputExcel(DataView dv,string str)
  12.   {
  13.    //
  14.    // TODO: 在此处添加构造函数逻辑
  15.    //
  16.    Excel.Application excel;
  17.    int rowIndex=4;
  18.    int colIndex=1;

  19.    Excel._Workbook xBk;
  20.    Excel._Worksheet xSt;

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

  24.    //
  25.    //取得标题
  26.    //
  27.    foreach(DataColumn col in dv.Table.Columns)
  28.    {
  29.     colIndex++;
  30.     excel.Cells[4,colIndex] = col.ColumnName;
  31.     xSt.get_Range(excel.Cells[4,colIndex],excel.Cells[4,colIndex]).HorizontalAlignment = Excel.XlVAlign.xlVAlignCenter;//设置标题格式为居中对齐
  32.    }

  33.    //
  34.    //取得表格中的数据
  35.    //
  36.    foreach(DataRowView row in dv)
  37.    {
  38.     rowIndex ++;
  39.     colIndex = 1;
  40.     foreach(DataColumn col in dv.Table.Columns)
  41.     {
  42.      colIndex ++;
  43.      if(col.DataType == System.Type.GetType("System.DateTime"))
  44.      {
  45.       excel.Cells[rowIndex,colIndex] = (Convert.ToDateTime(row[col.ColumnName].ToString())).ToString("yyyy-MM-dd");
  46.       xSt.get_Range(excel.Cells[rowIndex,colIndex],excel.Cells[rowIndex,colIndex]).HorizontalAlignment = Excel.XlVAlign.xlVAlignCenter;//设置日期型的字段格式为居中对齐
  47.      }
  48.      else
  49.      if(col.DataType == System.Type.GetType("System.String"))
  50.      {
  51.       excel.Cells[rowIndex,colIndex] = "'"+row[col.ColumnName].ToString();
  52.       xSt.get_Range(excel.Cells[rowIndex,colIndex],excel.Cells[rowIndex,colIndex]).HorizontalAlignment = Excel.XlVAlign.xlVAlignCenter;//设置字符型的字段格式为居中对齐
  53.      }
  54.      else
  55.      {
  56.       excel.Cells[rowIndex,colIndex] = row[col.ColumnName].ToString();
  57.      }
  58.     }
  59.    }
  60.    //
  61.    //加载一个合计行
  62.    //
  63.    int rowSum = rowIndex + 1;
  64.    int colSum = 2;
  65.    excel.Cells[rowSum,2] = "合计";
  66.    xSt.get_Range(excel.Cells[rowSum,2],excel.Cells[rowSum,2]).HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
  67.    //
  68.    //设置选中的部分的颜色
  69.    //
  70.    xSt.get_Range(excel.Cells[rowSum,colSum],excel.Cells[rowSum,colIndex]).Select();
  71.    xSt.get_Range(excel.Cells[rowSum,colSum],excel.Cells[rowSum,colIndex]).Interior.ColorIndex = 19;//设置为浅黄色,共计有56种
  72.    //
  73.    //取得整个报表的标题
  74.    //
  75.    excel.Cells[2,2] = str;
  76.    //
  77.    //设置整个报表的标题格式
  78.    //
  79.    xSt.get_Range(excel.Cells[2,2],excel.Cells[2,2]).Font.Bold = true;
  80.    xSt.get_Range(excel.Cells[2,2],excel.Cells[2,2]).Font.Size = 22;
  81.    //
  82.    //设置报表表格为最适应宽度
  83.    //
  84.    xSt.get_Range(excel.Cells[4,2],excel.Cells[rowSum,colIndex]).Select();
  85.    xSt.get_Range(excel.Cells[4,2],excel.Cells[rowSum,colIndex]).Columns.AutoFit();
  86.    //
  87.    //设置整个报表的标题为跨列居中
  88.    //
  89.    xSt.get_Range(excel.Cells[2,2],excel.Cells[2,colIndex]).Select();
  90.    xSt.get_Range(excel.Cells[2,2],excel.Cells[2,colIndex]).HorizontalAlignment = Excel.XlHAlign.xlHAlignCenterAcrossSelection;
  91.    //
  92.    //绘制边框
  93.    //
  94.    xSt.get_Range(excel.Cells[4,2],excel.Cells[rowSum,colIndex]).Borders.LineStyle = 1;
  95.    xSt.get_Range(excel.Cells[4,2],excel.Cells[rowSum,2]).Borders[Excel.XlBordersIndex.xlEdgeLeft].Weight = Excel.XlBorderWeight.xlThick;//设置左边线加粗
  96.    xSt.get_Range(excel.Cells[4,2],excel.Cells[4,colIndex]).Borders[Excel.XlBordersIndex.xlEdgeTop].Weight = Excel.XlBorderWeight.xlThick;//设置上边线加粗
  97.    xSt.get_Range(excel.Cells[4,colIndex],excel.Cells[rowSum,colIndex]).Borders[Excel.XlBordersIndex.xlEdgeRight].Weight = Excel.XlBorderWeight.xlThick;//设置右边线加粗
  98.    xSt.get_Range(excel.Cells[rowSum,2],excel.Cells[rowSum,colIndex]).Borders[Excel.XlBordersIndex.xlEdgeBottom].Weight = Excel.XlBorderWeight.xlThick;//设置下边线加粗
  99.    //
  100.    //显示效果
  101.    //
  102.    excel.Visible=true;
  103.   }
  104. }
  105. }

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2014-8-31 16:36:16 | 显示全部楼层
不打开Excel的方式 我更喜欢把excel文件看成一个简单的数据库 O(∩_∩)O~
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Data;
  6. using System.Data.OleDb;

  7. namespace TxDwgViewer
  8. {

  9.     public class XmlDatabase
  10.     {

  11.         const string strXmlFileName = "Config.xml";
  12.         const string strClassTableName = "Classes";
  13.         const string strMethodTableName = "Methodes";
  14.         const string strCourseTableName = "Courses";
  15.         const string strMethodShipTableName = "MethodShips";
  16.         const string strDwgInfoTableName = "DwgInfos";
  17.       
  18.         DataSet _ds;

  19.         public XmlDatabase()
  20.         {
  21.             _ds = new DataSet();
  22.             _ds.ReadXml(Helper.GetDataFilePath(strXmlFileName));
  23.         }

  24.         public DataTable ClassTable
  25.         {
  26.             get { return _ds.Tables[strClassTableName]; }
  27.         }

  28.         public DataTable MethodTable
  29.         {
  30.             get { return _ds.Tables[strMethodTableName]; }
  31.         }

  32.         public int MethodCount
  33.         {
  34.             get { return MethodTable.Rows.Count; }
  35.         }

  36.         public DataTable CourseTable
  37.         {
  38.             get { return _ds.Tables[strCourseTableName]; }
  39.         }

  40.         public int  CourseCount
  41.         {
  42.             get { return CourseTable.Rows.Count; }
  43.         }

  44.         public DataTable MethodShipTable
  45.         {
  46.             get { return _ds.Tables[strMethodShipTableName]; }
  47.         }

  48.         public DataTable DwgInfoTable
  49.         {
  50.             get { return _ds.Tables[strDwgInfoTableName]; }
  51.         }

  52.         public bool HasDwgInfos
  53.         {
  54.             get { return _ds.Tables.Contains(strDwgInfoTableName); }
  55.         }

  56.         public void Save()
  57.         {
  58.             _ds.WriteXml(Helper.GetDataFilePath("Config.xml"));
  59.         }

  60.         public void UpdateDwgs(List<DwgInfo> dwgs)
  61.         {
  62.             if (HasDwgInfos)
  63.             {
  64.                 foreach (var dwg in dwgs)
  65.                 {

  66.                     var mCount = MethodTable.Rows.Count;
  67.                     var cCount = CourseTable.Rows.Count;
  68.                     dwg.Methods = new string[mCount];
  69.                     dwg.Courses = new string[cCount];

  70.                     var dr = DwgInfoTable.GetRow(dwg.Id);
  71.                     if (dr == null)
  72.                     {
  73.                         var idr = DwgInfoTable.NewRow();
  74.                         idr["Id"] = dwg.Id;
  75.                         for (int j = 0; j < mCount; j++)
  76.                             idr["Method" + j] = "";
  77.                         for (int j = 0; j < cCount; j++)
  78.                             idr["Course" + j] = "";
  79.                         DwgInfoTable.Rows.Add(idr);
  80.                     }
  81.                     else
  82.                     {
  83.                         for (int i = 0; i < mCount; i++)
  84.                             dwg.Methods[i] = Convert.ToString(dr["Method" + i]);
  85.                         for (int i = 0; i < cCount; i++)
  86.                             dwg.Courses[i] = Convert.ToString(dr["Course" + i]).Replace(" ", "\r\n");
  87.                     }
  88.                 }
  89.             }
  90.         }

  91.         private void CopyTable(string strConn, string excelTableName, string alias)
  92.         {
  93.             using (var ds = new DataSet())
  94.             {
  95.                 var da = new OleDbDataAdapter(string.Format("select * from [{0}$]", excelTableName), strConn);
  96.                 da.Fill(ds);
  97.                 var xdt = ds.Tables[0];
  98.                 xdt.TableName = alias;
  99.                 ds.Tables.RemoveAt(0);
  100.                 _ds.Tables.Add(xdt);
  101.             }
  102.         }

  103.         public void BuildFromExcelFile(string excelFileName)
  104.         {
  105.             string strConn =
  106.                 string.Format(
  107.                     "Provider={0};Data Source={1};Extended Properties='{2}'",
  108.                     "Microsoft.Jet.OLEDB.4.0",
  109.                     excelFileName,
  110.                     "Excel 8.0;HDR=Yes;IMEX=1;");


  111.             _ds.Tables.Clear();

  112.             //读入知识覆盖表
  113.             CopyTable(strConn, "知识覆盖表", strCourseTableName);

  114.             //读入零件类型表
  115.             CopyTable(strConn, "零件类型表", strClassTableName);

  116.             //读入鉴定考试表
  117.             DataSet ds = new DataSet();
  118.             OleDbDataAdapter da = new OleDbDataAdapter("select * from [鉴定考试表$]", strConn);
  119.             da.Fill(ds);
  120.             DataTable xdt = ds.Tables[0];

  121.             var methodTable = _ds.Tables.Add(strMethodTableName);
  122.             methodTable.Columns.Add("Id");
  123.             methodTable.Columns.Add("Name");
  124.             var methodShipTable = _ds.Tables.Add(strMethodShipTableName);
  125.             methodShipTable.Columns.Add("Id");
  126.             methodShipTable.Columns.Add("MId");
  127.             methodShipTable.Columns.Add("Name");

  128.             int i = 0;
  129.             foreach (DataRow dr in xdt.Rows)
  130.             {
  131.                 var mdr = methodTable.NewRow();
  132.                 mdr["Id"] = dr["Id"];
  133.                 mdr["Name"] = dr["Name"];
  134.                 var values = Convert.ToString(dr["Values"]).Split(',');
  135.                 for (int j = 0; j < values.Length; j++)
  136.                 {
  137.                     var msdr = methodShipTable.NewRow();
  138.                     msdr["Id"] = i++;
  139.                     msdr["MId"] = dr["Id"];
  140.                     msdr["Name"] = values[j];
  141.                     methodShipTable.Rows.Add(msdr);
  142.                 }
  143.                 methodTable.Rows.Add(mdr);
  144.             }

  145.             //读入文件信息表
  146.             ds = new DataSet();
  147.             da = new OleDbDataAdapter("select * from [文件信息表$]", strConn);
  148.             da.Fill(ds);
  149.             xdt = ds.Tables[0];

  150.             var dwgInfoTable = _ds.Tables.Add(strDwgInfoTableName);
  151.             dwgInfoTable.Columns.Add("Id");

  152.             var mCount = MethodTable.Rows.Count;
  153.             var cCount = CourseTable.Rows.Count;

  154.             for (int j = 0; j < mCount; j++)
  155.                 dwgInfoTable.Columns.Add("Method" + j);

  156.             for (int j = 0; j < cCount; j++)
  157.                 dwgInfoTable.Columns.Add("Course" + j);

  158.             foreach (DataRow xdr in xdt.Rows)
  159.             {
  160.                 var idr = dwgInfoTable.NewRow();
  161.                 idr["Id"] = xdr["零件编号"];

  162.                 for (int j = 0; j < mCount; j++)
  163.                     idr["Method" + j] = xdr[MethodTable.GetValue(j, "Name")];

  164.                 for (int j = 0; j < cCount; j++)
  165.                     idr["Course" + j] = xdr["知识点覆盖(课程" + (j + 1) + ":" + CourseTable.GetValue(j, "Name") + ")"];

  166.                 dwgInfoTable.Rows.Add(idr);
  167.             }

  168.             Save();

  169.         }







  170.     }
  171. }
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-8-31 16:57:45 | 显示全部楼层
TableDate 是 Net 格形式,Excel 在有合并格的时候,连接是不是会出问题
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-18 23:47 , Processed in 0.446238 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表