2016-12-12 34 views
0

ユーザー作成の.xlsxファイルを読み込んだり変更したりすると、 :NPOIでの.xlsxファイルの問題のある破損 - ファイル形式またはファイル拡張子が有効でないためExcelが 'file.xlsx'ファイルを開くことができません

Excel cannot open the file 'test.xlsx' because the file format or file extension is not valid. Verify that the file has not been corrupted and that the file extension matches the format of the file. 

問題の例(前NPOIに入れる)hereファイルの.xlsx

をここでTHさん:

We found a problem with some content in 'test.xlsx'. Do you want us to try to recover as much as we can? If you trust the source of this workbook, click Yes. 

は、[はい]をクリックすると、私は別のメッセージを取得します現在同じファイルが読み取られた後に破損し、iWorkbook.Write(filestream);hereで書き戻されます。正常に動作します

string newPath = @"C:\MyPath\test.xlsx"; 

using (FileStream fs = new FileStream(newPath, FileMode.Create, FileAccess.Write)) 
{ 
    IWorkbook wb = new XSSFWorkbook(); 
    wb.CreateSheet(); 
    ISheet s = wb.GetSheetAt(0); 
    IRow r = s.CreateRow(0); 
    r.CreateCell(0); 
    ICell c = r.GetCell(0); 
    c.SetCellValue("test"); 
    wb.Write(fs); 
    fs.Close(); 
} 

は、私は次のコードで新しいの.xlsxファイルを作成する何の問題もありません。

はしても、問題のある子の.xlsxファイルのいずれかを開くIWorkbookに設定するとバックファイルに書き込む動作します:

string newPath = @"C:\MyPath\test.xlsx"; 

using (FileStream fs = new FileStream(newPath, FileMode.Open, FileAccess.ReadWrite)) 
{ 
    IWorkbook wb = new XSSFWorkbook(fs); 
    wb.Write(fs); 
    fs.Close(); 
} 

しかし、それから読み取るコードを実行した後に、ISheetsを取得し、 IRows、ICellsなど.xlsxファイルが破損しています。 私は特に、ブックを変更するものはすべて削除しましたが。 NPOIとのクリエイト、セット、スタイルなどはありません。

それだけで混乱することになるので、私は本当に私のコードを含めることはできませんが、完全を期すために、私は実際にはこのテスト中NPOIから、次の種類や機能を使用しています:

IWorkbook 
XSSFWorkbook 
ISheet 
IRow 
ICell 
.GetSheetAt 
.GetRow 
.GetCell 
.LastRowNum 

ので、それらの1つは腐敗を引き起こす。私は最終的に値を設定して、xlsのように動作させたいと思っています。

これを経験したことがありますか?腐敗の原因となるNPOIの機能は何ですか?どんな入力も感謝します。

編集:NPOI v2.2.1を使用します。

+0

我々はそれを見てみることができるようにあなたがどこかにこれらの.xlsxファイルのいずれかをアップロードすることができます: はこのようにそれを試してみてください? –

+0

返事をありがとう。例としてhttps://ufile.io/2b349を編集して追加しました。 – justiceorjustus

+0

OK、そのファイルの問題は何ですか?マクロやその他のものが含まれていないことを確認した後、Excelでそれを開かれました。これはバージョンに関連するものではないと確信していますか?私はExcel 2016を持っています。 –

答えて

3

私は問題があなたから読んでいると思っている、と書いて、同じFileStreamだと思う。別々のストリームを使って読み書きを行う必要があります。

string newPath = @"C:\MyPath\test.xlsx"; 

// read the workbook 
IWorkbook wb; 
using (FileStream fs = new FileStream(newPath, FileMode.Open, FileAccess.Read)) 
{ 
    wb = new XSSFWorkbook(fs); 
} 

// make changes 
ISheet s = wb.GetSheetAt(0); 
IRow r = s.GetRow(0) ?? s.CreateRow(0); 
ICell c = r.GetCell(1) ?? r.CreateCell(1); 
c.SetCellValue("test2"); 

// overwrite the workbook using a new stream 
using (FileStream fs = new FileStream(newPath, FileMode.Create, FileAccess.Write)) 
{ 
    wb.Write(fs); 
} 
+0

私が@Lasse V. Karlsenから終わった場所。私は、NPOIが正しく書き返しておらず、Excelを気にかけていないというデータが残っていると思います。 NPOI後のファイルサイズは、変更がなくても少し小さくなります。あなたが言ったことをすることは、完全に機能します。 – justiceorjustus

関連する問題