我确信我错过了一些明显的东西。
一个简单的任务摆在我面前:'在Forms页面上通过ASP.NET上传Excel(2003)文件,并将该文件的内容推送到DataTable,为数据验证/存储做准备。
当应用于本地存储的文件版本时,这些操作已经正常工作 - 因为我只使用 OleDbConnection-ConnectionString “String.Format(”Provider = Microsoft.Jet.OLEDB。 4.0;数据源= {0};扩展属性= Excel 8.0;“,fileName)”来自 OleDbDataAdapter 。
但是,尝试使用上传版本的同一文件重复(通过FileUpload控件),在我填充 OleDbDataAdapter 的行上,我收到错误[“The Microsoft Jet数据库引擎无法找到对象“Sheet1 $”。请确保该对象存在,并且您正确拼写其名称和路径名称。“]错误如此通用且痛苦 - 我仍然不确定在哪里看下一个。我猜测连接字符串结构对于上传的文件是非法的。
我搜索了StackOverflow和MSDN,甚至在网络上搜索到目前为止没有成功,但搜索条件可能过于普遍。在尝试解析其内容之前,我是否需要实际找到用于保存上传文件的本地存储库?我是否可以简单地构建与“内存中的文件”的连接?如果它涉及到答案,则预计上传的文件的大小不会超过200 kb。
真诚地感谢所提供的任何帮助......
答案 0 :(得分: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
}