2016-12-19 14 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); 

私は

dataReader.GetTextReader(1);は常に例外をスローhttp://exceldatareader.codeplex.com/パッケージを使用しています:ここで

はコードです。このテキストリーダーを作る方法?または、変更後のバイトを取得するだけですか?

答えて

0

Microsoftが提供するExcel.Interop .netライブラリの使用を検討してください。これらは、これらの機能を実行するようにネイティブに設計されています。ここにdotnetperls blogがあります:

+0

既にExcel.Interopで試してみました。 'Application xlApp = new Application()'のようなインスタンスを作成すると例外がスローされます: 'CLSID {00024500-0000-0000-C000-000000000046}のコンポーネントのCOMクラスファクトリを取得するのが次のエラーのため失敗しました:80070005アクセス否定された。 (HRESULTからの例外:0x80070005(E_ACCESSDENIED))。 – mihkov

+0

はasp.netプロジェクトのこの部分ですか? – pizzaslice

+0

これはMVCです。私は、Excel.Interopを使用するために、Windowsの設定でIISからIUSRに権限を追加する必要があることを発見しました。 – mihkov

関連する問題