Этот 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);
всегда вызывает исключение. Как сделать этот учебник? Или просто получить байты после изменения?
Уже пробовал с Excel.Interop. При создании экземпляра вроде: 'Application xlApp = new Application()' он выдает исключение: 'Извлечение фабрики COM-класса для компонента с CLSID {00024500-0000-0000-C000-000000000046} не удалось из-за следующей ошибки: 80070005 Access отказано. (Исключение из HRESULT: 0x80070005 (E_ACCESSDENIED)). ' – mihkov
- это часть проекта asp.net? – pizzaslice
Да, это MVC. Я обнаружил, что для использования Excel.Interop я должен добавить разрешения IUSR из IIS в Конфигурации Windows. – mihkov