0

我确定我错过了一些明显的东西。

一个简单的任务摆在我面前:“通过 ASP.NET 在表单页面上上传 Excel (2003) 文件,并将该文件的内容推送到 DataTable 以准备数据验证/存储”。

当应用于文件的本地存储版本时,这些操作已经可以正常工作 - 为此我只需使用OleDbConnection-ConnectionString "String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=Excel 8.0;", fileName)" 来自OleDbDataAdapter

但是,尝试使用相同文件的上传版本(通过 FileUpload 控件)重复此操作,在我填充OleDbDataAdapter的行上,我收到错误 [ “Microsoft Jet 数据库引擎找不到对象“Sheet1$” . 确保对象存在并且您正确拼写了它的名称和路径名。” ] 一个如此普遍和痛苦的错误——我仍然不确定下一步该往哪里看。我猜连接字符串结构对于上传的文件是非法的。

我搜索了 StackOverflow 和 MSDN,甚至在网络上搜索,到目前为止都没有成功,但搜索词可能过于普遍。在尝试解析其内容之前,我是否需要实际找到一个本地存储库来保存上传的文件?我不能简单地构建到“内存中的文件”的连接吗?如果涉及到答案,预计上传的文件大小不会超过 200 kb。

真诚感谢您提供的任何帮助...

4

1 回答 1

2

在这种情况下,我要做的是构建一个Parser类,该类将临时保存文件,对其进行处理,然后在处理时删除该临时文件。就像是:

 public class ExcelParser : IDisposable
 {
    string filename;
    string connStr = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source={0}; Extended Properties=\"Excel 12.0 Xml;HDR=YES\"";

    public ExcelParser(HttpPostedFile file)
    {
       filename = String.Format("{0}{1}.xlsx", System.IO.Path.GetTempPath(), Guid.NewGuid().ToString());
       file.SaveAs(filename);
    }

    public MyData Process()
    {
       OleDbConnection conn = new OleDbConnection(String.Format(connStr, filename));
       conn.Open();

       OleDbCommand cmd = new OleDbCommand("Select * From [Sheet1$]", conn);
       OleDbDataReader reader = cmd.ExecuteReader();

       while (reader.Read())
       {
          // Build Data to return
       }

       reader.Close();
       conn.Close();
       return data; // Return data you built
    }

    public void Dispose()
    {
       File.Delete(filename);
    }
 }

然后你可以这样使用它:

using (ExcelParser parser = new ExcelParser(file))
{
   var results = parser.Process();
   // Do stuff
}
于 2013-05-17T21:08:26.650 回答