读取Excel资料并存入数据库的方法介绍
这里讨论的是如何将Excel中存放的资料存入数据库中相应栏位的方法
例如:
这是原始的Excel资料
这是导入到数据库中的存放形式
首先需要对Excel的内容进行修改操作,使其能够符合DB的基本格式,修改的方法可以在上传Excel文件的时候就执行,让上传后的文件是正确的格式。如果系统不需要实现上传功能,也必须将修改后的文件存放在某个位置。
下面举例说明如何修改
因为在将数据读入到DataTable的时候,会默认其中的第一行为表头,因此就需要对下面这样的Excel的第一行数据进行修改:
修改后需要变成这样的形式:
修改Excel方法如下(参考):
string sourceFile="phs_expense_summary.xls";//文件名
string templatePath=Server.MapPath("..")+"""Files""";//路径
string downloadPath=Server.MapPath("..");
string tempFileName="Test"+".xls";
Excel.Application myExcel=new Excel.Application();
myExcel.Visible=true;
myExcel.Application.Workbooks.Open(templatePath+""""+sourceFile,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);
Excel.Workbook myBook=myExcel.Workbooks[1];
Excel.Worksheet curSheet = (Excel.Worksheet)myBook.Sheets[1];
string downloadFilePath=downloadPath+""""+tempFileName;
//Sheet重命名
curSheet.Name="Sheet1";
Excel.Range range;
// 取C1这个格的值
range = curSheet.get_Range("C1",Type.Missing);
range = range.get_Resize(1,1);
string s = range.get_Value(Type.Missing).ToString();
if(s!="C"&&s!="c")
{
//删除Excel文件第一行数据
Range row=(Range)curSheet.Cells[1,Type.Missing];
row.EntireRow.Delete(Excel.XlDirection.xlUp);
//将现在第一行每列赋值
myExcel.Cells[1,1]="A";
myExcel.Cells[1,2]="B";
myExcel.Cells[1,3]="C";
myExcel.Cells[1,4]="D";
myExcel.Cells[1,5]="E";
myExcel.Cells[1,6]="F";
}
int t=curSheet.UsedRange.Rows.Count;
Excel.Range r;
for(int i=1;i<=curSheet.UsedRange.Rows.Count;i++)
{
r=curSheet.get_Range(curSheet.Cells[i,3],curSheet.Cells[i,3]);
string str=r.Text.ToString();
if(str==""||str==null||str=="aaaaaaa"||str=="bbbbbbb"||str=="ccccccc"||str=="ddddddd"||str=="eeeeeee"||str=="fffffff")
{
((Excel.Range)curSheet.Rows[i, Missing.Value]).Delete(Excel.XlDeleteShiftDirection.xlShiftUp);
i=i-1;
}
}
foreach (Excel.Workbook book in myExcel.Application.Workbooks)
{
book.Save();
}
myBook.Close(false,Type.Missing, Type.Missing);
GC.Collect();
处理完对Excel内容的修改后,就可以对其进行读取。
在项目中创建一个读取Excel的类(ReadExcel.cs):
using System;
using System.Data;
using System.Data.OleDb;
namespace AUOITMS.Component.ObtainExcelTool
{
/// <summary>
/// 读文件
/// </summary>
/// <param "fileName">导入文件名称</param>
/// <param "tableName">Excel中Sheet的名称 </param>
public interface IReadExcel
{
DataTable ReadExcel(string fileName,string tableName);
}
/// <summary>
/// ReadFile 的摘要说明。
/// </summary>
public class OleDbReadExcel:IReadExcel
{
public OleDbReadExcel()
{
}
public DataTable ReadExcel(string fileName,string tableName)
{
string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=";
strConn = strConn + fileName+";";
strConn = strConn + "Extended Properties=Excel 8.0;";
string strSql = "Select* from [" + tableName + "$]";
try
{
OleDbConnection conn = new OleDbConnection(strConn);
OleDbDataAdapter myCommand = new OleDbDataAdapter(strSql, strConn);
DataSet myDataSet = new DataSet();
myCommand.Fill(myDataSet,"Table");
return myDataSet.Tables["Table"];
}
catch
{
throw new Exception("Please_Sure_ExcelName_And_Table_Are_Correct");
}
}
}
}
在Manager中定义:
public IReadExcel GetReadExcel()
{
return new OleDbReadExcel();
}
这样,在页面上定义该Manager就可以进行读取:
AUOITMSAssetManager AUOITMS = new AUOITMSAssetManager(this);
IReadExcel obtainTable = AUOITMS.GetReadExcel();
DataTable dt = obtainTable.ReadExcel(strConn,txtTableName.Text.Trim());
注:这里的ReadExcel的两个参数分别对应Excel存放的路径和该Excel中相应的Sheet名称。需要注意的是,这里读取的应该是经过修改后的文件。
这样就完成了将Excel中的内容读取到DataTable中,Excel中的第一行数据将会默认为表头。接下来就可以对GridView进行绑定,或者将数据存入数据库中相应的Table。