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;
}
``