2012-08-12 38 views
5

Tôi có một Mẫu Excel với các trang tính khác nhau mà tôi đang lấy dữ liệu được lấy từ SQL Server bằng cách sử dụng OpenXML, C#. Sau khi tôi hoàn tất việc bán dữ liệu, tôi cần ẩn một số trang tính dựa trên các điều kiện. Tôi không thể tìm thấy bất kỳ đoạn mã nào để ẩn một trang tính cụ thể bằng cách sử dụng C# OpenXML.Làm thế nào để ẩn một trang tính trong Excel bằng cách sử dụng OpenXML C#?

Tôi đã thử những điều sau nhưng các trang tính không bị ẩn.

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(); 
} 
} 

Yêu cầu trợ giúp về điều này.

Cảm ơn.

Trả lời

8

Bạn phải đặt thuộc tính ActiveTab của WorkbookView lớp thành chỉ mục khác với chỉ mục của trang tính bạn muốn ẩn. Vì vậy, ví dụ: nếu bạn muốn ẩn trang tính đầu tiên (trang tính có chỉ mục 0) trong tệp excel của bạn, sau đó đặt thuộc tính ActiveTab thành chỉ mục bảng tính hiển thị tiếp theo.

Dưới đây là một ví dụ nhỏ mã (dựa trên mã mà bạn cung cấp):

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."); 
} 
+0

Thanks a lot. Điều này làm việc. :-) – Raghu

+1

Tôi đã thử cùng một mã, Đã qua quá trình gỡ lỗi từng dòng, mọi thứ đều hoạt động tốt. Nhưng sau khi thực thi mã. Khi tôi mở tập tin Excel không ẩn. Bạn có thể giúp tôi được không? –

+0

@NarendraKumar: Rất khó để giúp đỡ nếu không biết cấu trúc chính xác của tài liệu excel của bạn và tên của các bảng excel của bạn. Bạn có bao nhiêu tấm? – Hans

Các vấn đề liên quan