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