我有一个带有各种工作表的Excel模板,我使用OpenXML,C#转储从SQL Server中检索的数据。 在完成转储数据后,我需要根据条件隐藏一些工作表。我找不到任何代码来使用C#OpenXML隐藏特定的工作表。
我尝试了以下但是床单没有隐藏。
byte[] byteArray = File.ReadAllBytes("D:\\rptTemplate.xlsx");
using (MemoryStream mem = new MemoryStream())
{
mem.Write(byteArray, 0, (int)byteArray.Length);
using (SpreadsheetDocument rptTemplate = SpreadsheetDocument.Open(mem, true))
{
foreach (OpenXmlElement oxe in (rptTemplate.WorkbookPart.Workbook.Sheets).ChildElements)
{
if(((DocumentFormat.OpenXml.Spreadsheet.Sheet)(oxe)).Name == "ABC")
((DocumentFormat.OpenXml.Spreadsheet.Sheet)(oxe)).State = SheetStateValues.Hidden;
}
rptTemplate.WorkbookPart.Workbook.Save();
}
}
请求帮助。
感谢。
答案 0 :(得分:10)
您必须设置ActiveTab
类的WorkbookView
属性
到索引不同于您的工作表的索引
我想隐藏。
因此,例如,如果您想要隐藏第一个工作表(索引为0的工作表)
在excel文件中,然后将ActiveTab
属性设置为下一个可见工作表索引。
这是一个小代码示例(基于您提供的代码):
static void Main(string[] args)
{
byte[] byteArray = File.ReadAllBytes("D:\\rptTemplate.xlsx");
using (MemoryStream mem = new MemoryStream())
{
mem.Write(byteArray, 0, (int)byteArray.Length);
using (SpreadsheetDocument rptTemplate = SpreadsheetDocument.Open(mem, true))
{
foreach (OpenXmlElement oxe in (rptTemplate.WorkbookPart.Workbook.Sheets).ChildElements)
{
if(((DocumentFormat.OpenXml.Spreadsheet.Sheet)(oxe)).Name == "ABC")
{
((DocumentFormat.OpenXml.Spreadsheet.Sheet)(oxe)).State = SheetStateValues.Hidden;
WorkbookView wv = rptTemplate.WorkbookPart.Workbook.BookViews.ChildElements.First<WorkbookView>();
if (wv != null)
{
wv.ActiveTab = GetIndexOfFirstVisibleSheet(rptTemplate.WorkbookPart.Workbook.Sheets);
}
}
}
rptTemplate.WorkbookPart.Workbook.Save();
}
}
}
private static uint GetIndexOfFirstVisibleSheet(Sheets sheets)
{
uint index = 0;
foreach (Sheet currentSheet in sheets.Descendants<Sheet>())
{
if (currentSheet.State == null || currentSheet.State.Value == SheetStateValues.Visible)
{
return index;
}
index++;
}
throw new Exception("No visible sheet found.");
}
答案 1 :(得分:0)
要隐藏工作表,请将工作表的“状态”属性应用于所有工作表。默认情况下,工作表的“状态”属性为空。以下是我所做的更改,它隐藏了 Sheet2。
Sheet sheet1 = new Sheet() { Name = "Sheet1", State = SheetStateValues.Visible, SheetId = (UInt32Value)1U, Id = "rId1" };
Sheet sheet2 = new Sheet() { Name = "Sheet2", State = SheetStateValues.Hidden, SheetId = (UInt32Value)2U, Id = "rId2" };