C#读取Excel sheet方法

摘要:
最近,我忙于思考项目优化。我发现以前导入Excel时,我在执行“如何获取要从Excel导入的工作表的名称”时速度非常慢。今天,我在互联网上找到了一种更好、更方便的方法;原始Excel导入代码如下:privatevoidEcxelToGridView(){labelControl1.Text=“”;//根据路径打开Excel文件,并将数据填充到ds-stringstrConn=“Provider=Mic

最近忙着思考项目优化的工作,发现以前 导入excel的时候,再执行“如何获取excel要导入的sheet名称”的时候特别慢,今天在网上找了比较好,并且更方便的方法;

原先导入excel代码如下:

private void EcxelToGridView()
        {
            labelControl1.Text 
= " ";
            
//根据路径打开一个Excel文件并将数据填充到ds中
            string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = " + BtnExcPath.Text    + ";Extended Properties ='Excel 8.0;HDR=YES;IMEX=1'";
            OleDbConnection conn 
= new OleDbConnection(strConn);
            conn.Open();
            
string strExcel = "";
            OleDbDataAdapter myCommand 
= null;
            
//获取Excel中的sheet的名称(当执行到这句的时候特别慢,消耗资源太多)
              string SheetName = GetExcelSheetNames(BtnExcPath.Text)[0];
            
//方法一:直接写死为第一个sheet1,这么扩展性不好
            
//strExcel = "select * from [sheet1$]";
            
//方法二:目前也是只取第一页但是可以给出提示
            strExcel = "select * from [" + SheetName + "$]";
            myCommand 
= new OleDbDataAdapter(strExcel, strConn);
            System.Data.DataSet ds 
= new System.Data.DataSet();
            myCommand.Fill(ds, 
"table1");
            conn.Close();
            List
<string> strList = new List<string>();
            
string str = string.Empty;
            strList.Clear();
            
if (ds.Tables["table1"].Rows.Count == 0)
            {
                MessageBoxShow.ShowProMessage(
"要导入的Excel没有数据");
            }
        }
        
/// <summary>
        
/// 获取获得当前你选择的Excel Sheet的所有名字
        
/// </summary>
        
/// <param name="filePath"></param>
        
/// <returns></returns>
        public static string[] GetExcelSheetNames(string filePath)
        {
            Microsoft.Office.Interop.Excel.ApplicationClass excelApp 
= new Microsoft.Office.Interop.Excel.ApplicationClass();
            Microsoft.Office.Interop.Excel.Workbooks wbs 
= excelApp.Workbooks;
            Microsoft.Office.Interop.Excel.Workbook wb 
= wbs.Open(filePath, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
            Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
            Type.Missing, Type.Missing, Type.Missing, Type.Missing);
            
int count = wb.Worksheets.Count;
            
string[] names = new string[count];
            
for (int i = 1; i <= count; i++)
            {
                names[i 
- 1= ((Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets[i]).Name;
            }
            wb.Close(
nullnullnull);
            excelApp.Quit();
            wbs.Close();
            System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(wbs);
            excelApp 
= null;
            wbs 
= null;
            wb 
= null;
            
return names;
        }

第二种方法:

private void EcxelToGridView()
        {
            labelControl1.Text 
= " ";
            
//根据路径打开一个Excel文件并将数据填充到ds中
            string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = " + BtnExcPath.Text + ";Extended Properties ='Excel 8.0;HDR=YES;IMEX=1'";
            OleDbConnection conn 
= new OleDbConnection(strConn);
            conn.Open();
            
string strExcel = "";
            OleDbDataAdapter myCommand 
= null;
            DataTable dtSheetName 
= conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { nullnullnull"Table" });
            
//包含excel中表名的字符串数组
            string[] strTableNames = new string[dtSheetName.Rows.Count];
            
for (int k = 0; k < dtSheetName.Rows.Count; k++)
            {
//我是倒序插入到strTableNames中,因为dtSheetName中行是从后往前读sheet页的
                strTableNames[k] = dtSheetName.Rows[dtSheetName.Rows.Count-k-1]["TABLE_NAME"].ToString();
            }
             
//从指定的表明查询数据,可先把所有表明列出来供用户选择
            strExcel = "select * from [" + strTableNames[0+ "]";
            myCommand 
= new OleDbDataAdapter(strExcel, strConn);
            System.Data.DataSet ds 
= new System.Data.DataSet();
            myCommand.Fill(ds, 
"table1");
            conn.Close();
            List
<string> strList = new List<string>();
            
string str = string.Empty;
            strList.Clear();
            
if (ds.Tables["table1"].Rows.Count == 0)
            {
                MessageBoxShow.ShowProMessage(
"要导入的Excel没有数据");
            }
       }

免责声明:文章转载自《C#读取Excel sheet方法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【单片机】【PIC16F1937】之定时器Unity3d dll 热更新 基础框架下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Java用SAX解析XML

要解析的XML文件:myClass.xml 1 <?xml version="1.0" encoding="utf-8"?> 2 <class> 3 <stu id="001"> 4 <name>Allen</name> 5 <sex>男</sex> 6 &l...

跟我一起玩Win32开发(10):绘图(C)

今天我们来欣赏一下用于填充图形的函数,当然我不会逐个去介绍,因为我们参考MSDN直接套参数就可以了。 SetDCBrushColor函数有必要扯一下,它的声明如下: [cpp] view plain copy  COLORREF SetDCBrushColor(     __in  HDC hdc,     __in  COLORREF crCo...

java登录拦截Filter

此例子为一个简单的登录拦截。 首先在web.xml中配置拦截类。 <filter-mapping> <filter-name>SessionFilter</filter-name> <url-pattern>/*</url-pattern> &...

Web Service学习之六:CXF解决无法处理的数据类型

  CXF不能够处理像Map复杂的数据类型,需要单独转换处理。 总体思路:创建一个转换器和一个对应的可以处理的数据结构类型,将不能处理的类型转换成可以处理的类型: 步骤: 一、创建一个可以处理的类型 举例:要转换Map<String,User> package ws; import java.util.List; public class...

wxpython ItemContainer

ItemContainer 是 很多可以添加string item的部件的父类,封装很多有用的方法,可以用来获取部件的被选中item 的string 如wx.ListBox ,wx.CheckListBox,wx.Choice,wx.ComboBox。 这些部件可以添加string ,并且内部对它们索引访问。  string GetString(self,...

通过JDBC进行简单的增删改查(以MySQL为例)

通过JDBC进行简单的增删改查(以MySQL为例) 目录 前言:什么是JDBC 一、准备工作(一):MySQL安装配置和基础学习 二、准备工作(二):下载数据库对应的jar包并导入 三、JDBC基本操作 (1)定义记录的类(可选) (2)连接的获取 (3)insert (4)update (5)select (6)delete 四、测试 五、代码分析 六...