2012-08-12 40 views
5

OpenXML、C#を使用してSQL Serverから取得したデータをダンプするさまざまなシートを含むExcelテンプレートがあります。 データをダンプした後、条件に基づいてシートの一部を非表示にする必要があります。 C#OpenXMLを使用して特定のシートを隠すコードが見つかりませんでした。OpenXML C#を使用してExcelでシートを非表示にする方法は?

私は以下を試しましたが、シートが隠されていませんでした。

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

これについてのヘルプをリクエストしてください。

ありがとうございました。

答えて

8

はあなたが 非表示にしたいワークシートのインデックスと異なるインデックスにWorkbookViewクラス のActiveTabプロパティを設定する必要があります。

たとえば、最初のワークシート(インデックス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."); 
} 
+0

どうもありがとうございました。これはうまくいった。 :-) – Raghu

+1

私は同じコードを試しました、各行のデバッグを通して、すべてがうまくいきます。しかし、コードの実行後。 Excelファイルシートを開いたときに隠れていませんでした。手伝って頂けますか? –

+0

@ NarendraKumar:Excel文書の正確な構造とExcelシートの名前を知らなくても、助けが非常に困難です。何枚持っていますか? – Hans

関連する問題