2016-04-14 2 views
0

Я хочу прочитать файл excel и вставить данные в набор данных. Я могу читать некоторые файлы, и он работает нормально, но в некоторых случаях он работает неправильно. Я также добавил скриншот об ошибке и файле. Когда мы разблокируем этот файл и откроем его один раз и сохраним его, тогда работает код. Ниже мой код:Прочтите файл Excel и добавьте данные в набор данных

try 
{ 
    startTime = DateTime.Now; 
    System.IO.FileStream fs = new System.IO.FileStream(FullfilePath, System.IO.FileMode.Open, FileAccess.ReadWrite); 
    IExcelDataReader excelReader2007 = ExcelReaderFactory.CreateOpenXmlReader(fs); 
    excelReader2007.IsFirstRowAsColumnNames = false; 
    DataSet result = excelReader2007.AsDataSet(); 
    if (result.Tables.Count > 0) 
    { 
     ds = result; 
    } 
    fs.Close(); 
    fs.Dispose(); 
    InsertExecLogDetails(startTime, DateTime.Now, Convert.ToString(Common.EventNames.GenerateDataTableFromExcel), Convert.ToString(Common.StatusEnum.Success), "Table generated from excel"); 
} 
catch (Exception ex) 
{ 
    InsertExecLogDetails(startTime, DateTime.Now, Convert.ToString(Common.EventNames.GenerateDataTableFromExcel), Convert.ToString(Common.StatusEnum.Failure), Convert.ToString(ex.Message)); 
} 

Error link

+0

На какой строке возникает ошибка нулевого указателя? Для тех, кто не видит ссылку: http://i.stack.imgur.com/kLt7F.png – Draken

+0

ОК, в дальнейшем анализ, похоже, произойдет на этом этапе: 'InsertExecLogDetails()' Что делает этот метод делать? Можете ли вы опубликовать пример? – Draken

+0

IExcelDataReader excelReader2007 = ExcelReaderFactory.CreateOpenXmlReader (fs); здесь fs остается null –

ответ

0

Попробуйте это:

System.IO.FileStream fs; 
try 
{ 
    startTime = DateTime.Now; 
    fs = new System.IO.FileStream(FullfilePath, System.IO.FileMode.Open, FileAccess.ReadWrite); 
    IExcelDataReader excelReader2007 = ExcelReaderFactory.CreateOpenXmlReader(fs); 
    excelReader2007.IsFirstRowAsColumnNames = false; 
    DataSet result = excelReader2007.AsDataSet(); 
    if (result.Tables.Count > 0) 
    { 
     ds = result; 
    } 

    InsertExecLogDetails(startTime, DateTime.Now, Convert.ToString(Common.EventNames.GenerateDataTableFromExcel), Convert.ToString(Common.StatusEnum.Success), "Table generated from excel"); 
} 
catch (Exception ex) 
{ 
    InsertExecLogDetails(startTime, DateTime.Now, Convert.ToString(Common.EventNames.GenerateDataTableFromExcel), Convert.ToString(Common.StatusEnum.Failure), Convert.ToString(ex.Message)); 
} 
finally 
{ 
    if (fs != null){ 

     try{ 
      fs.Close(); 
      fs.Dispose(); 
     } 
     catch(Exception ex){ 
      //Error handling for being unable to close file 
     } 
    } 
} 

Это звучит, как вы покидаете файл открыт предыдущего запуска выполнения и не закрыли его должным образом, это, надеюсь, решит вашу проблему. Если нет, проверьте, чтобы увидеть, если что-то еще по-прежнему использует файл

Или вы можете использовать функцию using так, что она закрывает использование файлов для вас, смотрите here

[редактировать] Пример using функции (Вам также может понадобиться использовать using на вашем IExcelDataReader, но я не проверял API):

try 
{ 
    using(System.IO.FileStream fs = new System.IO.FileStream(FullfilePath, System.IO.FileMode.Open, FileAccess.ReadWrite)) 
    { 
     startTime = DateTime.Now; 
     IExcelDataReader excelReader2007 = ExcelReaderFactory.CreateOpenXmlReader(fs); 
     excelReader2007.IsFirstRowAsColumnNames = false; 
     DataSet result = excelReader2007.AsDataSet(); 
     if (result.Tables.Count > 0) 
     { 
      ds = result; 
     } 

     InsertExecLogDetails(startTime, DateTime.Now, Convert.ToString(Common.EventNames.GenerateDataTableFromExcel), Convert.ToString(Common.StatusEnum.Success), "Table generated from excel"); 
    } 
} 
catch (Exception ex) 
{ 
    InsertExecLogDetails(startTime, DateTime.Now, Convert.ToString(Common.EventNames.GenerateDataTableFromExcel), Convert.ToString(Common.StatusEnum.Failure), Convert.ToString(ex.Message)); 
} 

[Edit2]

Проблема, вызвана системами NTFS Setti нг флаг говоря, что это небезопасно, вам нужно использовать следующий код и вызвать его, прежде чем доступ к файлу для его разблокировки:

public class FileUnblocker { 

    [DllImport("kernel32", CharSet = CharSet.Unicode, SetLastError = true)] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    public static extern bool DeleteFile(string name); 

    public bool Unblock(string fileName) { 
     return DeleteFile(fileName+ ":Zone.Identifier"); 
    } 
} 

Source

Таким образом, ваш результирующий код будет:

try 
{ 

    if (new FileUnblocker().Unblock(FullfilePath)) 
    { 
     using(System.IO.FileStream fs = new System.IO.FileStream(FullfilePath, System.IO.FileMode.Open, FileAccess.ReadWrite)) 
     { 
      startTime = DateTime.Now; 
      IExcelDataReader excelReader2007 = ExcelReaderFactory.CreateOpenXmlReader(fs); 
      excelReader2007.IsFirstRowAsColumnNames = false; 
      DataSet result = excelReader2007.AsDataSet(); 
      if (result.Tables.Count > 0) 
      { 
       ds = result; 
      } 

      InsertExecLogDetails(startTime, DateTime.Now, Convert.ToString(Common.EventNames.GenerateDataTableFromExcel), Convert.ToString(Common.StatusEnum.Success), "Table generated from excel"); 
     } 
    } 
    else{ 
     //Issue with unblocking, deal with it here 
    } 
} 
catch (Exception ex) 
{ 
    InsertExecLogDetails(startTime, DateTime.Now, Convert.ToString(Common.EventNames.GenerateDataTableFromExcel), Convert.ToString(Common.StatusEnum.Failure), Convert.ToString(ex.Message)); 
} 
+0

Здравствуйте, Я пробовал оба решения, но он не работает. проблема в том, что когда я нажимаю на свойства файла excel и нажимаю на разблокировку, тогда откройте его и сохраните, тогда этот код работает –

+0

А, разрешения безопасности, я понимаю сейчас. Посмотрите на это: http://stackoverflow.com/questions/6374673/unblock-file-from-within-net-4-c-sharp – Draken

+0

Проверьте обновленный код – Draken