7

我在 C# 中使用 Open XML SDK 创建了一个电子表格,并成功填充了两个工作表。

尝试填充第三个时,我在打开已完成的文档时收到“不可读的内容”错误,并且当我尝试在第三个中连续填充超过 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;
    }
}

您可能想要更改字符串。比较:

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” . 因此,请尝试改用此方法:

...
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 回答