2016-12-19 2 views
1

Этот thread кажется мне не помогает.C# Excel DataTableReader недействителен для текущего DataTable 'Sheet1'

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

Вот код:

string excelFilePath = this.Server.MapPath("~/App_Data/Test.xlsx"); 
var fileStream = System.IO.File.Open(excelFilePath, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite); 
Excel.IExcelDataReader exReder = Excel.ExcelReaderFactory.CreateOpenXmlReader(fileStream); 

System.Data.DataSet dataSet = null; 
using (exReder) 
{ 
    dataSet = exReder.AsDataSet(); 
} 

if (dataSet == null) 
{ 
    throw new ArgumentNullException("Cannot Make Data Set"); 
} 

dataSet.Tables[0].Rows[0].ItemArray = new[] { "Microsoft", "Test", "ASP.NET" }; 
bool hasChanges = dataSet.HasChanges(); // true 

dataSet.AcceptChanges(); 
bool hasChanges2 = dataSet.HasChanges(); // false 

var dataReader = dataSet.CreateDataReader(dataSet.Tables[0]); 
TextReader textReader = dataReader.GetTextReader(1); // 1 is ordinal no matter what I pass it throws an exception 
byte[] results = System.Text.Encoding.UTF8.GetBytes(textReader.ReadToEnd()); 

return this.File(results, System.Net.Mime.MediaTypeNames.Application.Octet); 

Я использую http://exceldatareader.codeplex.com/ пакет

dataReader.GetTextReader(1); всегда вызывает исключение. Как сделать этот учебник? Или просто получить байты после изменения?

ответ

0

Рассмотрите возможность использования предоставленных Microsoft библиотек Excel.Interop .net. Они предназначены для выполнения этих функций. Вот dotnetperls blog на этом:

+0

Уже пробовал с Excel.Interop. При создании экземпляра вроде: 'Application xlApp = new Application()' он выдает исключение: 'Извлечение фабрики COM-класса для компонента с CLSID {00024500-0000-0000-C000-000000000046} не удалось из-за следующей ошибки: 80070005 Access отказано. (Исключение из HRESULT: 0x80070005 (E_ACCESSDENIED)). ' – mihkov

+0

- это часть проекта asp.net? – pizzaslice

+0

Да, это MVC. Я обнаружил, что для использования Excel.Interop я должен добавить разрешения IUSR из IIS в Конфигурации Windows. – mihkov

Смежные вопросы