7

C#でOpen XML SDKを使用してスプレッドシートを作成し、2つのワークシートに正常にデータを入力しました。

3番目にデータを入力しようとすると、完成したドキュメントを開くときに「読み取り不能なコンテンツ」エラーが発生し、3番目に25個を超えるセルを続けて入力しようとすると発生するようです。

ドキュメントの他の場所で正常に機能したものと同じコードフラグメントを使用しています。

string[] headers2 = {
    "Reference", "Raised", "Priority", "Affected", "Linked incidents",
    "Points", "SLA", "Stopped", "Target" };
// remaining headers are month/years created on the fly
string[] headerCells = {
    "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
    "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", 
    "AA", "AB", "AC", "AD", "AE", "AF", "AG", "AH" };
...
// headers
// once we've finished the presets, the month/year pairs take over
cellNo = (uint)0;
foreach (string h in headers2)
{
    cell = InsertCellInWorksheet(headerCells[cellNo++], 2, worksheetPart);
    cell.CellValue = new CellValue(h);
    cell.DataType = new EnumValue<CellValues>(CellValues.String);
}

string[] monthYears = 
    GetData_month_years(currentReportingPeriod - 1);
for (int j = 0; j < monthYears.Count(); j++)
{
    cell = InsertCellInWorksheet(headerCells[cellNo++], 2, worksheetPart);
    cell.CellValue = new CellValue(monthYears[j].ToString());
    cell.DataType = new EnumValue<CellValues>(CellValues.String);
}

設定されているセルは、AとAAからAHだけです。

私はある種の限界に達していると思っているのは正しいですか?もしそうなら、それをリセットする方法は何ですか?

判読不能なコンテンツエラーに関するいくつかの投稿を見て、ドキュメントを調べましたが、これまでのところ、該当するものを見つけることができませんでした。

助けていただければ幸いです!

ありがとう

4

3 に答える 3

11

受け入れられた答えは間違いなく正しいですが、回避策です。セルを順番に挿入している場合にのみ機能します。

MSDNのInsertCellInWorksheetメソッドを使用している場合、「Z」や「AA」などの異なる長さのセル参照を比較するときに比較するセル参照にバグがあります。

// Cells must be in sequential order according to CellReference. 
// Determine where to insert the new cell.
Cell refCell = null;
foreach (Cell cell in row.Elements<Cell>())
{
    if (string.Compare(cell.CellReference.Value, cellReference, true) > 0)
    {
        refCell = cell;
        break;
    }
}

string.Compareを次のように変更することをお勧めします。

if (ColumnNameParse(cell.CellReference.Value) > ColumnNameParse(cellReference))
{
    refCell = cell;
    break;
}

この回答から取得したColumnNameParseメソッドを使用します。

public int ColumnNameParse(string cellReference)
{
    var value = cellReference.TrimEnd("1234567890".ToCharArray());

    // assumes value.Length is [1,3]
    // assumes value is uppercase
    var digits = value.PadLeft(3).Select(x => "ABCDEFGHIJKLMNOPQRSTUVWXYZ".IndexOf(x));
    return digits.Aggregate(0, (current, index) => (current * 26) + (index + 1));
}
于 2014-08-08T23:24:29.163 に答える
7

「InsertCellInWorksheet(...)」メソッドを確認してください。この構造を内部で使用する場合-

...

row.InsertBefore(newCell, refCell);

...

「A--Z」列と「AA--...」列だけを入力する場合は、たとえば「Z」と「AA」の2つの列だけを入力する場合でも、正しく機能しません。 。したがって、代わりにこのメソッドを使用してみてください。

...
row.Append(newCell);
...

幸運を!

于 2013-01-28T11:21:57.187 に答える
-1

変化する

if (string.Compare(cell.CellReference.Value, cellReference, true) > 0) 

if (string.Compare(cell.CellReference.Value, cellReference, true) > 0
                        && cell.CellReference.Value.Length >= cellReference.Length)
于 2017-02-01T16:12:07.420 に答える