zoukankan      html  css  js  c++  java
  • C# 操作Excel基础篇(读取Excel、写入Excel)

    注意事项:Excel的数据表中最多只能储存65535行数据,超出后,需要将数据分割开来进行储存。同时对于Excel中的乱码象限,是由于编码的错误方式导致引起的!

    一、读取Excel数据表,获得DataSet数据内存

    我们先看一下网上比较流行的一段代码,然后进行分析说明。

     1     //加载Excel 
     2         public static DataSet LoadDataFromExcel(string filePath)
     3         {
     4             try
     5             {
     6                 string strConn;
     7                 strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended Properties='Excel 8.0;HDR=False;IMEX=1'";
     8                 OleDbConnection OleConn = new OleDbConnection(strConn);
     9                 OleConn.Open();
    10                 String sql = "SELECT * FROM  [Sheet1$]";//可是更改Sheet名称,比如sheet2,等等 
    11 
    12                 OleDbDataAdapter OleDaExcel = new OleDbDataAdapter(sql, OleConn);
    13                 DataSet OleDsExcle = new DataSet();
    14                 OleDaExcel.Fill(OleDsExcle, "Sheet1");
    15                 OleConn.Close();
    16                 return OleDsExcle;
    17             }
    18             catch (Exception err)
    19             {
    20                 MessageBox.Show("数据绑定Excel失败!失败原因:" + err.Message, "提示信息",
    21                     MessageBoxButtons.OK, MessageBoxIcon.Information);
    22                 return null;
    23             }
    24         }

    给我们的第一感觉是:C#程序自然就把Excel文件的数据表等同一张数据库来对待了!与ACCESS数据库极为相似。我们对此拆分分解。

    1.1 连接字符串

     strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended Properties='Excel 8.0;HDR=False;IMEX=1'";

    这里特别说明的是:Provider “Microsoft.Jet.OLEDB.4.0”数据库连接驱动是针对office2003之前的数据列表的,自从07年后就对此进行了代码修正,扩充改成了,strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filePath + ";Extended Properties='Excel 12.0;HDR=False;IMEX=1'";在此需要安装对应的数据连接驱动AccessDatabaseEngine;

    连接字符串中,特别之处的是,Provider是数据连接驱动的接口对应形式,也可以理解成数据库软件的提供者;DataSource指的是:数据表的地址,也就是指的数据库特定的文件。http://blog.csdn.net/superhoy/article/details/8264133

    Jet 引擎,可以访问Office97-2003,但不能访问 Office 2007。

    ACE 引擎,是随Office2007一起发布的数据库连接组件,既可以访问 Office 2007,也可以访问Office97-2003。

    另外:Microsoft.ACE.OLEDB.12.0 可以访问正在打开的 Excel 文件,而 Microsoft.Jet.OLEDB.4.0 是不可以的。 

    HDR 表示第一行是否是标题行。

    • 若为 YES,则第一行是标题行(即列名称),不是数据;
    • 若为 NO,则第一行不是标题行,跟后面的行一样,是数据。

    IMEX 表示混合数据类型时如何处理。

    • 若为 0,则为输出模式,此情况下只能用作写入 Excel;
    • 若为 1,则为输入模式,此情况下只能用作读取 Excel,并且始终将 Excel 数据作为文本类型读取;
    • 若为 2,则为连接模式,此情况下既可用作写入、也可用作读取。

        Excel 第一行第一列可以存储字符串,第二行第一列又可以存储数字……同样的列,存储不同的数据类型,这就形成了混合数据类型。

        所以若要读取混合数据类型,应该将 IMEX 设置为 1;若误设置为 0,则读取不到任何行;若误设置为 2 或省略,则有些数据读取出来是空白。

    DataSet的简介

    一个DataSet中包含多个DataTable,一个DataTable又包含有多个Row,这就是我们操作DataSet的基础啦!!!

    二、写入Excel数据表,及时保存内容

    我们先看一下网上比较流行的一段代码,然后进行分析说明。

     1 public static bool SaveDataTableToExcel(System.Data.DataTable excelTable, string filePath)
     2         {
     3             Microsoft.Office.Interop.Excel.Application app =
     4                 new Microsoft.Office.Interop.Excel.ApplicationClass();
     5             try
     6             {
     7                 app.Visible = false;
     8                 Workbook wBook = app.Workbooks.Add(true);
     9                 Worksheet wSheet = wBook.Worksheets[1] as Worksheet;
    10                 if (excelTable.Rows.Count > 0)
    11                 {
    12                     int row = 0;
    13                     row = excelTable.Rows.Count;
    14                     int col = excelTable.Columns.Count;
    15                     for (int i = 0; i < row; i++)
    16                     {
    17                         for (int j = 0; j < col; j++)
    18                         {
    19                             string str = excelTable.Rows[i][j].ToString();
    20                             wSheet.Cells[i + 2, j + 1] = str;
    21                         }
    22                     }
    23                 }
    24 
    25                 int size = excelTable.Columns.Count;
    26                 for (int i = 0; i < size; i++)
    27                 {
    28                     wSheet.Cells[1, 1 + i] = excelTable.Columns[i].ColumnName;
    29                 }
    30                 //设置禁止弹出保存和覆盖的询问提示框 
    31                 app.DisplayAlerts = false;//用来提示覆盖保存的修改!可以删除后尝试一下效果就可以了!!!
    32                 app.AlertBeforeOverwriting = false;
    33                 //保存工作簿 
    34                 wBook.Save();
    35                 //保存excel文件 
    36                 app.Save(filePath);
    37                 app.SaveWorkspace(filePath);
    38                 app.Quit();
    39                 app = null;
    40                 return true;
    41             }
    42             catch (Exception err)
    43             {
    44                 MessageBox.Show("导出Excel出错!错误原因:" + err.Message, "提示信息",
    45                     MessageBoxButtons.OK, MessageBoxIcon.Information);
    46                 return false;
    47             }
    48             finally
    49             {
    50             }
    51         }

    首先我们通过这份代码,知道这是针对2003之前的Excel数据列表展开的。在03之前的时候,一个EXCEl程序只能打开一个文件,也就是工作薄。现在的话,好了可以同时打开很多工作薄。第8行代码和34行代码的关系,我们有这样一个疑问,添加一个工作薄,直接保存的话,需要我们为之指定一个储存地址的 啊!!! 需要改成wBook.saveAS()方法与之对应。或者相应的方法,必须指定地址。如果第8行代码改成open()而不是add()的话,那样的话也就可以了。

    我们通过上述代码,可以明显分析得到,对于写入的话,就好比我们去操作相应的软件程序去操作文件。注意.Application app 的使用关系。

  • 相关阅读:
    Hdu 1094 A+B for Input-Output Practice (VI)
    Hdu 1091 A+B for Input-Output Practice (III)
    Hdu 1092 A+B for Input-Output Practice (IV)
    Hdu 1087 Super Jumping! Jumping! Jumping!
    scala学习笔记2(类,继承,抽象类)
    scala学习笔记1(表达式)
    把以前写的几个Linux Framebuffer小工具放到github上了,直接去下吧,别找我要了
    一位台湾朋友刚建的一个FTK的论坛,欢迎加入讨论
    Linux高端内存的由来
    read系统调用深度剖析
  • 原文地址:https://www.cnblogs.com/liuxiaowei0543/p/3632206.html
Copyright © 2011-2022 走看看