c# - 当我打开使用 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(我测试过的唯一一个)中打开没有错误。
感谢你们对我的帮助。
解决方案
最后,我解决了这个问题。问题是由于工作表名称。我将文件名放入其中,但文件名超过 31 个字符,这是 excel 文件中工作表名称的最大长度。我在第一次使用之前添加了这个代码行:
String sheetName = fileName.Substring(0,30);
我把它放在声明表中:
Sheet sheet = new Sheet()
{
Name = sheetName,
SheetId = 1,
Id="rId1"
};
推荐阅读
- asp.net-core - 如何将 Asp.net core Identity 用户连接到 IdentityServer4 用户
- python - Python 谷歌表格格式
- node.js - 如何将 hbs 车把文件链接到 ejs 文件?错误 - “无法在视图目录中查找视图“employee/addOrEdit”...”
- javascript - 防止双击带有标签的复选框
- python - Python,在其他 .py 文件/NameError 中使用函数中的全局变量
- azure - 如何在代码授权流中检查从 Azure 获得的刷新令牌?
- python - 将嵌套列表转换为多个字典
- javascript - react-native 功能组件在哪里实现初始化代码
- javascript - React useEffect 不会阻止重新渲染
- html - 试图让孩子悬停与父母不同