OpenXML 文件在 Excel 中打开时需要修复
OpenXML file needs repair when opened in Excel
我正在开发一个使用 OpenXML 将 DataTable 转换为 .xlsx
文件的函数。我能够很好地创建 .xlsx
文件并将其导出,但是当我在 Excel 中打开它时,出现以下错误:
Repaired Records: Cell information from /xl/worksheets/sheet1.xml part
我试过从类似的问题中找到解决方案,但没有任何效果。
这是我的代码:
public MemoryStream ConvertToXLSX(DataTable table, string sheetName)
{
MemoryStream excelStream = new MemoryStream();
using (var workbook = SpreadsheetDocument.Create(excelStream, DocumentFormat.OpenXml.SpreadsheetDocumentType.Workbook))
{
var workBookPart = workbook.AddWorkbookPart();
workbook.WorkbookPart.Workbook = new DocumentFormat.OpenXml.Spreadsheet.Workbook();
workbook.WorkbookPart.Workbook.Sheets = new DocumentFormat.OpenXml.Spreadsheet.Sheets();
uint sheetID = 1;
var sheetPart = workbook.WorkbookPart.AddNewPart<WorksheetPart>();
var sheetData = new SheetData();
sheetPart.Worksheet = new DocumentFormat.OpenXml.Spreadsheet.Worksheet(sheetData);
DocumentFormat.OpenXml.Spreadsheet.Sheets sheets = workbook.WorkbookPart.Workbook.GetFirstChild<DocumentFormat.OpenXml.Spreadsheet.Sheets>();
string relationshipId = workbook.WorkbookPart.GetIdOfPart(sheetPart);
if (sheets.Elements<Sheet>().Count() > 0)
{
sheetID = sheets.Elements<Sheet>().Select(s => s.SheetId.Value).Max() + 1;
}
Sheet sheet = new Sheet() { Id = relationshipId, SheetId = sheetID, Name = sheetName };
sheets.Append(sheet);
Row headerRow = new Row();
List<string> columns = new List<string>();
foreach (DataColumn column in table.Columns)
{
columns.Add(column.ColumnName);
Cell cell = new Cell();
cell.DataType = CellValues.SharedString;
cell.CellValue = new CellValue(column.ColumnName);
headerRow.AppendChild(cell);
}
sheetData.AppendChild(headerRow);
foreach (DataRow tabRow in table.Rows)
{
Row newRow = new Row();
foreach (String col in columns)
{
var val = tabRow[col];
Cell cell = new Cell();
cell.DataType = GetCellValueType(val.GetType());
cell.CellValue = new CellValue(val.ToString());
newRow.AppendChild(cell);
}
sheetData.AppendChild(newRow);
}
workbook.WorkbookPart.Workbook.Save();
}
return excelStream;
}
这是在 Excel 中打开后的数据示例:
我尝试在 Open XML SDK 2.5 Productivity 工具中打开文件,但没有收到任何验证错误。
这是 xml 层次结构的屏幕截图:
你输出错误cell.DataType
。在您的 headers 中,您正在输出 CellValues.SharedString
但随后将字符串直接添加到单元格中。您需要将其设置为 CellValues.String
.
当您调用未列出的 GetCellValueType(val.GetType())
时,很难说出您为其余单元格输出的内容,但同样,您需要避免使用 CellValues.SharedString
,如果你正在写出一个字符串。
仅当您将值本身写入 SharedStringTable 时才应使用 CellValues.SharedString
。
我正在开发一个使用 OpenXML 将 DataTable 转换为 .xlsx
文件的函数。我能够很好地创建 .xlsx
文件并将其导出,但是当我在 Excel 中打开它时,出现以下错误:
Repaired Records: Cell information from /xl/worksheets/sheet1.xml part
我试过从类似的问题中找到解决方案,但没有任何效果。
这是我的代码:
public MemoryStream ConvertToXLSX(DataTable table, string sheetName)
{
MemoryStream excelStream = new MemoryStream();
using (var workbook = SpreadsheetDocument.Create(excelStream, DocumentFormat.OpenXml.SpreadsheetDocumentType.Workbook))
{
var workBookPart = workbook.AddWorkbookPart();
workbook.WorkbookPart.Workbook = new DocumentFormat.OpenXml.Spreadsheet.Workbook();
workbook.WorkbookPart.Workbook.Sheets = new DocumentFormat.OpenXml.Spreadsheet.Sheets();
uint sheetID = 1;
var sheetPart = workbook.WorkbookPart.AddNewPart<WorksheetPart>();
var sheetData = new SheetData();
sheetPart.Worksheet = new DocumentFormat.OpenXml.Spreadsheet.Worksheet(sheetData);
DocumentFormat.OpenXml.Spreadsheet.Sheets sheets = workbook.WorkbookPart.Workbook.GetFirstChild<DocumentFormat.OpenXml.Spreadsheet.Sheets>();
string relationshipId = workbook.WorkbookPart.GetIdOfPart(sheetPart);
if (sheets.Elements<Sheet>().Count() > 0)
{
sheetID = sheets.Elements<Sheet>().Select(s => s.SheetId.Value).Max() + 1;
}
Sheet sheet = new Sheet() { Id = relationshipId, SheetId = sheetID, Name = sheetName };
sheets.Append(sheet);
Row headerRow = new Row();
List<string> columns = new List<string>();
foreach (DataColumn column in table.Columns)
{
columns.Add(column.ColumnName);
Cell cell = new Cell();
cell.DataType = CellValues.SharedString;
cell.CellValue = new CellValue(column.ColumnName);
headerRow.AppendChild(cell);
}
sheetData.AppendChild(headerRow);
foreach (DataRow tabRow in table.Rows)
{
Row newRow = new Row();
foreach (String col in columns)
{
var val = tabRow[col];
Cell cell = new Cell();
cell.DataType = GetCellValueType(val.GetType());
cell.CellValue = new CellValue(val.ToString());
newRow.AppendChild(cell);
}
sheetData.AppendChild(newRow);
}
workbook.WorkbookPart.Workbook.Save();
}
return excelStream;
}
这是在 Excel 中打开后的数据示例:
我尝试在 Open XML SDK 2.5 Productivity 工具中打开文件,但没有收到任何验证错误。
这是 xml 层次结构的屏幕截图:
你输出错误cell.DataType
。在您的 headers 中,您正在输出 CellValues.SharedString
但随后将字符串直接添加到单元格中。您需要将其设置为 CellValues.String
.
当您调用未列出的 GetCellValueType(val.GetType())
时,很难说出您为其余单元格输出的内容,但同样,您需要避免使用 CellValues.SharedString
,如果你正在写出一个字符串。
仅当您将值本身写入 SharedStringTable 时才应使用 CellValues.SharedString
。