OpenXMLで作成したスプレッドシートを開くとエラーが表示されます。エラーは次のとおりです。
Repaired Records: Cell information from /xl/worksheets/sheet.xml part
Repaired Records: Cell information from /xl/worksheets/sheet2.xml part
Repaired Records: Cell information from /xl/worksheets/sheet3.xml part
オンラインで見つけることができた唯一の助けとなったのは、この問題が個々のセルを複数回変更するアルゴリズムの議論であったことでした。そうは言っても、SpreadsheetDocumentのコンストラクターと、セルを更新するための3つの関数をリンクします(これは1回行います)。
必要に応じて追加の機能を提供できますが、問題は以下の2つにあると思います。
ところで、
GetWorksheetPartByName
InsertCellInWorksheet
GetCell
すべて意図したとおりに動作するはずです。
実際のプログラム
static void Main(string[] args)
{
//Full path for File
const string newFile = "@C:\test.xlsx";
//Constructor creates default worksheet called "mySheet"
var spreadsheet = new XLSXHelper(newFile);
//updating some cells.
spreadsheet.UpdateCell("mySheet", "D2", "R", 2);
}
コンストラクター
public XLSXHelper(string filepath)
{
newFile = filepath;
spreadsheetDocument = SpreadsheetDocument.Create(filepath, SpreadsheetDocumentType.Workbook);
this.workbookPart = spreadsheetDocument.AddWorkbookPart();
workbookPart.Workbook = new Workbook();
this.worksheetPart = workbookPart.AddNewPart<WorksheetPart>();
worksheetPart.Worksheet = new Worksheet(new SheetData());
Sheets sheets = spreadsheetDocument.WorkbookPart.Workbook.
AppendChild<Sheets>(new Sheets());
Sheet sheet = new Sheet()
{
Id = spreadsheetDocument.WorkbookPart.
GetIdOfPart(worksheetPart),
SheetId = 1,
Name = "mySheet"
};
sheets.Append(sheet);
workbookPart.Workbook.Save();
spreadsheetDocument.Close();
}
セルの更新
public void UpdateCell(string worksheetName, string textToInsert, string columnName, uint rowIndex)
{
using (SpreadsheetDocument spreadSheet = SpreadsheetDocument.Open(newFile, true))
{
WorksheetPart worksheetPart = GetWorksheetPartByName(spreadSheet, worksheetName);
if (worksheetPart != null)
{
InsertCellInWorksheet(columnName, rowIndex, worksheetPart);
Cell cell = GetCell(worksheetPart.Worksheet,columnName, rowIndex);
cell.CellValue = new CellValue(textToInsert);
worksheetPart.Worksheet.Save();
}
}
}
数値ではなく文字列(または数値に変換できる文字列)をセルに追加する場合は、CellValueの代わりにインライン文字列または共有文字列を使用する必要があります。値が数値の場合のみ、CellValueを使用できます。
CellValueの使用時に生成されるXMLは次のようになります。
<x:row>
<x:c>
<x:v>12345</x:v>
</x:c>
</x:row>
インライン文字列を使用すると、次のようになります。
<x:row>
<x:c t="inlineStr">
<x:is>
<x:t>Foo</x:t>
</x:is>
</x:c>
</x:row>
インライン文字列の「is」ノードと、セルタイプ属性が「inlineStr」に設定されていることに注意してください。
テキストを含むセルの正しいXMLを生成するC#コードを次に示します。
cell.DataType = CellValues.InlineString;
cell.InlineString = new InlineString() { Text = new Text(textToInsert) };
私が共有文字列を使用して読んだものから望ましいですが、インライン文字列を使用すると、エラーを回避し、Excelでファイルを開いたときにうまく見えます。
これは古いスレッドであることがわかりましたが、プログラムで生成されたExcelシートにも同じエラーメッセージがポップアップ表示されました。私の問題は、ワークシートの名前にスラッシュを含む名前を設定していたことです。
このスレッドがこのトピックで最も人気のあるスレッドであるため、このスレッドにつまずく他の誰かの助けになることを願っています。
別の遅いもの-しかし、行にセルを追加する方法を確認してください。行の既存のセル参照(A1など)と比較する「単純な」セルコードをカットアンドペーストして追加しましたか?その場合、列Zを超えるセル(AA1以降)がある場合、セルB1の前にセル(例:AB1)を挿入しようとする可能性があります。書かれたシートをExcelで開くと、このエラーが発生します。代わりに、単に各行に沿ってセルの後にセルを追加する場合、参照セルをnullに設定して前に挿入するだけです。最後に新しいセルを追加します。
それが理にかなっていることを願っています。
自分でこの問題につまずいて、このスレッドを見つけました。私の場合の違いは、ファイルを修復できませんでした。問題は、InsertCellInWorksheet
に渡した行インデックスでした MSDNの例から引用 。
Cell cell = InsertCellInWorksheet("A", lastRow.RowIndex, worksheetPart);
行を挿入するときは、行のインデックスが0ではなく1であることを確認してください。ただし、SheetData
コレクションの場合は0です。
sheetData.InsertAt(new Row() { RowIndex = 1 }, 0);
lastRow = sheetData.Elements<Row>().LastOrDefault();
同じトラブルを経験する人の時間を節約したい。
興味深いことに、統合テストに合格しましたが、Excelでファイルを開くと、破損に関するポップアップが表示されていました。インデックス0の行があるようですが、Excelでファイルを開くことができないため、少し秘密です。
潜在的なソリューションのリストに追加(Year2017 :)):
FileOutputStreamに書き込むために正しいブックオブジェクトを使用していなかったため、この問題に直面していました。
これが誰かを助けることを願っています。
私の場合、SSRSプレースホルダープロパティにはカスタム番号がありました。
修正:
ありがとうウマカンス・ネリゲ
それは古いスレッドですが、私は同じ問題を抱えていたので、このスレッドに上陸した私のような誰かが答えを見つけるのに役立つかもしれません:)
私にとっての問題は、アプリケーションにエクスポートモジュールがあり、ある環境からエクスポートされたファイルが正常に機能していたが、他の環境からは機能していなかったことです。同じエラーでした:
Repaired Records: Cell information from /xl/worksheets/sheet19.xml part
詳細な調査を行った後、このシートのレコードの1つが2767文字のセル制限(Excelの制限)を超えており、DB上のテキストのサイズを直接減らすことで問題を解決できることがわかりました。 。 :)
私はそれが役立つことを願っています:)