OpenXML ошибка при добавлении ячейки

108
10 марта 2022, 00:20

Нужно заполнить шаблон xlsx данными. Пользуюсь библиотекой openxml. В шаблоне создал заголовок с названиями колонок.

uint rowIndex = 2;
                uint startMerge;
                Cell cell;
                orders.ForEach(order =>
                {
                    cell = InsertCellInWorksheet("A", rowIndex);
                    cell.CellValue = new CellValue(order.SignDate.ToString());
                    cell.DataType = new EnumValue<CellValues>(CellValues.Date);
                    //cell = InsertCellInWorksheet("B", rowIndex, WorksheetPart);
                    //cell.CellValue = new CellValue(order.Number);
                    //cell.DataType = new EnumValue<CellValues>(CellValues.String);
                    //cell = InsertCellInWorksheet("C", rowIndex, WorksheetPart);
                    //cell.CellValue = new CellValue(order.DeliveryAddress);
                    //cell.DataType = new EnumValue<CellValues>(CellValues.String);

                    //foreach (OrderModule orderModule in order.OrderModule) {
                    //    foreach (ModuleComponent moduleComponent in orderModule.ModuleComponent) {
                    //        cell = InsertCellInWorksheet("D",rowIndex, WorksheetPart);
                    //        cell.CellValue = new CellValue(orderModule.ModuleArticle);
                    //        cell.DataType = new EnumValue<CellValues>(CellValues.Number);
                    //        cell = InsertCellInWorksheet("E", rowIndex, WorksheetPart);
                    //        cell.CellValue = new CellValue(moduleComponent.Color);
                    //        cell.DataType = new EnumValue<CellValues>(CellValues.String);
                    //        rowIndex++;
                    //    }
                    //}
                    //MergeCells("A" + startMerge + ":A" + (rowIndex - 1));
                    //MergeCells("B" + startMerge + ":B" + (rowIndex - 1));
                    //MergeCells("C" + startMerge + ":C" + (rowIndex - 1));
                    startMerge = rowIndex;
                });

Функция вставки ячейки

private Cell InsertCellInWorksheet(string columnName, uint rowIndex)
        {
            SheetData sheetData = Worksheet.GetFirstChild<SheetData>();
            string cellReference = columnName + rowIndex;
            Row row;
            if (sheetData.Elements<Row>().Where(r => r.RowIndex == rowIndex).Count() != 0)
            {
                row = sheetData.Elements<Row>().Where(r => r.RowIndex == rowIndex).First();
            }
            else
            {
                row = new Row() { RowIndex = rowIndex };
                sheetData.Append(row);
            }
            if (row.Elements<Cell>().Where(c => c.CellReference.Value == columnName + rowIndex).Count() > 0)
            {
                return row.Elements<Cell>().Where(c => c.CellReference.Value == cellReference).First();
            }
            else
            {
                Cell newCell = new Cell() { CellReference = cellReference, StyleIndex = 1 };
                row.Append(newCell);
                Worksheet.Save();
                return newCell;
            }
        }

После добавления данных при попытке открытия Excel выдает - "Ошибка в части содержимого. Выполнить попытку восстановления?" попробовал вставить всего одну ячейку - но эффект тот же. Как вставить ячейку в xlsx документ правильно?

Answer 1

В итоге поставил EPPlus - в разы более удобная вещь для Excel

public void FillChess4ExcelEPPlus(List<Order> orders, string filename)
        {
            FileInfo file = new FileInfo(filename);
            using (ExcelPackage excelPackage = new ExcelPackage(file))
            {
                ExcelWorksheet worksheet = excelPackage.Workbook.Worksheets[1];
                int rowIndex = 2;
                orders.ForEach(order =>
                {
                    int startMerge = rowIndex;
                    worksheet.Cells[rowIndex, 1].Value = order.SignDate;
                    worksheet.Cells[rowIndex, 2].Value = order.Number;
                    worksheet.Cells[rowIndex, 3].Value = order.DeliveryAddress;
                    foreach (OrderModule orderModule in order.OrderModule)
                    {
                        foreach (ModuleComponent moduleComponent in orderModule.ModuleComponent)
                        {
                            worksheet.Cells[rowIndex, 4].Value = orderModule.ModuleArticle;
                            worksheet.Cells[rowIndex, 5].Value = moduleComponent.Color;
                            rowIndex++;
                        }
                    }
                    worksheet.Cells["A" + startMerge + ":A"+ (rowIndex - 1)].Style.Numberformat.Format = DateTimeFormatInfo.CurrentInfo.ShortDatePattern;
                    worksheet.Cells["D" + startMerge + ":D" + (rowIndex - 1)].Style.Numberformat.Format = "0";
                    worksheet.Cells["A" + startMerge + ":A" + (rowIndex - 1)].Merge = true;
                    worksheet.Cells["B" + startMerge + ":B" + (rowIndex - 1)].Merge = true;
                    worksheet.Cells["C" + startMerge + ":C" + (rowIndex - 1)].Merge = true;
                    startMerge = rowIndex;
                });          
                excelPackage.Save();           
            }
        }
READ ALSO
Имитация нажатие клавиши

Имитация нажатие клавиши

Пишу бота для одной игры на C#

67
Предотвращение утери данных с помощью Alert

Предотвращение утери данных с помощью Alert

У меня есть такая секция в приложении:

65
Многопоточность в c#

Многопоточность в c#

Решил проверить мои знания в многопоточности и решить стандартную задачу, благодаря ейВыбрал задачу, в которой нужно найти количество возможных...

183