C # EPPLUS: автоматическое изменение размера столбцов до максимального размера не работает - PullRequest
0 голосов
/ 30 мая 2018

Я создаю ряд документов Excel с EPPlus, и у меня возникают некоторые трудности с форматированием.

Я использовал

xlWorkSheet.Cells.AutoFitColumns();

, и это, похоже, работает для данных, но не изменяет размер имен столбцов.Например, я открою файл и увижу, как сгруппированы имена столбцов.Я также могу нажать на границу столбца, и он будет расширять столбец больше.На самом деле я могу сделать это примерно 5 раз, прежде чем он достигнет своего максимального значения для автоматического определения размера.По сути, я хочу программно установить каждый столбец таким образом, чтобы он достиг максимума (я даже пытался применять AutoFitColumns несколько раз, однако это не имело никакого значения).

Есть ли способ сделать это?

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

РЕДАКТИРОВАТЬ: Вот мой обобщенный код

private void GeneralTest()
{
    var ReportName = "myReport"
    int ReportID = 123
    var SelectedMonth = "April 2018"
    var LAGroup = "all"
    var fileName = $"{ReportName}_{SelectedMonth}_{LAGroup}.xlsx";
    // Remove all illegal characters and replace with underscores
    var[] disallowedCharacters = new[] { "/", @"\", "?", "%", "*", ":", "|", "\"", "<", ">" };
    foreach (var character in disallowedCharacters)
        fileName = fileName.Replace(character, "_");

    var filePath = $@"c:\Test\{fileName}";
    if (File.Exists(filePath))
        File.Delete(filePath);
    FileInfo NewFile = new FileInfo(filePath);

    using (ExcelPackage MyExcel = new ExcelPackage(NewFile))
    {
        var myTestdt = MyGetDataFunction(ReportID, DateTime.Parse(SelectedMonth));
        ExcelWorksheet xlWorkSheet;

        xlWorkSheet = MyExcel.Workbook.Worksheets.Add("Template");
        xlWorkSheet.Name = "Template";

        xlWorkSheet.Cells("A1").LoadFromDataTable(myTestdt, true);

        var formatRange = xlWorkSheet.Cells(1, 1, 1, myTestdt.Columns.Count);

        formatRange.Style.Font.Bold = true;
        formatRange.Style.Fill.PatternType = Style.ExcelFillStyle.Solid;
        formatRange.Style.Fill.BackgroundColor.SetColor(System.Drawing.ColorTranslator.FromHtml("#CDFFCC"));
        formatRange.Style.Font.Size = 10;
        formatRange.Style.Font.Name = "Arial";
        formatRange.Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center;
        formatRange.Style.VerticalAlignment = OfficeOpenXml.Style.ExcelVerticalAlignment.Center;
        formatRange.Style.WrapText = true;

        formatRange.AutoFilter = true;

        for (int index = 0; index <= myTestdt.Columns.Count - 1; index++)
        {
            if (myTestdt.Columns(index).DataType.Name == "DateTime")
            {
                formatRange = xlWorkSheet.Cells(2, index + 1, myTestdt.Rows.Count, index + 1);
                formatRange.Style.Numberformat.Format = "dd/mm/yyyy";
            }
        }

        xlWorkSheet.View.FreezePanes(2, 2);

        xlWorkSheet.Cells.AutoFitColumns();

        MyExcel.SaveAs(NewFile);
    }
}

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Я столкнулся почти с той же проблемой, и это решило ее для меня:

ew.Cells[ew.Dimension.Address].AutoFitColumns();

Это позволяет автоматически подгонять столбцы к размеру и ширине, когда это необходимо.

0 голосов
/ 30 мая 2018

Это простой класс, который я написал для создания Excel из DataSet.

Обратите внимание, что я намеренно избегал перехвата исключений, потому что я делаю это в вызывающей программе.

using OfficeOpenXml;
using System;
using System.Collections.Generic;
using System.Data;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Ds2Xlsx
{

    public class Ds2ExcelEngine
    {

        public static void CreateExcel(
            DataSet ds,
            string path,
            OfficeOpenXml.Table.TableStyles tableStyle = OfficeOpenXml.Table.TableStyles.Light9,
            bool autofitColumns = true)
        {
            if (ds != null)
            {
                using (ExcelPackage ep = new ExcelPackage())
                {
                    foreach (DataTable dt in ds.Tables)
                    {
                        AddTableWorksheet(tableStyle, autofitColumns, ep, dt);
                    }
                    ep.SaveAs(new System.IO.FileInfo(path));
                }
            }
        }

        private static void AddTableWorksheet(OfficeOpenXml.Table.TableStyles tableStyle, bool autofitColumns, ExcelPackage ep, DataTable dt)
        {
            ExcelWorksheet ew = ep.Workbook.Worksheets.Add(dt.TableName);
            int row = 1;
            int column = 1;
            foreach (DataColumn dc in dt.Columns)
            {
                ew.Cells[row, column].Value = dc.Caption;
                column++;
            }

            foreach (DataRow dr in dt.Rows)
            {
                column = 1;
                row++;
                foreach (DataColumn dc in dt.Columns)
                {
                    ew.Cells[row, column].Value = dr[dc];
                    column++;
                }
            }

            column = 1;
            foreach (DataColumn dc in dt.Columns)
            {
                if (dc.DataType == typeof(DateTime))
                {
                    ew.Cells[1, column, row, column].Style.Numberformat.Format = DateTimeFormatInfo.CurrentInfo.ShortDatePattern;
                }
                column++;
            }

            var excelTable = ew.Tables.Add(new ExcelAddressBase(1, 1, row, column - 1), $"tbl_{ dt.TableName }");
            excelTable.TableStyle = tableStyle;
            if (autofitColumns)
            {
                ew.Cells[ew.Dimension.Address].AutoFitColumns();
            }
        }
    }

}

Когда я открываю созданный Excel, все столбцы отображаются правильно, либо заголовки, либо содержимое.

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