C#EPPLUS:将列自动调整为最大值自动调整不起作用

C#EPPLUS:将列自动调整为最大值自动调整不起作用,c#,epplus,C#,Epplus,我正在使用EPPlus生成大量excel文档,在格式化方面遇到了一些困难 我用过 xlWorkSheet.Cells.AutoFitColumns(); 这似乎适用于数据,但不会自动调整列名的大小。例如,我将打开文件,我可以看到列名聚在一起。我也可以点击一列的边框,它会将该列进一步展开。事实上,我可以这样做大约5次,然后它似乎达到最大的自动大小。从本质上说,我希望通过编程设置每一列,使其处于此最大值(我甚至多次尝试应用AutoFitColumns,但这没有什么区别) 有办法做到这一点吗 请注意

我正在使用EPPlus生成大量excel文档,在格式化方面遇到了一些困难

我用过

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);
    }
}
private void GeneralTest()
{
var ReportName=“myReport”
int ReportID=123
var SelectedMonth=“2018年4月”
var LAGroup=“全部”
var fileName=$“{ReportName}{SelectedMonth}{LAGroup}.xlsx”;
//删除所有非法字符并替换为下划线
var[]disallowedCharacters=new[]{“/”、@“\”、“?”、“%”、“*”、“:”、“|”、“\”、“};
foreach(不允许字符中的var字符)
fileName=fileName.Replace(字符“”);
var filePath=$@“c:\Test\{fileName}”;
if(File.Exists(filePath))
File.Delete(文件路径);
FileInfo NewFile=newfileinfo(filePath);
使用(ExcelPackage MyExcel=newexcelpackage(NewFile))
{
var myTestdt=MyGetDataFunction(ReportID,DateTime.Parse(SelectedMonth));
excel工作表;
xlWorkSheet=MyExcel.Workbook.Worksheets.Add(“模板”);
xlWorkSheet.Name=“模板”;
xlWorkSheet.Cells(“A1”).LoadFromDataTable(myTestdt,true);
var formatRange=xlsheet.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;

对于(int index=0;index,这是我编写的一个简单类,用于从数据集创建Excel

请注意,我故意避免捕捉异常,因为我在调用者中捕捉异常。

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时,所有列都正确显示,无论是标题还是内容。

我遇到了几乎相同的问题,这确实为我解决了这个问题:

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


这会在需要时自动调整列的大小。

何时调用
xlsheetwork.Cells.AutoFitColumns();
?我会尽可能晚地调用它。调用AutoFitColumns方法时,所有单元格都应该包含它们的最终值。我在保存文档之前调用它。AutoFitColumns确实有效…它适用于数据,但由于某种原因它不适用于列名。我将发布一个答案。它对我有效。Read并提供a.“列名”到底是什么?它们有多长?我已经用我的代码的一个通用示例更新了这个问题。我所指的列名是我的数据表的列名。它们的长度从6个字符到50个字符不等。“这在这个完全不相关的代码中对我有效。”“不是答案。我只是想提供一个工作代码示例,以表明AutoFitColumns()确实有效。我实际上已经尝试了ew.Cells[ew.Dimension.Address].AutoFitColumns()另外,它也不起作用。然后当@ CODECAST注意到的时候,你应该检查你在第一行中写了什么,我假设你认为是“列名”。“根据范围的内容设置列宽。最小宽度是ExcelWorksheet.defaultColumnWidth属性的值。注意:由于EPPlus没有计算引擎,包含公式的单元格将被忽略。换行单元格和合并单元格也将被忽略。“这就是PSkalka的答案,删除WrapText修复了它。格式设置仍处于关闭状态,但我应该能够使用现在的格式。有时,是的。但EPPlus有很多很多属性导致这种情况不会发生。我目前有
计算日期和时间(UTC)
显示为
时间(UTC)使用“自动拟合”来计算