C#中Excel文件操作方式及操作类

转载 2007年09月30日 09:41:00
Excel文件的操作方式有两种:一种是使用像数据库一样操作,另一种是使用DCOM方式。

第一种方法比较简单,效率也较高,但使用起来功能少,不灵活。使用方式如下:

引入命名空间:using System.Data.OleDb;

string connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + FileName +";Extended Properties=Excel 8.0;";
    OleDbConnection objConn = new OleDbConnection(connString);
    OleDbCommand objCmd = new OleDbCommand();
    objCmd.Connection = objConn;
    objConn.Open();

//建立表结构
    insertSql = @"CREATE TABLE Sheet1(column1 varchar,column2 integer)";

objCmd.CommandText = insertSql;
    objCmd.ExecuteNonQuery();

//建立插入动作的Command
     insertSql  = "INSERT INTO Sheet1(" + temp + ") values('aaaa',102)";
     objCmd.CommandText = insertSql;
     objCmd.ExecuteNonQuery();

完全和对数据库的操作一样。这种操作不能对Excel文件的格式进行设置。

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

第二种操作方式:

1、在引用中添加对Excel的引用

2、需要命名空间

using System;
using System.IO;
using System.Collections;
using System.Threading;
using System.Diagnostics;

2、操作方法:

string staFile = "";  //设置要保存的Excel文件的名称
   System.Windows.Forms.SaveFileDialog sfd = new System.Windows.Forms.SaveFileDialog();
   sfd.FileName = "";
   //sfd.CheckFileExists = true;
   sfd.CheckPathExists =  true;
   sfd.DefaultExt = "xls";
   sfd.Filter = "Excel files (*.xls)|*.xls|All files (*.*)|*.*";
   sfd.InitialDirectory = "D;//";
   sfd.RestoreDirectory = true;
   if(sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
    staFile = sfd.FileName;
   else
    return false;
   if(staFile.IndexOf(".xls") < 0)
    staFile += ".xls";
   ////////////////////////////////////////////////开始操作Excel对象//////////////////////////////////////////////////////////
   System.Reflection.Missing oMiss = System.Reflection.Missing.Value;

   Excel.ApplicationClass m_objExcel = new Excel.ApplicationClass();//生成Excel对象
   m_objExcel.Visible = false;

   Excel.Workbooks m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
   Excel.Workbook m_objBook = (Excel.Workbook)(m_objBooks.Add(oMiss));
   Excel.Worksheet m_objSheet = (Excel.Worksheet)m_objBook.ActiveSheet;

   //********************向Excel文件中写入数据********************************************
   //表头
   m_objSheet.get_Range((object)"A1",(object)"I1").MergeCells = true;//合并A1到L1的单元格
   Excel.Range er = m_objSheet.get_Range((object)"A1",oMiss);
   er.Value2 =  sName + "  在  /"" + sExamName + "/"  中的考试结果细目";
   er.HorizontalAlignment = Excel.Constants.xlCenter;  //设置单元格的水平对齐方式
   er.VerticalAlignment = Excel.Constants.xlBottom;
   er.Font.Bold = true; //设置字体
   er.Font.Size = 16;
   er.Font.Name = "宋体";
   //考生信息
   er = m_objSheet.get_Range((object)"A2",oMiss);
   er.Value2 = "考生信息:";
   er.Font.Bold = true;
   er.ColumnWidth = 11;

   m_objSheet.get_Range((object)"E2",(object)"F2").MergeCells = true;
   m_objSheet.get_Range((object)"G2",(object)"H2").MergeCells = true;
   m_objSheet.get_Range((object)"E3",(object)"F3").MergeCells = true;
   m_objSheet.get_Range((object)"G3",(object)"H3").MergeCells = true;
   m_objSheet.get_Range((object)"B2",oMiss).Value2 = "登录帐号"; //为单元格输入文字
   m_objSheet.get_Range((object)"C2",oMiss).Value2 = "真实姓名";
   m_objSheet.get_Range((object)"D2",oMiss).Value2 = "所在部门";
   m_objSheet.get_Range((object)"E2",oMiss).Value2 = "开始时间";
   m_objSheet.get_Range((object)"G2",oMiss).Value2 = "结束时间";
   m_objSheet.get_Range((object)"I2",oMiss).Value2 = "总成绩";
   m_objSheet.get_Range((object)"J2",oMiss).Value2 = "考试状态";

   m_objSheet.get_Range((object)"B3",oMiss).Value2 = sUsername;
   m_objSheet.get_Range((object)"C3",oMiss).Value2 = sName;
   m_objSheet.get_Range((object)"D3",oMiss).Value2 = sDepartment;
   m_objSheet.get_Range((object)"E3",oMiss).Value2 = sBTime;
   m_objSheet.get_Range((object)"G3",oMiss).Value2 = sETime;
   m_objSheet.get_Range((object)"I3",oMiss).Value2 = sScore;
   if( sStatus == "1" )
    sStatus = "完成";
   else if( sStatus == "-1")
    sStatus = "未完成";
   else if(sStatus == "0")
    sStatus = "未评分";
   m_objSheet.get_Range((object)"J3",oMiss).Value2 = sStatus; 


   //试卷信息
   er = m_objSheet.get_Range((object)"A5",oMiss);
   er.Value2 = "试卷信息:";
   er.Font.Bold = true;
   

   m_objSheet.get_Range((object)"E5",(object)"F5").MergeCells = true;
   m_objSheet.get_Range((object)"E6",(object)"F6").MergeCells = true;

   m_objSheet.get_Range((object)"B5",oMiss).Value2 = "试卷名称";
   m_objSheet.get_Range((object)"C5",oMiss).Value2 = "试卷分数";
   m_objSheet.get_Range((object)"D5",oMiss).Value2 = "及格分数";
   m_objSheet.get_Range((object)"E5",oMiss).Value2 = "考试时间(分钟)";
   

   m_objSheet.get_Range((object)"B6",oMiss).Value2 = sExamName;
   m_objSheet.get_Range((object)"C6",oMiss).Value2 = sFS;
   m_objSheet.get_Range((object)"D6",oMiss).Value2 = sPS;
   m_objSheet.get_Range((object)"E6",oMiss).Value2 = sTime;
   
   //试题细目
   er = m_objSheet.get_Range((object)"A8",oMiss);
   er.Value2 = "试题细目:";
   er.Font.Bold = true;

   m_objSheet.get_Range((object)"A9",oMiss).Value2 = "编号";
   m_objSheet.get_Range((object)"B9",oMiss).Value2 = "题型";
   m_objSheet.get_Range((object)"C9",oMiss).Value2 = "知识点";
   m_objSheet.get_Range((object)"D9",oMiss).Value2 = "题目内容";
   m_objSheet.get_Range((object)"E9",oMiss).Value2 = "可选项";
   m_objSheet.get_Range((object)"F9",oMiss).Value2 = "标准答案";
   m_objSheet.get_Range((object)"G9",oMiss).Value2 = "试题分数";
   m_objSheet.get_Range((object)"H9",oMiss).Value2 = "考生答案";
   m_objSheet.get_Range((object)"I9",oMiss).Value2 = "考生得分";

   //开始对试卷中的每一试题进行输出
   object oTemp = "";
   int colNum = 0;
   string strIndex ="";
   string sAns = "",sSco = "0";
   fScore = 0;
   

   XmlNodeList TmNodes = xmlDoc.SelectNodes("//paper/tm");
   int iIndex = 10;
   for(int i=0; i<TmNodes.Count; i++)
   {
    colNum = iIndex;
    oTemp = "A" + colNum.ToString();
    m_objSheet.get_Range( oTemp,oMiss).Value2 =strIndex = TmNodes[i].SelectSingleNode("exam_gd_tm_id").InnerText;
    oTemp = "B" + colNum.ToString();
    m_objSheet.get_Range( oTemp,oMiss).Value2 = TmNodes[i].SelectSingleNode("tx_name").InnerText;
    oTemp = "C" + colNum.ToString();
    m_objSheet.get_Range( oTemp,oMiss).Value2 = TmNodes[i].SelectSingleNode("tm_key").InnerText;
    oTemp = "D" + colNum.ToString();
    m_objSheet.get_Range( oTemp,oMiss).Value2 = TmNodes[i].SelectSingleNode("title").InnerText;
    oTemp = "E" + colNum.ToString();
    m_objSheet.get_Range( oTemp,oMiss).Value2 = TmNodes[i].SelectSingleNode("options").InnerText;
    oTemp = "F" + colNum.ToString();
    m_objSheet.get_Range( oTemp,oMiss).Value2 = TmNodes[i].SelectSingleNode("answers").InnerText;
    
    oTemp = "G" + colNum.ToString();
    fScore = float.Parse(TmNodes[i].SelectSingleNode("score").InnerText == "" ? "0":TmNodes[i].SelectSingleNode("score").InnerText);
    fScore *= fRate;
    m_objSheet.get_Range( oTemp,oMiss).Value2 = fScore.ToString("#,##0.00;(#,##0.00);0");
    
    //考生答案及得分
    getUserData(strIndex,ref sAns,ref sSco);
    oTemp = "H" + colNum.ToString();
    m_objSheet.get_Range( oTemp,oMiss).Value2 = sAns;
    oTemp = "I" + colNum.ToString();
    m_objSheet.get_Range( oTemp,oMiss).Value2 = sSco;

    iIndex ++;

    //子题
    if(TmNodes[i].ChildNodes.Count > 10)
    {
     for(int j=10; j<TmNodes[i].ChildNodes.Count; j++)
     {
      XmlNode node = TmNodes[i].ChildNodes[j];
      colNum = iIndex;
      oTemp = "A" + colNum.ToString();
      strIndex = node.SelectSingleNode("exam_gd_tm_id").InnerText;
      m_objSheet.get_Range( oTemp,oMiss).Value2 = strIndex;
      oTemp = "B" + colNum.ToString();
      m_objSheet.get_Range( oTemp,oMiss).Value2 = node.SelectSingleNode("tx_name").InnerText;
      oTemp = "C" + colNum.ToString();
      m_objSheet.get_Range( oTemp,oMiss).Value2 = node.SelectSingleNode("tm_key").InnerText;
      oTemp = "D" + colNum.ToString();
      m_objSheet.get_Range( oTemp,oMiss).Value2 = node.SelectSingleNode("title").InnerText;
      oTemp = "E" + colNum.ToString();
      m_objSheet.get_Range( oTemp,oMiss).Value2 = node.SelectSingleNode("options").InnerText;
      oTemp = "F" + colNum.ToString();
      m_objSheet.get_Range( oTemp,oMiss).Value2 = node.SelectSingleNode("answers").InnerText;
      
      oTemp = "G" + colNum.ToString();
      fScore = float.Parse(node.SelectSingleNode("score").InnerText == "" ? "0":node.SelectSingleNode("score").InnerText);
      fScore *= fRate;
      m_objSheet.get_Range( oTemp,oMiss).Value2 = fScore.ToString("#,##0.00;(#,##0.00);0");
    
      //考生答案及得分
      getUserData(strIndex,ref sAns,ref sScore);
      oTemp = "H" + colNum.ToString();
      m_objSheet.get_Range( oTemp,oMiss).Value2 = sAns;
      oTemp = "I" + colNum.ToString();
      m_objSheet.get_Range( oTemp,oMiss).Value2 = sScore;

      iIndex ++;
     }
    }
   }
   
   
   //保存并关闭Excel
   m_objBook.SaveAs(staFile, oMiss, oMiss, oMiss, oMiss,oMiss, Excel.XlSaveAsAccessMode.xlNoChange, oMiss,oMiss,oMiss, oMiss);
   m_objBook.Close(false, oMiss, oMiss);
   m_objBooks.Close();
   m_objExcel.Quit();
 

   System.Runtime.InteropServices.Marshal.ReleaseComObject(er);  //这些操作很重要,释放Excel进程
   System.Runtime.InteropServices.Marshal.ReleaseComObject(m_objSheet);
   System.Runtime.InteropServices.Marshal.ReleaseComObject(m_objBook);
   System.Runtime.InteropServices.Marshal.ReleaseComObject(m_objBooks);
   System.Runtime.InteropServices.Marshal.ReleaseComObject(m_objExcel);
   GC.Collect();

//******************************

注:以上关于Excel对象里的一些属性如果不全知道的话,可以通过使用Excel文件里的宏得到。

打开一个Excel文件,工具-》宏-》录制新宏。这样以后你对Excel的所有操作都会被记录下来。操作完成后可以查看刚才录制的宏。通过查看宏文件就可以大概知道某一操作对应什么方法了。但要在C#的Excel对象中使用,和宏里的还不大一样。这时你可以通过.net里的对象浏览器来查找对应的方法或属性的命字和使用方法。

 

C++文件操作的5种方式

纯C语言读取文件方式 写文件 FILE *pFile; pFile=fopen("jingge.txt","w"); fwrite("http://blog.sina.com.cn/liyuanjin...
  • liyuanjinglyj
  • liyuanjinglyj
  • 2012年09月07日 18:56
  • 2106

C#封装的常用文件操作类实例

using System; using System.Text; using System.Web; using System.IO; namespace DotNet.Utilities { p...
  • cai20142932
  • cai20142932
  • 2017年07月21日 22:02
  • 391

自己用的c#操作excel类。

下面的程序,是自己经常用到的excel操作类,本程序与别的对excel操作唯一改进的地方是对excel数据的填充方式上。网上经常看到的填充方式有:1:按单元格2:按区域(range)本程序,也还是按区...
  • yangang0201
  • yangang0201
  • 2007年07月13日 09:56
  • 4117

C#中Excel文件操作方式及操作类

对Excel文件的操作方式有两种:一种是使用像数据库一样操作,另一种是使用DCOM方式。第一种方法比较简单,效率也较高,但使用起来功能少,不灵活。使用方式如下:引入命名空间:using System....
  • zsyzsj
  • zsyzsj
  • 2007年09月29日 10:47
  • 1114

C#EXCEL 操作类--C#ExcelHelper操作类

主要功能如下 1.导出Excel文件,自动返回可下载的文件流  2.导出Excel文件,转换为可读模式 3.导出Excel文件,并自定义文件名 4.将数据导出至Excel文件 5.将指定的集...
  • luoyanqing119
  • luoyanqing119
  • 2014年01月09日 11:09
  • 17027

C#操作Excel类,功能比较全

原文出处: http://www.cnblogs.com/wangchuang/p/5546345.html /// 常用工具类——Excel操作类 ///  --------...
  • wuyuander
  • wuyuander
  • 2017年06月06日 11:13
  • 511

C#中自定义操作INI文件的类

//网上收集的一个专门操作INI文件的类,有改动.using System;using System.IO;using System.Runtime.InteropServices;using Sys...
  • ltolll
  • ltolll
  • 2008年01月23日 17:41
  • 1752

C#文件操作常用相关类(Directory类、File类、Path类)

1 文件操作常用相关类 1)File //操作文件,静态类,对文件整体操作。拷贝、删除、剪切等。 2)Directory //操作目录(文件夹),静态类。 3)DirectoryInfo //文件夹的...
  • syaguang2006
  • syaguang2006
  • 2013年07月12日 17:09
  • 1174

C#常用工具类——Excel操作类

// 常用工具类——Excel操作类 ///  ------------------------------------------------ ///  CreateConnecti...
  • wuyuander
  • wuyuander
  • 2017年06月06日 11:09
  • 634

使用C#对Excel文档的相关操作

  1.首先需要引入Excel的Com组件,Microsoft Excel 11.0 Object Library 1.5(该组件版本为office2003)添加该引用后在解决方案的引用文件夹里会有E...
  • wwwinking
  • wwwinking
  • 2009年12月29日 17:51
  • 3263
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#中Excel文件操作方式及操作类
举报原因:
原因补充:

(最多只允许输入30个字)