使用 C# 和 EPPlus 冻结 Excel 中的窗格
Freeze panes in Excel using C# and EPPlus
我想冻结 excel 中的前 5 列和前 3 行。
我为此编写了以下代码
Worksheets.View.FreezePanes(5, 5);
但它也冻结了前 4 行中的列。
我想冻结 excel 中的前 4 列,但前 4 行除外。
可以吗?
第一个值是您要冻结的行数,第二个值是您要冻结的列数。因此,要冻结前 3 行和 5 列,您需要按如下方式调用它:
Worksheets.View.FreezePanes(3, 5);
您还可以查看 this SO question 了解有关 FreezePanes
的更多信息。
可以调用sheet.FreezePanes(int rowIndex, int columnIndex)方法设置冻结区域
代码示例:
using System;
using Spire.Xls;
using System.Drawing;
namespace FreezePane
{
class Program
{
static void Main(string[] args)
{
//Load File
Workbook workbook = new Workbook();
workbook.LoadFromFile
(@"E:\Work\Documents\ExcelFiles\UserInfo.xlsx");
Worksheet sheet = workbook.Worksheets[0];
//Freeze Top Row
sheet.FreezePanes(2, 1);
//Save and Launch
workbook.SaveToFile("FreezePane.xlsx", ExcelVersion.Version2010);
System.Diagnostics.Process.Start(workbook.FileName);
}
}
}
对我来说冻结第一行的代码有效。我不确定那里的逻辑是什么。
worksheet.View.FreezePanes(2,1);
从 ExcelWorksheet 对象访问 View 属性。
在返回的ExcelWorksheetView对象上,调用FreezePanes(row, column)方法,传递未冻结的第一个单元格的行和列。
例如,要冻结 Excel 工作表的前两个完整窗格,您需要传入列 (3,1) 到行参数:
worksheetObject.View.FreezePanes(3, 1);
所以要只完全冻结第一行你现在只能调用worksheetObject.View.FreezePanes(2,1);
!
这是EPPlus官方Example中的also mentioned
因此要回答@user2148124 提出的原始问题,答案应该是
worksheetObject.View.FreezePanes(3, 5);
我知道距离主题中的最后一个 post 已经有很长时间了,但我最近正在处理这个问题,我找到了获得我想要的东西的方法 (EPPlus v4.5.3):
public static void FreezeHeader(ExcelWorksheet sheet)
{
var xdoc = sheet.WorksheetXml;
var sheetViews = xdoc.GetElementsByTagName("sheetViews");
var sheetViewNode = sheetViews[0].ChildNodes[0];
var paneNode = xdoc.CreateNode(System.Xml.XmlNodeType.Element, "pane", xdoc.DocumentElement.NamespaceURI);
var ySplit = xdoc.CreateAttribute("ySplit");
ySplit.Value = "1";
var topLeftCell = xdoc.CreateAttribute("topLeftCell");
topLeftCell.Value = "A2";
var activePane = xdoc.CreateAttribute("activePane");
activePane.Value = "bottomLeft";
var state = xdoc.CreateAttribute("state");
state.Value = "frozen";
paneNode.Attributes.Append(ySplit);
paneNode.Attributes.Append(topLeftCell);
paneNode.Attributes.Append(activePane);
paneNode.Attributes.Append(state);
sheetViewNode.AppendChild(paneNode);
}
我通过比较两个 Excel 文件(一个冻结 header 和另一个 witouht)的 xml 实现了这一点。
通常在创建一个简单的 excel 文件时,您会得到以下内容:
<sheetViews>
<sheetView workbookViewId="0">
</sheetView>
</sheetViews>
现在,如果您冻结第一行并检查 xml,您将看到:
<sheetViews>
<sheetView tabSelected="1" topLeftCell="Z1" zoomScale="85" zoomScaleNormal="85" workbookViewId="0">
<pane ySplit="1" topLeftCell="A213" activePane="bottomLeft" state="frozen"/>
<selection activeCell="O1" sqref="O1"/><selection pane="bottomLeft" activeCell="AD229" sqref="AD229"/>
</sheetView>
据我推断,我必须将“窗格”节点添加到 xml 结构中:
<pane ySplit="1" topLeftCell="A213" activePane="bottomLeft" state="frozen"/>
这就是我提供的代码所做的:-)
我想冻结 excel 中的前 5 列和前 3 行。 我为此编写了以下代码
Worksheets.View.FreezePanes(5, 5);
但它也冻结了前 4 行中的列。 我想冻结 excel 中的前 4 列,但前 4 行除外。 可以吗?
第一个值是您要冻结的行数,第二个值是您要冻结的列数。因此,要冻结前 3 行和 5 列,您需要按如下方式调用它:
Worksheets.View.FreezePanes(3, 5);
您还可以查看 this SO question 了解有关 FreezePanes
的更多信息。
可以调用sheet.FreezePanes(int rowIndex, int columnIndex)方法设置冻结区域
代码示例:
using System;
using Spire.Xls;
using System.Drawing;
namespace FreezePane
{
class Program
{
static void Main(string[] args)
{
//Load File
Workbook workbook = new Workbook();
workbook.LoadFromFile
(@"E:\Work\Documents\ExcelFiles\UserInfo.xlsx");
Worksheet sheet = workbook.Worksheets[0];
//Freeze Top Row
sheet.FreezePanes(2, 1);
//Save and Launch
workbook.SaveToFile("FreezePane.xlsx", ExcelVersion.Version2010);
System.Diagnostics.Process.Start(workbook.FileName);
}
}
}
对我来说冻结第一行的代码有效。我不确定那里的逻辑是什么。
worksheet.View.FreezePanes(2,1);
从 ExcelWorksheet 对象访问 View 属性。
在返回的ExcelWorksheetView对象上,调用FreezePanes(row, column)方法,传递未冻结的第一个单元格的行和列。
例如,要冻结 Excel 工作表的前两个完整窗格,您需要传入列 (3,1) 到行参数:
worksheetObject.View.FreezePanes(3, 1);
所以要只完全冻结第一行你现在只能调用worksheetObject.View.FreezePanes(2,1);
!
这是EPPlus官方Example中的also mentioned
因此要回答@user2148124 提出的原始问题,答案应该是
worksheetObject.View.FreezePanes(3, 5);
我知道距离主题中的最后一个 post 已经有很长时间了,但我最近正在处理这个问题,我找到了获得我想要的东西的方法 (EPPlus v4.5.3):
public static void FreezeHeader(ExcelWorksheet sheet)
{
var xdoc = sheet.WorksheetXml;
var sheetViews = xdoc.GetElementsByTagName("sheetViews");
var sheetViewNode = sheetViews[0].ChildNodes[0];
var paneNode = xdoc.CreateNode(System.Xml.XmlNodeType.Element, "pane", xdoc.DocumentElement.NamespaceURI);
var ySplit = xdoc.CreateAttribute("ySplit");
ySplit.Value = "1";
var topLeftCell = xdoc.CreateAttribute("topLeftCell");
topLeftCell.Value = "A2";
var activePane = xdoc.CreateAttribute("activePane");
activePane.Value = "bottomLeft";
var state = xdoc.CreateAttribute("state");
state.Value = "frozen";
paneNode.Attributes.Append(ySplit);
paneNode.Attributes.Append(topLeftCell);
paneNode.Attributes.Append(activePane);
paneNode.Attributes.Append(state);
sheetViewNode.AppendChild(paneNode);
}
我通过比较两个 Excel 文件(一个冻结 header 和另一个 witouht)的 xml 实现了这一点。
通常在创建一个简单的 excel 文件时,您会得到以下内容:
<sheetViews>
<sheetView workbookViewId="0">
</sheetView>
</sheetViews>
现在,如果您冻结第一行并检查 xml,您将看到:
<sheetViews>
<sheetView tabSelected="1" topLeftCell="Z1" zoomScale="85" zoomScaleNormal="85" workbookViewId="0">
<pane ySplit="1" topLeftCell="A213" activePane="bottomLeft" state="frozen"/>
<selection activeCell="O1" sqref="O1"/><selection pane="bottomLeft" activeCell="AD229" sqref="AD229"/>
</sheetView>
据我推断,我必须将“窗格”节点添加到 xml 结构中:
<pane ySplit="1" topLeftCell="A213" activePane="bottomLeft" state="frozen"/>
这就是我提供的代码所做的:-)