OpenXml всегда создает поврежденный файл .xlsx C# (пакет .Net NuGet)C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 OpenXml всегда создает поврежденный файл .xlsx C# (пакет .Net NuGet)

Сообщение Anonymous »

У меня возникла проблема с пакетом NuGet DocumentFormat.OpenXml. Хотя функция CloseDocument() показывает, что данные попадают в книгу Excel, когда я пытаюсь загрузить их в Excel, она выдает ошибку о том, что лист полон ошибок и его необходимо удалить. Я просмотрел несколько руководств и других публикаций о проблемах с созданием файлов Excel, но ни одно из них не помогло решить эту проблему.
Создание файла Excel:
Excel NewExcel = new Excel(FileName);

NewExcel.CreateSheet("Test Sheet");
NewExcel.PrepareColumn(1, 80, true, 55.5);
NewExcel.CreateRow(20.2);
NewExcel.SetCell("Test 1", 1, "A");
NewExcel.SetCell(new DateTime(2010, 7, 14), 1, "B");
NewExcel.FinishSheet();
NewExcel.SaveFile();
NewExcel.CloseDocument();

Ошибка:

error133640_01.xmlErrors were detected in file 'C:\Users\Frasher Gray\Documents\NsPaintRequest-20240702.xlsx'Removed Records: Worksheet properties from /xl/workbook.xml part (Workbook)

Создание файла Excel:
public class Excel
{
public string FileName { get; set; }

private SpreadsheetDocument ExcelWorkbook;

private WorksheetPart CurrentWorksheet;

private Columns ColumnsInProgress;

private List RowsInProgress;

public Excel(string FileName = "Default File Name")
{
this.FileName = FileName;
ExcelWorkbook = SpreadsheetDocument.Create($"C://Users/Frasher Gray/Documents/{FileName}.xlsx", SpreadsheetDocumentType.Workbook);

ExcelWorkbook.AddWorkbookPart();
ExcelWorkbook.WorkbookPart.Workbook = new Workbook();

ColumnsInProgress = new Columns();
RowsInProgress = new List();
}

public void PrepareColumn(int FirstColumnAffected, int LastColumnAffected, bool UseCustomWidth = false, double CustomWidth = 0)
{
if (UseCustomWidth)
ColumnsInProgress.Append(new Column() { Min = new UInt32Value((uint)FirstColumnAffected), Max = new UInt32Value((uint)LastColumnAffected), CustomWidth = true, Width = new DoubleValue(CustomWidth) });
else
ColumnsInProgress.Append(new Column() { Min = new UInt32Value((uint)FirstColumnAffected), Max = new UInt32Value((uint)LastColumnAffected) });
}

public void CreateRow(double? CustomHeight = null)
{
SheetData SheetData = CurrentWorksheet.Worksheet.GetFirstChild() ?? CurrentWorksheet.Worksheet.AppendChild(new SheetData());
Row NewRow = new Row() { RowIndex = new UInt32Value((uint)SheetData.Count() + 1) };
if (CustomHeight != null)
NewRow.Height = CustomHeight;
RowsInProgress.Add(NewRow);
SheetData.Append(NewRow);
}

public void SetCell(T CellValue, int Row, string Column)
{
Cell NewCell = new Cell() { CellReference = $"{Column}{Row}" };
if (CellValue.GetType() == typeof(string))
{
NewCell.DataType = new EnumValue(CellValues.String);
NewCell.CellValue = new CellValue(CellValue.ToString() ?? string.Empty);
}
else if (CellValue.GetType() == typeof(DateTime))
{
NewCell.DataType = new EnumValue(CellValues.Date);
NewCell.CellValue = new CellValue(Convert.ToDateTime(CellValue));
}
else
{
NewCell.DataType = new EnumValue(CellValues.Number);
NewCell.CellValue = new CellValue(Convert.ToDouble(CellValue));
}

if (RowsInProgress[Row - 1].Elements().Count() > 0)
{
RowsInProgress[Row - 1].InsertAfter(NewCell, RowsInProgress[Row - 1].Elements().Last());
}
else
{
RowsInProgress[Row - 1].AddChild(NewCell);
}
CurrentWorksheet.Worksheet.Save();
}

public void CreateSheet(string SheetName)
{
CurrentWorksheet = ExcelWorkbook.WorkbookPart.AddNewPart();
CurrentWorksheet.Worksheet = new Worksheet(new SheetData());

Sheets Sheets = ExcelWorkbook.WorkbookPart.Workbook.GetFirstChild() ?? ExcelWorkbook.WorkbookPart.Workbook.AppendChild(new Sheets());
uint SheetId = (uint)(Sheets.Elements().Count() + 1);
Sheet Sheet = new Sheet() { Id = ExcelWorkbook.GetIdOfPart(ExcelWorkbook.WorkbookPart), SheetId = SheetId, Name = SheetName };
Sheets.Append(Sheet);
}

public void FinishSheet()
{
CurrentWorksheet.Worksheet.InsertAt(ColumnsInProgress, 0);
ColumnsInProgress = new Columns();
RowsInProgress.Clear();
CurrentWorksheet.Worksheet.Save();
}

public void SaveFile()
{
ExcelWorkbook.WorkbookPart.Workbook.Save();
}

public void CloseDocument()
{
foreach (Row R in ExcelWorkbook.WorkbookPart.WorksheetParts.FirstOrDefault().Worksheet.GetFirstChild())
{
foreach (Cell P in R.ChildElements)
{
Console.WriteLine(P.InnerText + " " + P.CellReference);
}
}
ExcelWorkbook.Dispose();
}
}


Подробнее здесь: https://stackoverflow.com/questions/787 ... et-package
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»