首页 > 解决方案 > 当我打开使用 openXML 创建的 xlsx 文件时如何修复错误:“修复的记录:/xl/workbook.xml 中的工作表属性?

问题描述

我正在使用 openXML 在我的应用程序中创建一个 xlsx 文件。该文件已创建,但是当我想用 excel 2019 打开它时(我没有尝试另一个 excel),我收到一条错误消息,提示存在问题。因此我说“是”来修复文件,因此 excel 说“修复的记录:/xl/workbook.xml 部分中的工作表属性”。

请注意,我使用几乎相同的代码在应用程序的其他部分创建 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 文件已创建,但是当我打开它时,我必须修复文件并“修复记录:/xl/workbook.xml 部分中的工作表属性”。我想在 excel 2019(我测试过的唯一一个)中打开没有错误。

感谢你们对我的帮助。

标签: c#openxml-sdk

解决方案


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

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

我把它放在声明表中:

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

推荐阅读