我有一个界面,允许用户选择在ASP.NET MVC 4中开发的excel表。在这里,用户将数据填入excel表(2000+)并将数据插入数据库表(oracle 12c)。我能够读取excel文件并将数据存储到数据库中,但速度太慢。我循环遍历每一行并每次调用存储过程来插入数据。请建议我将excel文件上传到oracle db的最佳和最快的方法。
答案 0 :(得分:1)
请使用下面提到的代码。它正在工作。
public JsonResult UploadVolunteer(HttpPostedFileBase postedFile)
{
string filePath = string.Empty;
if (postedFile != null)
{
string path = Server.MapPath("~/ExcelFiles/");
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
filePath = path + Path.GetFileName(postedFile.FileName);
string extension = Path.GetExtension(postedFile.FileName);
postedFile.SaveAs(filePath);
string conString = string.Empty;
switch (extension)
{
case ".xls": //Excel 97-03.
conString = ConfigurationManager.ConnectionStrings["Excel03ConString"].ConnectionString;
break;
case ".xlsx": //Excel 07 and above.
conString = ConfigurationManager.ConnectionStrings["Excel07ConString"].ConnectionString;
break;
}
DataTable dt = new DataTable();
conString = string.Format(conString, filePath);
using (OleDbConnection connExcel = new OleDbConnection(conString))
{
using (OleDbCommand cmdExcel = new OleDbCommand())
{
using (OleDbDataAdapter odaExcel = new OleDbDataAdapter())
{
cmdExcel.Connection = connExcel;
//Get the name of First Sheet.
connExcel.Open();
DataTable dtExcelSchema;
dtExcelSchema = connExcel.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
string sheetName = dtExcelSchema.Rows[0]["TABLE_NAME"].ToString();
connExcel.Close();
//Read Data from First Sheet.
connExcel.Open();
cmdExcel.CommandText = "SELECT * From [" + sheetName + "]";
odaExcel.SelectCommand = cmdExcel;
odaExcel.Fill(dt);
connExcel.Close();
}
}
}
conString = ConfigurationManager.ConnectionStrings["MDRFDBContext"].ConnectionString;
using (SqlConnection con = new SqlConnection(conString))
{
using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(con))
{
//Set the database table name.
sqlBulkCopy.DestinationTableName = "dbo.Volunteer";
//[OPTIONAL]: Map the Excel columns with that of the database table
sqlBulkCopy.ColumnMappings.Add("Volunteer_Id", "Volunteer_Id");
sqlBulkCopy.ColumnMappings.Add("Volunteer_Name", "Volunteer_Name");
sqlBulkCopy.ColumnMappings.Add("Volunteer_Age", "Volunteer_Age");
sqlBulkCopy.ColumnMappings.Add("Volunteer_Gender", "Volunteer_Gender");
sqlBulkCopy.ColumnMappings.Add("Volunteer_Religion", "Volunteer_Religion");
sqlBulkCopy.ColumnMappings.Add("Volunteer_Mother_Tongue", "Volunteer_Mother_Tongue");
sqlBulkCopy.ColumnMappings.Add("Volunteer_Phone_No", "Volunteer_Phone_No");
sqlBulkCopy.ColumnMappings.Add("Study_Id", "Study_Id");
sqlBulkCopy.ColumnMappings.Add("Screening_Status", "Screening_Status");
sqlBulkCopy.ColumnMappings.Add("Volunteer_Status", "Volunteer_Status");
sqlBulkCopy.ColumnMappings.Add("Consent_Obtained", "Consent_Obtained");
sqlBulkCopy.ColumnMappings.Add("Screening_Result_Reason", "Screening_Result_Reason");
sqlBulkCopy.ColumnMappings.Add("Screening_Emp_Id", "Screening_Emp_Id");
sqlBulkCopy.ColumnMappings.Add("Consent_Form", "Consent_Form");
sqlBulkCopy.ColumnMappings.Add("Created_By", "Created_By");
sqlBulkCopy.ColumnMappings.Add("Created_Date", "Created_Date");
sqlBulkCopy.ColumnMappings.Add("Modified_By", "Modified_By");
sqlBulkCopy.ColumnMappings.Add("Modified_Date", "Modified_Date");
sqlBulkCopy.ColumnMappings.Add("Approved_By", "Approved_By");
sqlBulkCopy.ColumnMappings.Add("Approved_Date", "Approved_Date");
sqlBulkCopy.ColumnMappings.Add("Volunteer_Site", "Volunteer_Site");
sqlBulkCopy.ColumnMappings.Add("Volunteer_Sub_Status", "Volunteer_Sub_Status");
sqlBulkCopy.ColumnMappings.Add("Path", "Path");
//sqlBulkCopy.ColumnMappings.Add("Volunteer_Id", "Volunteer_Id");
//sqlBulkCopy.ColumnMappings.Add("Volunteer_Id", "Volunteer_Id");
//sqlBulkCopy.ColumnMappings.Add("Volunteer_Id", "Volunteer_Id");
//sqlBulkCopy.ColumnMappings.Add("Volunteer_Id", "Volunteer_Id");
//sqlBulkCopy.ColumnMappings.Add("Volunteer_Id", "Volunteer_Id");
//sqlBulkCopy.ColumnMappings.Add("Volunteer_Id", "Volunteer_Id");
con.Open();
sqlBulkCopy.WriteToServer(dt);
con.Close();
}
}
}
return Json("Sucess");
}
在webconfig中,我们想添加下面提到的代码:
<connectionStrings>
<add name="Excel03ConString" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;HDR=YES'"/>
<add name="Excel07ConString" connectionString="Provider=Microsoft.ACE.OLEDB.14.0;Data Source={0};Extended Properties='Excel 8.0;HDR=YES'"/>
<add name="MDRFDBContext" connectionString="Data Source=fujitsu;Initial Catalog=MDRFDataBase; Connection Timeout=0; User ID=sa; Password=root" providerName="System.Data.SqlClient" />
</connectionStrings>
答案 1 :(得分:0)
using Spire.XLS;
string filePath = txt_File_Location.Text;
string Access = System.Windows.Forms.Application.StartupPath + "\\BRW_SalesOrder";
string Excel = txt_File_Location.Text;
string connect = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Excel + ";Extended Properties=Excel 12.0;";
Excel.Application xlApp;
Excel.Workbook xlWorkBook;
Excel.Worksheet xlWorkSheet;
Excel.Range range;
string str, str1;
int rCnt, rCnt1;
int cCnt, cCnt1;
int rw = 0;
int cl = 0;
xlApp = new Excel.Application();
xlWorkBook = xlApp.Workbooks.Open(Excel, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
range = xlWorkSheet.UsedRange;
rw = range.Rows.Count;
cl = range.Columns.Count;
//Ship-Via,Payment-Terms,Po Number, Order-Date
Microsoft.Office.Interop.Excel.Range Range_Number_Ship, Range_Number_PT, Range_Number_CPO, Range_Number_OD, r2;
Range_Number_Ship = xlWorkSheet.UsedRange.Find("Ship Via");
Range_Number_PT = xlWorkSheet.UsedRange.Find("Payment Terms");
Range_Number_CPO = xlWorkSheet.UsedRange.Find("Customer PO Number");
Range_Number_OD = xlWorkSheet.UsedRange.Find("Order Date");
string f_number_Ship = "", f_number_PT = "", f_number_CPO = "", f_number_OD = "";
r2 = xlWorkSheet.Cells;
int n_c_Ship = Range_Number_Ship.Column;
int n_r_Ship = Range_Number_Ship.Row;
int n_c_PT = Range_Number_PT.Column;
int n_r_PT = Range_Number_PT.Row;
int n_c_CPO = Range_Number_CPO.Column;
int n_r_CPO = Range_Number_CPO.Row;
int n_c_OD = Range_Number_OD.Column;
int n_r_OD = Range_Number_OD.Row;
var number_Ship = ((Range)r2[n_r_Ship, n_c_Ship + 4]).Value;
f_number_Ship = (string)number_Ship;
var number_PT = ((Range)r2[n_r_PT, n_c_PT + 4]).Value;
f_number_PT = (string)number_PT;
var number_CPO = ((Range)r2[n_r_CPO, n_c_CPO + 4]).Value;
f_number_CPO = (string)number_CPO;
var number_OD = ((Range)r2[n_r_OD, n_c_OD + 4]).Value;
f_number_OD = ((DateTime)number_OD).ToString("MM/dd/yyyy");
//Ship-Address
Microsoft.Office.Interop.Excel.Range Range_Number_SHIPADD, r6;
Range_Number_SHIPADD = xlWorkSheet.UsedRange.Find("Ship To");
string f_number_SHIPADD = ""; ;
r6 = xlWorkSheet.Cells;
int n_c_SHIPADD = Range_Number_SHIPADD.Column;
int n_r_SHIPADD = Range_Number_SHIPADD.Row;
for (rCnt = n_r_SHIPADD + 1; rCnt <= rw; n_r_SHIPADD++)
{
var number_SHIPADD = ((Range)r6[n_r_SHIPADD + 1, n_c_SHIPADD]).Value;
if (number_SHIPADD == null)
{
break;
}
else
{
f_number_SHIPADD = (string)number_SHIPADD;
}
}
//Sales-Representation
Microsoft.Office.Interop.Excel.Range Range_Number_SalesRep, r7;
Range_Number_SalesRep = xlWorkSheet.UsedRange.Find("Sales Rep");
string f_number_SalesRep = ""; ;
r7 = xlWorkSheet.Cells;
int n_c_SalesRep = Range_Number_SalesRep.Column;
int n_r_SalesRep = Range_Number_SalesRep.Row;
for (rCnt = n_r_SalesRep + 1; rCnt <= rw; n_r_SalesRep++)
{
var number_SalesRep = ((Range)r7[n_r_SalesRep, n_c_SalesRep]).Value;
if (number_SalesRep == null)
{
break;
}
else
{
f_number_SalesRep = (string)number_SalesRep;
StringBuilder sb = new StringBuilder();
sb.AppendLine(f_number_SalesRep);
string pattern = @"Sales Rep: [A-Za-z]+\s[A-Za-z]+";
var result = Regex.Match(f_number_SalesRep, pattern, RegexOptions.Multiline).ToString().Split(':')[1];
f_number_SalesRep = result.ToString();
// string test = f_number_SalesRep.Substring(f_number_SalesRep.IndexOf("Sales Rep"), (f_number_SalesRep.IndexOf("\nPhone") - f_number_SalesRep.IndexOf("Sales Rep"))).Split(':')[1];
// MessageBox.Show(test);
}
}
//Product-Code
Microsoft.Office.Interop.Excel.Range Range_Number_Produ, r;
Range_Number_Produ = xlWorkSheet.UsedRange.Find("Produ");
string f_number_Produ = "";
r = xlWorkSheet.Cells;
int n_c = Range_Number_Produ.Column;
int n_r = Range_Number_Produ.Row;
string product_no;
//Product-Desc
Microsoft.Office.Interop.Excel.Range Range_Number_Descr, r3;
Range_Number_Descr = xlWorkSheet.UsedRange.Find("Description");
string f_number_Descr = "", f_new_Desc = "";
r3 = xlWorkSheet.Cells;
int n_c_Descr = Range_Number_Descr.Column;
int n_r_Descr = Range_Number_Descr.Row;
rCnt1 = n_r + 1;
rCnt = n_r_Descr + 1;
//Unit Price
Microsoft.Office.Interop.Excel.Range Range_Number_UP, r4;
Range_Number_UP = xlWorkSheet.UsedRange.Find("Unit Price");
double f_number_UP;
r4 = xlWorkSheet.Cells;
int n_c_UP = Range_Number_UP.Column;
int n_r_UP = Range_Number_UP.Row;
int rCnt3 = n_r_UP + 1;
//Quantity
Microsoft.Office.Interop.Excel.Range Range_Number_QTY, r5;
Range_Number_QTY = xlWorkSheet.UsedRange.Find("Qty");
double f_number_QTY;
r5 = xlWorkSheet.Cells;
int n_c_QTY = Range_Number_QTY.Column;
int n_r_QTY = Range_Number_QTY.Row;
int rCnt4 = n_r_QTY + 1;
string bn;
test:
for (; rCnt1 <= rw; )
{
var number_Produ = ((Range)r[n_r + 1, n_c]).Value;
f_number_Produ = (string)number_Produ;
if (f_number_Produ != null)
{
//MessageBox.Show(f_number_Produ);
product_no = f_number_Produ;
// comboBox2.Items.Add(product_no);
for (; rCnt <= rw; )
{
var number_Descr = ((Range)r3[n_r_Descr + 1, n_c_Descr - 1]).Value;
f_number_Descr = (string)number_Descr;
if (f_number_Descr != "Sub Total:")
{
f_new_Desc = f_number_Descr;
for (; rCnt4 <= rw; )
{
var number_QTY = (((Range)r5[n_r_QTY + 1, n_c_QTY]).Value).ToString();
bn = "Buyer Name:";
if (number_QTY == bn)
{
break;
}
else
{
f_number_QTY = double.Parse(number_QTY.ToString());
}
for (; rCnt3 <= rw; )
{
var number_UP = ((Range)r4[n_r_UP + 1, n_c_UP - 1]).Value;
if (number_UP != null)
{
f_number_UP = double.Parse(number_UP.ToString());
//string filePath1 = "D:\\PDF Brandwise Orders for MIke.xlsx";
//string Access1 = "D:\\BRW_SalesOrder.mdb";
//string Excel11 = "D:\\PDF Brandwise Orders for MIke.xlsx";
//string connect1 = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Excel + ";Extended Properties=Excel 12.0;";
using (OleDbConnection conn = new OleDbConnection(connect))
{
using (OleDbCommand cmd = new OleDbCommand())
{
OleDbCommand cmd2 = new OleDbCommand();
cmd2.Connection = conn;
cmd.Connection = conn;
conn.Close();
conn.Open();
cmd.CommandText = "INSERT INTO [MS Access;Database=" + Access + "].[Excel_table] (Division,[Customer ID],[Order Date],[Terms Code],[Salesperson],[Ship Via],[Ship To Address Code],[Customer PO],[Item Code]) values('00','" + f_number_CPO + "','" + f_number_OD + "','" + f_number_PT + "','" + f_number_SalesRep + "','" + f_number_Ship + "','" + f_number_SHIPADD + "','" + f_number_CPO + "','" + f_number_Produ + "')";
cmd.ExecuteNonQuery();
cmd2.CommandText = "UPDATE [MS Access;Database=" + Access + "].[Excel_table] set [Item Description]='" + f_new_Desc + "', [Unit Price]='" + f_number_UP + "', [Quantity Ordered]='" + f_number_QTY + "' where [Item Code]='" + product_no + "' and Salesperson='" + f_number_SalesRep + "' and [Order Date]='" + f_number_OD + "' ";
cmd2.ExecuteNonQuery();
n_r++;
n_r_Descr++;
n_r_UP++;
n_r_QTY++;
goto test;
}
}
}
}
}
}
else
{
break;
}
}
}
else
{
break;
}
}
xlWorkBook.Close(true, null, null);
xlApp.Quit();
Marshal.ReleaseComObject(xlWorkSheet);
Marshal.ReleaseComObject(xlWorkBook);
Marshal.ReleaseComObject(xlApp);
MessageBox.Show("Sucessfully upl
oaded...");