Запись в ячейки с использованием OpenXML в C # из DTO - PullRequest
1 голос
/ 04 апреля 2019

Как следует из названия, ниже находится DTO:

public class PropertyQuery
{
    public string UPRN { get; set; }

    public DateTime? DateAdded { get; set; }
}

За ним следует класс OpenXML с методом, который должен создавать электронную таблицу и записывать в поля A и B, двигаясь вниз:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;

public class OpenXML
{

    public static void BuildWorkbook(string filename, List<PropertyQuery> query)
    {
        using (SpreadsheetDocument xl = SpreadsheetDocument.Create(filename, SpreadsheetDocumentType.Workbook))
        {
            WorkbookPart wbp = xl.AddWorkbookPart();
            WorksheetPart wsp = wbp.AddNewPart<WorksheetPart>();
            Workbook wb = new Workbook();
            FileVersion fv = new FileVersion();
            fv.ApplicationName = "Microsoft Office Excel";

            Worksheet ws = new Worksheet();
            SheetData sd = new SheetData();

            Row r1 = new Row();
            Row r2 = new Row();
            Cell c1 = new Cell();
            Cell c2 = new Cell();

            uint count = 0;

            foreach (var i in query)
            {
                r1 = new Row();
                r2 = new Row();
                c1 = new Cell();
                c2 = new Cell();

                string UPRN = i.UPRN.ToString();
                string dateAdded = i.DateAdded.ToString();

                r1.RowIndex = count;
                r2.RowIndex = count;

                c1.CellReference = "A" + r1.RowIndex;
                c2.CellReference = "B" + r2.RowIndex;

                c1.DataType = CellValues.String;
                c2.DataType = CellValues.String;

                c1.CellValue = new CellValue(UPRN);
                c2.CellValue = new CellValue(dateAdded);

                r1.Append(c1);
                r2.Append(c2);

                sd.Append(r1);
                sd.Append(r2);

                count++;
            }

            ws.Append(sd);
            wsp.Worksheet = ws;

            wsp.Worksheet.Save();
            Sheets sheets = new Sheets();
            Sheet sheet = new Sheet();
            sheet.Name = "Data";
            sheet.SheetId = 1;
            sheet.Id = wbp.GetIdOfPart(wsp);
            sheets.Append(sheet);
            wb.Append(fv);
            wb.Append(sheets);

            xl.WorkbookPart.Workbook = wb;
            xl.WorkbookPart.Workbook.Save();
            xl.Close();
        }
    }
}

Мой код запускается и создает электронную таблицу, однако я получаю уведомление о ее повреждении при попытке открыть ее. DTO предназначен для возврата около 600+ строк.

Любой совет приветствуется. Благодарю.

1 Ответ

0 голосов
/ 05 апреля 2019

Ты так близко. Проблема в том, что RowIndex должно быть больше 0, но ваше значение начинается с 0.

Исправление тривиально; изменить начальное значение count с 0 на 1.

...