この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);
私は
dataReader.GetTextReader(1);
は常に例外をスローhttp://exceldatareader.codeplex.com/パッケージを使用しています:ここで
既にExcel.Interopで試してみました。 'Application xlApp = new Application()'のようなインスタンスを作成すると例外がスローされます: 'CLSID {00024500-0000-0000-C000-000000000046}のコンポーネントのCOMクラスファクトリを取得するのが次のエラーのため失敗しました:80070005アクセス否定された。 (HRESULTからの例外:0x80070005(E_ACCESSDENIED))。 – mihkov
はasp.netプロジェクトのこの部分ですか? – pizzaslice
これはMVCです。私は、Excel.Interopを使用するために、Windowsの設定でIISからIUSRに権限を追加する必要があることを発見しました。 – mihkov