C # MVC Экспорт из БД в Excel.Объединить ячейки - PullRequest
0 голосов
/ 17 сентября 2018

Я знаю, что по этому вопросу есть много тем, но мои требования более конкретны. Я использую EF для выбора записей в своем проекте, а затем экспортирую их в Excel. Я использовал Этот фрагмент кода .

Позвольте мне объяснить, что я пытаюсь сделать. Учитывая следующую таблицу (это для упрощения, как вы увидите в коде, таблица немного больше):

Name | Content
 A     "Content1"
 A     "Content2"
 A     "Content3"
 B     "other content"
 ......

Когда я экспортирую в Excel, я не хочу, чтобы A появлялся 3 раза рядом с каждым контентом, я хотел бы иметь только одну букву «А» (что я смог сделать) и объединить 3 ячейки. (выровняйте их по центру, если это возможно) в один (не касаясь столбца Content).

Это мой код:

    public IActionResult Index()
    {
        var knownCampaigns = _repository.getDataForExport();
        //return View(result);
        string sWebRootFolder = _hostingEnvironment.WebRootPath;
        string sFileName = @"demo.xlsx";
        string URL = string.Format("{0}://{1}/{2}", Request.Scheme, Request.Host, sFileName);
        FileInfo file = new FileInfo(Path.Combine(sWebRootFolder, sFileName));
        if (file.Exists)
        {
            file.Delete();
            file = new FileInfo(Path.Combine(sWebRootFolder, sFileName));
        }
        using (ExcelPackage package = new ExcelPackage(file))
        {
            // add a new worksheet to the empty workbook
            ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("CampaignMatches");
            //First add the headers
            worksheet.Cells[1, 2].Value = "Customer Name";
            worksheet.Cells[1, 3].Value = "Guid";
            worksheet.Cells[1, 4].Value = "Campaign Title";
            worksheet.Cells[1, 5].Value = "Referrer Title";
            worksheet.Cells[1, 6].Value = "Activity Date";
            worksheet.Cells[1, 7].Value = "Is clicked?";
            int counter = 2;
            string oldGuid = "";
            foreach (var campaign in knownCampaigns)
            {
                if (oldGuid == campaign.Guid || worksheet.Cells["C" + (counter - 1)].Value.ToString() == campaign.Guid)
                {
                    oldGuid = campaign.Guid;
                    worksheet.Cells["A" + counter].Value = "";
                    worksheet.Cells["B" + counter].Value = "";
                }
                else
                {
                    oldGuid = "";
                    worksheet.Cells["A" + counter].Value = campaign.customerName;
                    worksheet.Cells["B" + counter].Value = campaign.Guid;
                }
                worksheet.Cells["C" + counter].Value = campaign.campaignTitle;
                worksheet.Cells["D" + counter].Value = campaign.reffererTitle;
                worksheet.Cells["E" + counter].Value = campaign.activityDate;
                worksheet.Cells["F" + counter].Value = campaign.is_clicked;
                counter++;
            }
            package.Save(); //Save the workbook.

        }
        var result = PhysicalFile(Path.Combine(sWebRootFolder, sFileName), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        Response.Headers["Content-Disposition"] = new ContentDispositionHeaderValue("attachment")
        {
            FileName = file.Name
        }.ToString();
        return result;
    }

Прямо сейчас мой столбец Customer Name и Guid отображается только один раз, как и предполагалось, но я не знаю, как объединить ячейки в одну ячейку.

Изображение токового выхода:

[! [Введите описание изображения здесь] [2]] [2]

Изображение желаемого результата:

[! [Введите описание изображения здесь] [3]] [3]

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Если кто-то столкнется с той же проблемой, мне удалось решить ее с помощью атрибута Merge, мне пришлось извлечь позиции из индекса начального столбца, индекса строки и индекса конца строки и индекса конца столбца.

 var Wsc_Guid = worksheet.Cells[startRowIndex, guidIndex, startRowIndex + numOfSameRecords, guidIndex];//Select the correct cells for Guids
 Wsc_Guid.Merge = true;
0 голосов
/ 17 сентября 2018

Похоже, это не так очевидно. Похоже, на листе есть свойство Elements, в которое можно добавить тип MergedCell. https://docs.microsoft.com/en-us/office/open-xml/how-to-merge-two-adjacent-cells-in-a-spreadsheet

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...