C#读入Excel与Csv文件,并存于DataTable,再放入数组

C#读入Excel与Csv文件,并存于DataTable,最终放进数组进行计算

摘要:介绍了 C#读Excel(.xlsx .xls)还有Csv(.CSV)文件,并保存在DataTable中,然后再放进数组里的方法,放进数组就可以做事了。还有每一步的代码。

前言

读文件时候涉及,1.DataTable、2.DataView、3.DataSet,4.OleDbDataAdapter这四个东西。
其中
(一)1.表示内存中数据的一个表,可以是从通过连接从数据库中读取出来形成的一个表。
(二)可以将2.同数据库的视图类比。我目前的理解就是2.是用来可视化1.的。比如,将excel里的数据存到1.以后,想看看读进来的表格,就用2.来可视化。(当然也可能没必要可视化,直接放进数组干活就完了)
(三) DataSet可以比作一个内存中的数据库,DataTable是一个内存中的数据表,DataSet里可以存储多个DataTable。
(四)OleDbDataAdapter是充当 DataSet 和数据源之间的桥梁,用于检索和保存数据。OleDbDataAdapter 通过 Fill这个方法 将数据从数据源(在本文指的是Excel跟CSV)加载到 DataSet 中。

以上仅为个人理解,说的不对可不叼,不过代码是肯定能用的。

OleDb方法读取Excel与CSV(别的方法再说吧)

这里先说几点:
1.读文件的时候的文件路径相关问题,为了不用写一大串子路径,也为了后期整体封装,直接把文件放到了bin->Debug->文件夹下(放到这以后,后期应该可以跟代码一块封装成exe吧?后期更新说明情况)

在这里插入图片描述

2.pathName 无论是读excel还是csv 都代表的是文件名,比如 pathName=“4.CSV”;
3.sheetName 在读excel时,就是单纯Excel里数据在的那个sheet的名字。在读CSV时,
sheetName是地址,按理说我已经把csv放到bin里了,还要什么地址?但是还是要整的,代码中有,用 AppDomain这个类找的。

上马

          
            string PathName = "4.CSV";
            String SheetName= AppDomain.CurrentDomain.BaseDirectory;//csv专用
            // string SheetName = ""; excel专用
            
            
            DataTable dataTable =  ExcelToDataTable(PathName, SheetName);
     //    这就是将文件放入datatable的方法
public static DataTable ExcelToDataTable(string pathName, string sheetName)
        {
            int symbol = 0;
            DataTable tbContainer = new DataTable();
            string strConn = string.Empty; //创建一个空的 string(字段)对象 strConn;
            if (string.IsNullOrEmpty(sheetName)) { sheetName = "Sheet1"; }
            FileInfo file = new FileInfo(pathName);
            if (!file.Exists) { throw new Exception("文件不存在"); }
            string extension = file.Extension;
            switch (extension)
            {
                case ".xls":
                    strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathName + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'";
                    break;
                case ".xlsx":
                    strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + pathName + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'";
                    //strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + pathName + ";Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1\"";
                    break;
                case ".CSV":
                    strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + sheetName + ";Extended Properties='Text;FMT=Delimited;HDR=YES;'";
                    symbol = 1;
                    break;
                default:
                    strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathName + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'";
                    break;
            }
            //链接Excel
            OleDbConnection cnnxls = new OleDbConnection(strConn);
            
            if (symbol == 0)
            {
                OleDbDataAdapter oda = new OleDbDataAdapter(string.Format("select * from [{0}$]", sheetName), cnnxls);

                DataSet ds = new DataSet();
                //将Excel里面有表内容装载到内存表中!
                oda.Fill(tbContainer);
            }
            else
            {
                OleDbDataAdapter myCommand = new OleDbDataAdapter("select * from " + pathName, strConn); ;


                DataSet ds = new DataSet();
                myCommand.Fill(tbContainer);

            }
            //读取Excel里面有 表Sheet1
            //OleDbDataAdapter oda = new OleDbDataAdapter(string.Format("select * from [{0}$]", sheetName), cnnxls);

            //DataSet ds = new DataSet();
            //将Excel里面有表内容装载到内存表中!
            //oda.Fill(tbContainer);
            return tbContainer;
        }  

按理说,这个代码是可以直接用的,输入的两个参数上面说了,输出是一个DataTable,接下来讲DataTable如何整成数组,供我们整活。

DataTable转换成数组的小方法(二维数组为例)

string ExcelName = "4.CSV";
            string filePath= AppDomain.CurrentDomain.BaseDirectory;
            string ExcelSheet = "";
            
            
            DataTable dataTable =  ExcelToDataTable(ExcelName, filePath);

            //DataView dataViewForm1 = new DataView();
            //int a=dataTable.Rows.Count;
            //int b=dataTable.Columns.Count;
            double[,] d = ShuZu(dataTable);
public static double[,] ShuZu(DataTable a)
        {
            double[,] data = new double[a.Rows.Count ,  a.Columns.Count];//定义数组的大小,行数就是DataTable的行数,列数就是DataTable的列数
            for (int i = 0; i < a.Rows.Count; i++)
            {
                for (int j = 0; j < a.Columns.Count; j++)
                {
                    data[i ,  j] = Convert.ToDouble(a.Rows[i][j].ToString());
                }
            }

            return data; 
        }

``

备注:要是文件全是数据的话,数组会缺失第一行,原因我再看看,目前的解决方法是,文件的第一行写上汉字,也就是每列数据所代表的意义

如此,利用c#进行数据导入并进行运算的小套招完毕,小套招是借鉴别人的博文然后自己总结写的,基本可以直接拿去用,弄明白输入输出即可。

如此,希望可以帮助到大家,有用的话记得点个赞。

  • 5
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值