保存并删除使用HttpPostedFileBase保存的Excel文件

时间:2015-09-23 11:12:01

标签: c# excel asp.net-mvc-4 httppostedfilebase

我正在上传Excel文件并从中提取数据并将其保存到数据库中。我正在使用MVC4 .NET Framework。这是我的课程代码:

 public static void Upload(HttpPostedFileBase File)
        {
            NIKEntities1 obj = new NIKEntities1();
            MyApp = new Excel.Application();
            MyApp.Visible = false;
            string extension = System.IO.Path.GetExtension(File.FileName);

            string pic = "Excel" + extension;

            string path = System.IO.Path.Combine(System.Web.HttpContext.Current.Server.MapPath("~/Excel"), pic);

            File.SaveAs(path);


            MyBook = MyApp.Workbooks.Open(path);
            MySheet = (Excel.Worksheet)MyBook.Sheets[1]; // Explicit cast is not required here
            int lastRow = MySheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell).Row;
            List<Employee> EmpList = new List<Employee>();

            for (int index = 2; index <= lastRow; index++)
            {
                System.Array MyValues = (System.Array)MySheet.get_Range("A" +
                   index.ToString(), "B" + index.ToString()).Cells.Value;
                EmpList.Add(new Employee
                {
                    BatchID = MyValues.GetValue(1, 1).ToString(),
                    BatchName = MyValues.GetValue(1, 2).ToString()

                });
            }

            for (int i = 0; i < EmpList.Count; i++)
            {
                int x=obj.USP_InsertBatches(EmpList[i].BatchID, EmpList[i].BatchName);

            }    
        }
    }
    class Employee
    {
        public string BatchID;
        public string BatchName;
    }

此代码第一次完美运行,但下次它说该文件当前正在使用中。所以我想到使用以下行删除代码末尾的文件:

File.Delete(path);

但这一行引发了错误:

  

HttpPostedFileBase不包含Delete

的定义

此外,如果我不写这一行并尝试再次执行代码,则说它无法保存,因为文件存在同名并且由于当前正在使用而无法替换。

我该怎么做才能摆脱这个:

  (File.Delete()) Error

访问我未收到保存的Excel文件的任何其他方式也非常有用,因为我只需要访问一次数据。

2 个答案:

答案 0 :(得分:2)

您使用的File是您的变量,它是您方法的输入参数。该参数的类型为HttpPostedFileBase,该类型没有instance methods(也不是静态的),允许您删除File实例。

您可能正在寻找File命名空间中System.IO类型的静态Delete方法。

一个quickfix将明确指出您的File

System.IO.File.Delete(path);

您可能希望考虑针对变量的不同命名准则。在c#中,我们倾向于以小写字母开头写变量。几乎框架中的所有类型都以大写字母开头。这样可以更轻松地区分事物file和类型File

请注意,只有文件被所有进程关闭并且文件系统清除了所有文件句柄时,才能删除该文件。在您的情况下,您必须确保Excel关闭文件并释放它的句柄。如果您正在运行搜索索引器或粗略的病毒扫描程序,您可能需要在放弃之前尝试几次。

我通常使用此代码:

 // make sure here all Ole Automation servers (like Excel or Word)
 // have closed the file (so close the workbook, document etc)
 // we iterate a couple of times (10 in this case)
 for(int i=0; i< 10; i++) 
 {
     try 
     {
        System.IO.File.Delete(path);
        break;
     } catch (Exception exc) 
     {
         Trace.WriteLine("failed delete {0}", exc.Message);
         // let other threads do some work first
         // http://blogs.msmvps.com/peterritchie/2007/04/26/thread-sleep-is-a-sign-of-a-poorly-designed-program/
         Thread.Sleep(0);
     }
 }

答案 1 :(得分:0)

据我所知,您正在打开Excel,阅读该文件但从未关闭Excel。

添加:

MyApp.Workbooks.Close();
MyApp.Quit();

在上传功能结束时。更好的是,包装你得到的整个代码

try{
  //here goes your current code
}
catch(Exception e)
{
 //manage exception
}
finally
{
MyApp.Workbooks.Close();
MyApp.Quit();
}

您在try catch块之外初始化MyApp,然后关闭文件发生任何事情。