EPPlus 中的自动调整行
Autofit rows in EPPlus
我找不到使用 EPPlus Excel 库自动调整行高的方法。当我使用 Excel Interop 时,我可以做到 sheet.Rows.AutoFit()
。我正在使用 ILSpy 查看界面,但到目前为止我没有发现任何有用的东西。有什么解决方法,还是我遗漏了什么?
更新:第 4 行出现问题:
我试过 sheet.Row(4).CustomHeight = false,但没成功...
我也尝试在加载单元格内容之前和之后设置 属性 ,它仍然是一样的。它确实将行高调整为不同的值,但这不是一个好方法。也许 EPPlus 在测量琴弦高度方面存在问题?我知道当我弄乱了一些需要测量字符串的遗留 GDI+ 代码时,我确实遇到了很多问题...
实际上,如果您查看行对象的 属性 CustomHeight
,您会发现它默认设置为 false。这意味着 Excel 将(应该)在打开时自动设置行的高度。如果您想停止,您可以将其设置为 false
或手动设置行高,这将自动将其设置为 false
.
唯一的问题是,如果您依赖行的自动调整,那么您无法知道在 EPPlus 中构建时的高度是多少,因为 Excel 将决定它何时首先打开文件。有点像如果您使用 AutoFitColumn
函数,您无法知道列宽是多少。
这演示了属性的逻辑:
[TestMethod]
public void Row_Height_Test()
{
//
//Throw in some data
var datatable = new DataTable("tblData");
datatable.Columns.AddRange(new[]
{
new DataColumn("Col1", typeof (int)),
new DataColumn("Col2", typeof (int)),
new DataColumn("Col3", typeof (int))
});
for (var i = 0; i < 20; i++)
{
var row = datatable.NewRow();
row[0] = i;
row[1] = i * 10;
row[2] = i * 100;
datatable.Rows.Add(row);
}
var existingFile2 = new FileInfo(@"c:\temp\temp.xlsx");
if (existingFile2.Exists)
existingFile2.Delete();
using (var package = new ExcelPackage(existingFile2))
{
//Add the data
var ws = package.Workbook.Worksheets.Add("Sheet1");
ws.Cells.LoadFromDataTable(datatable, true);
//CustomHeight is set to false by default on all rows and giving such a large font
//will cause it to autosize to a bigger height by Excel when first opened
ws.Row(1).Style.Font.Size = 20;
//Setting the height manually will automatically set CustomHeight to true
//preventing excel from automatically setting the height
ws.Row(2).Height = 30;
ws.Row(2).Style.Font.Size = 20;
//row 1 height will be around 26 when opened in Excel (but cannot know that now),
//row 2 height will be 30 as set above,
//row 3 height will be the DefaultHeight (usually 15) of the worksheet since it can fit the default font
Console.WriteLine("{{{0} : {1}}}", ws.Row(1).Height, ws.Row(1).CustomHeight);
Console.WriteLine("{{{0} : {1}}}", ws.Row(2).Height, ws.Row(2).CustomHeight);
Console.WriteLine("{{{0} : {1}}}", ws.Row(3).Height, ws.Row(3).CustomHeight);
//Save the file
package.Save();
}
}
控制台日志输出如下:
{15 : False}
{30 : True}
{15 : False}
我花了几个小时才弄明白的另一个转折:如何在给定的列或行中启用自动换行。我是这样做的:
(水平和垂直对齐方式已设置为 "Center")
// Increase the height of the header row by .5
// (The height is already at 2 times the default value)
wsDT.Row(1).Height *= 1.5;
// Column index to Notes, Anniversary Month and Day
// add "1" since column index is relative to 0
int colIdx = dt.Columns.IndexOf("Notes") + 1;
// Set the column width
// This is a long text field - so width and word wrap are set
wsDT.Column(colIdx).Width = 50;
wsDT.Column(colIdx).Style.WrapText = true;
// Set width of anniversary month column
// Purpose here is to wrap header text
colIdx = dt.Columns.IndexOf("Lease Anniversary Month") + 1;
wsDT.Column(colIdx).Width = 15;
wsDT.Column(colIdx).Style.WrapText = true;
Header row showing wrapped text and set width
Contents of "Notes" row has wrapped text when appropriate
我找不到使用 EPPlus Excel 库自动调整行高的方法。当我使用 Excel Interop 时,我可以做到 sheet.Rows.AutoFit()
。我正在使用 ILSpy 查看界面,但到目前为止我没有发现任何有用的东西。有什么解决方法,还是我遗漏了什么?
更新:第 4 行出现问题:
我试过 sheet.Row(4).CustomHeight = false,但没成功... 我也尝试在加载单元格内容之前和之后设置 属性 ,它仍然是一样的。它确实将行高调整为不同的值,但这不是一个好方法。也许 EPPlus 在测量琴弦高度方面存在问题?我知道当我弄乱了一些需要测量字符串的遗留 GDI+ 代码时,我确实遇到了很多问题...
实际上,如果您查看行对象的 属性 CustomHeight
,您会发现它默认设置为 false。这意味着 Excel 将(应该)在打开时自动设置行的高度。如果您想停止,您可以将其设置为 false
或手动设置行高,这将自动将其设置为 false
.
唯一的问题是,如果您依赖行的自动调整,那么您无法知道在 EPPlus 中构建时的高度是多少,因为 Excel 将决定它何时首先打开文件。有点像如果您使用 AutoFitColumn
函数,您无法知道列宽是多少。
这演示了属性的逻辑:
[TestMethod]
public void Row_Height_Test()
{
//
//Throw in some data
var datatable = new DataTable("tblData");
datatable.Columns.AddRange(new[]
{
new DataColumn("Col1", typeof (int)),
new DataColumn("Col2", typeof (int)),
new DataColumn("Col3", typeof (int))
});
for (var i = 0; i < 20; i++)
{
var row = datatable.NewRow();
row[0] = i;
row[1] = i * 10;
row[2] = i * 100;
datatable.Rows.Add(row);
}
var existingFile2 = new FileInfo(@"c:\temp\temp.xlsx");
if (existingFile2.Exists)
existingFile2.Delete();
using (var package = new ExcelPackage(existingFile2))
{
//Add the data
var ws = package.Workbook.Worksheets.Add("Sheet1");
ws.Cells.LoadFromDataTable(datatable, true);
//CustomHeight is set to false by default on all rows and giving such a large font
//will cause it to autosize to a bigger height by Excel when first opened
ws.Row(1).Style.Font.Size = 20;
//Setting the height manually will automatically set CustomHeight to true
//preventing excel from automatically setting the height
ws.Row(2).Height = 30;
ws.Row(2).Style.Font.Size = 20;
//row 1 height will be around 26 when opened in Excel (but cannot know that now),
//row 2 height will be 30 as set above,
//row 3 height will be the DefaultHeight (usually 15) of the worksheet since it can fit the default font
Console.WriteLine("{{{0} : {1}}}", ws.Row(1).Height, ws.Row(1).CustomHeight);
Console.WriteLine("{{{0} : {1}}}", ws.Row(2).Height, ws.Row(2).CustomHeight);
Console.WriteLine("{{{0} : {1}}}", ws.Row(3).Height, ws.Row(3).CustomHeight);
//Save the file
package.Save();
}
}
控制台日志输出如下:
{15 : False}
{30 : True}
{15 : False}
我花了几个小时才弄明白的另一个转折:如何在给定的列或行中启用自动换行。我是这样做的:
(水平和垂直对齐方式已设置为 "Center")
// Increase the height of the header row by .5
// (The height is already at 2 times the default value)
wsDT.Row(1).Height *= 1.5;
// Column index to Notes, Anniversary Month and Day
// add "1" since column index is relative to 0
int colIdx = dt.Columns.IndexOf("Notes") + 1;
// Set the column width
// This is a long text field - so width and word wrap are set
wsDT.Column(colIdx).Width = 50;
wsDT.Column(colIdx).Style.WrapText = true;
// Set width of anniversary month column
// Purpose here is to wrap header text
colIdx = dt.Columns.IndexOf("Lease Anniversary Month") + 1;
wsDT.Column(colIdx).Width = 15;
wsDT.Column(colIdx).Style.WrapText = true;
Header row showing wrapped text and set width Contents of "Notes" row has wrapped text when appropriate