当我打开使用 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"
};
我正在使用 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"
};