zoukankan      html  css  js  c++  java
  • C#操作Excel的方法

    一. 直接调用COM组件
    (如excel 2003)引用COM组件,添加excel的com对象Microsoft Excel 11.0 Object,然后在引用中可以看到
    Microsoft.Office.Core,Excel,VBIDE三个对象。此时在程序中需要引入:

    using System.Reflection;
    using Microsoft.Office.Core;
    using Microsoft.Office.Interop.Excel;

    基本的操作方式:
       Application excel = new ApplicationClass();
                    excel.Visible = false;
                    Workbook wb = excel.Workbooks._Open(modelFile, Missing.Value, Missing.Value, Missing.Value, Missing.Value
                        , Missing.Value, Missing.Value, Missing.Value, Missing.Value
                        , Missing.Value, Missing.Value, Missing.Value, Missing.Value);

                    Worksheet xSheet = (Worksheet)wb.Sheets[1];

            //Sheets sts = wb.Worksheets;
            //_Worksheet st = (_Worksheet)sts.get_Item(1);
            //st.Cells[3, 5] = "111"; //直接在cell上写值
            //st.Cells[2, 5] = "hahaha";

                    Range range = xSheet.get_Range("A3", "H3");
                    object[] objLines = { a200.Date, a200.PreviousClosePrice, a200.OpenPrice, a200.High, a200.Low, a200.Close, a200.Change, a200.ChangeRate };
                    range.set_Value(Missing.Value, objLines);

                    wb.SaveAs(fileName, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, XlSaveAsAccessMode.xlNoChange,
                        Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);

                    //wb.Close(false, Missing.Value, Missing.Value);

    //以下步骤必须进行,否则Excel在进程里不能自动释放
                    NAR(range);
                    NAR(xSheet);
                    wb.Close(false, Missing.Value, Missing.Value);
                    NAR(wb);                    
                    excel.Quit();
                    NAR(excel);
                    System.GC.Collect();


    //以往的做法是将进程里所以的Excel进程Kill掉,不推荐!


    private void NAR(object o)
            {
                try
                {
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(o);//强制释放一个对象
                }
                catch { }
                finally
                {
                    o = null;
                }
            }

    二. 通过OLEDB操作Excel
         OleDbConnection conn = null;
                try
                {
                  //fileName 表示要操纵的Excel的文件路径,如果excel不存在,现创建它,可以通过模版文件复制创建。
                    string strConn;
                    strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" +
                    "Data Source=" + fileName + ";" +
                    "Extended Properties='Excel 8.0;HDR=no;IMEX=0'";

                    conn = new OleDbConnection(strConn);
                    conn.Open();
                    System.Data.OleDb.OleDbCommand cmd = new System.Data.OleDb.OleDbCommand();
                    cmd.Connection = conn;
                    //在Excel的Sheet1的A3到H3处插入数据
                    cmd.CommandText = "insert into [Sheet1$A3:H3] (F1,F2,F3,F4,F5,F6,F7,F8) values('" + a200.Date + "','"
                        + a200.PreviousClosePrice + "','" + a200.OpenPrice + "','" + a200.High + "','" + a200.Low + "','" + a200.Close + "','" +
                        a200.Change + "','" + a200.ChangeRate + "')";
                    cmd.ExecuteNonQuery();
                    conn.Close();
                }
                catch (Exception e)
                {
                    if (conn != null)
                        conn.Close();
                    Console.WriteLine(e.ToString());
                }

    注:
    1)使用 Excel 工作簿时,默认情况下,区域中的第一行是标题行(或字段名称)。如果第一个区域不包含标题,您可以在连接字符串的扩展属性中指定 HDR=NO。
    如果您在连接字符串中指定 HDR=NO,Jet OLE DB 提供程序将自动为您命名字段(F1 表示第一个字段,F2 表示第二个字段,依此类推);
    2)IMEX=1将所有读入数据
    看作字符,其他值(0、2)请查阅相关帮助文档;3)如果出现“找不到可安装的isam”错误,一般是连接字符串错误。

    3、从excel文件读取数据
    string sql = "select * from [sheet1$]";
    DoOleSql(sql,"test.xls");

    4、更新excel文件中的数据
    string sql = "update [sheet1$] set FieldName1='333' where FieldName2='b3'";
    DoOleSql(sql,"test.xls");

    5、向excel文件插入数据
    string sql = "insert into [sheet1$](FieldName1,FieldName2,…) values('a',’b’,…)";
    DoOleSql(sql,"test.xls");

    6、删除excel文件中的数据:不提倡使用这种方法
    7、对于非标准结构的excel表格,可以指定excel中sheet的范围
    1)读取数据:string sql = "select * from [sheet1$A3:F20]";
    2)更新数据:string sql = "update [sheet1$A9:F15] set FieldName='333' where AnotherFieldName='b3'";
    3)插入数据:string sql = "insert into [sheet1$A9:F15](FieldName1,FieldName2,…) values('a',’b’,…)";
    4)删除数据:不提倡
    注:1)代码根据需要可以自行修改;2)如果出现“操作必须使用一个可更新的查询”错误,可能sql语句中对excel文件中的“字段”引用有错误,或对excel文件不
    具有“修改”权限;3)如果出现“不能扩充选定范围”错误,可能是对excel文件引用的“范围”有错误。

  • 相关阅读:
    10.并发包阻塞队列之ArrayBlockingQueue
    【PHP】最详细PHP从入门到精通(三)——PHP中的数组
    新随笔222
    新随笔
    iOS常用加密算法介绍和代码实践
    5.在MVC中使用泛型仓储模式和工作单元来进行增删查改
    Directx11学习笔记【二十】 使用DirectX Tool Kit加载mesh
    什么是Dagger2
    嗯嗯

  • 原文地址:https://www.cnblogs.com/chuncn/p/1490764.html
Copyright © 2011-2022 走看看