当我打开使用 openXML 创建的 xlsx 文件时如何修复错误:“已修复的记录:/xl/workbook.xml 中的 sheet 属性?

How to fix error when I open my xlsx file creating with openXML : "repaired records : sheet properties in /xl/workbook.xml?

我正在使用 openXML 在我的应用程序中创建一个 xlsx 文件。该文件已创建,但当我想用 excel 2019 打开它时(我没有尝试另一个 excel),我收到一条错误消息,提示存在问题。 因此我说 "Yes" 修复文件,因此 excel 说 "repaired record : sheet properties in the /xl/workbook.xml part".

请注意,我使用几乎相同的代码在应用程序的其他部分创建了 xlsx 文件,并且没有错误。不同之处在于我正在处理新部分中的 List>。

我尝试用 appendChild 替换 append,但出现异常错误。 我试图重新排列代码行以更改不同部分的创建顺序,但总是 excel 错误。

public static byte[] ToOpenXml(HttpContext context, List<List<String>> data, String fileName, Boolean hasCount)
{
 Shared sharedClass = new Shared();
 using (MemoryStream memoryStream = new MemoryStream())
 {
  using (SpreadsheetDocument xlsxDocument = SpreadsheetDocument.Create(memoryStream, SpreadsheetDocumentType.Workbook))
  {
    WorkbookPart workbookPart = xlsxDocument.AddWorkbookPart();
    Workbook workbook = new Workbook();
    workbookPart.Workbook = workbook;
    Sheets sheets = new Sheets();
    workbook.Append(sheets);
    Sheet sheet = new Sheet()
    {
      Name = fileName,
      SheetId = 1,
      Id = "rId1"
    };
    sheets.Append(sheet);
    WorksheetPart worksheetPart = workbookPart.AddNewPart<WorksheetPart>("rId1");
    Worksheet worksheet = new Worksheet();
    SheetData sheetData = new SheetData();
    worksheet.Append(sheetData);
    worksheetPart.Worksheet = worksheet;

    //Index initialization
    UInt32 rowIndex = 1;
    Row row = new Row()
    {
      RowIndex = rowIndex
    };
    String value = String.Empty;
    foreach (List<String> datum in data)
    {
      UInt32 columnDataIndex = 1;
      row = new Row()
      {
        RowIndex = rowIndex
      };
      for (Int32 i = 0; i < datum.Count; i++)
      {
        Cell cell = CreateCell(columnDataIndex, rowIndex, CellValues.String, datum[i]);
        row.Append(cell);
        columnDataIndex = columnDataIndex + 1;
      }
      sheetData.Append(row);
      rowIndex = rowIndex + 1;
    }
  }
  return memoryStream.ToArray();
 }
}



public static Cell CreateCell(uint columnDataIndex, uint rowIndex, CellValues format, object value)
{
  string columnDataLetter = ColumnIndexToColumnLetter(columnDataIndex);
  String cellValue = "";
  Cell cell = new Cell()
  {
    CellReference = columnDataLetter + rowIndex,
    DataType = CellValues.String
  };
  switch (format)
  {
    case CellValues.Date:
      DateTime date = new DateTime();
      try
      {
        date = (DateTime)value;
      }
      catch (Exception e)
      {
      }
      cellValue = date.ToString(CultureInfo.InvariantCulture);
      break;
    default:
      cellValue = (String)value;
      break;
  }
  cell.CellValue = new CellValue(cellValue);
  return cell;
}

xlsx 文件已创建,但当我打开它时,我必须修复文件和 "repaired record : sheet properties in the /xl/workbook.xml part"。 我想在 excel 2019(我测试的唯一一个)打开没有错误。

谢谢你帮助我。

终于,我解决了这个问题。 问题是由于 sheet 名称。我将文件名放入其中,但文件名超过了 31 个字符,这是 excel 文件中 sheet 名称的最大长度。 我在第一次使用之前添加了此代码行:

String sheetName = fileName.Substring(0,30);

我把它放在声明中 sheet :

Sheet sheet = new Sheet()
{
    Name = sheetName,
    SheetId = 1,
    Id="rId1"
};