0

Я уверен, что пропустил что-то очевидное.Что было бы правильным OleDbConnection ConnectionString для загруженного файла?

Простая задача передо мной: «Загрузите файл Excel (2003) через ASP.NET на странице« Формы »и нажмите содержимое этого файла в DataTable при подготовке к валидации/хранению данных».

Эти операции работают нормально уже применительно к локально хранимым издание файла - для этого я просто использовать OleDbConnection-ConnectionString «String.Format (» Provider = Microsoft.Jet.OLEDB.4.0; источник данных = {0}; Расширенные свойства = Excel 8.0; ", fileName)" из OleDbDataAdapter.

Однако, пытаясь повторить, что с закачиваемым изданием того же файл (через контроль FileUpload), на линии, где я заполнить OleDbDataAdapter я получаю ошибку [«Ядро базы данных Microsoft Jet не может найдите объект «Sheet1 $». Убедитесь, что объект существует, и вы правильно указали его имя и имя пути ».] Ошибка такая общая и болезненная - все же я не уверен, где искать дальше. Я предполагаю, что структура строки соединения является незаконной для загруженного файла.

Я искал через StackOverflow и MSDN и даже в Интернете без успеха до сих пор, но поисковые термины могут быть чрезмерно вездесущими. Должен ли я фактически найти локальный репозиторий для сохранения загруженного файла до попытки разобрать его содержимое? Могу ли я просто построить соединение с «файлом в памяти»? В случае, если это касается ответа, загруженные файлы не должны превышать 200 килобайт.

Искреннее спасибо заранее за любую помощь, оказываемую ...

+2

Да, вы должны временно сохранить его на диск .. –

ответ

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 
} 
+0

Когда я нахожу время, чтобы попробовать это, если он работает надеюсь, я дам вам этот ответ «ответ», который вы наверняка заработали :). – Hardryv

+0

У вас возникли проблемы с удалением файла после его использования в IIS? – Moustachio