2013-06-29 197 views
0

我有一個範圍與現有的Excel文件中的條件格式。我使用EPPlus將該範圍複製到新工作表,然後我發現條件格式化丟失。複製範圍與條件格式

是否有任何方法使用EPPlus複製範圍與條件格式?

回答

-1

我有一個類似的問題,我發現檢查,更改或刪除單元格或範圍的條件格式的唯一方法是查看openxml規範。條件格式存儲在工作表中,範圍在屬性sqref下。所以你可以編輯該範圍或添加一個新的。

例如:

DIM p As New ExcelPackage(New FileInfo(ExlReportPath), True) 
Dim ws As ExcelWorksheet = p.Workbook.Worksheets(ExlSheetName) 

「--Find節點(在我的情況1) 「工作表」,查找所有子節點 「conditionalFormatting」(5至11日在我的測試)

Print.Debug(ws.WorksheetXml.ChildNodes(1).ChildNodes(5).Name) 

' - 您可以:conditionalFormatting

' --Now您可以檢查的範圍:

Print.Debug(ws.WorksheetXml.ChildNodes(1).ChildNodes(5).Attributes("sqref").Value) 

「--Will給你,這個格式適用於例如小區地址:‘D11:D15’ 」 - 您可以更改刪除或添加新的範圍,如果你想,下面我補充F11:F15

ws.WorksheetXml.ChildNodes(1).ChildNodes(5).Attributes("sqref").Value="D11:D15 F11:F15" 

「 - 您可以檢查在InnerXml也是規則本身...

如果需要的標記,谷歌沃特麪包車Vugt的更多細節,‘開放XML的標記說明’。我發現它很有用,完整的文檔在線(免費)。

如果您發現更簡單的方法,請發佈它。

Regards

1

我找到了解決方案。我沒有在所有formattingRuleTypes上測試它。 (目前只需要其中的2個) 在我的應用程序中,我爲每個工作表有1個模板行。

 var formatList = fromSheet.ConditionalFormatting.ToList(); 
     foreach (var cf in formatList) 
     { 
      // sourceRow is the row containing the formatting 
      if (cf.Address.Start.Row == sourceRow) 
      { 
       IExcelConditionalFormattingRule rule = null; 
       switch (cf.Type) 
       {      
        case OfficeOpenXml.ConditionalFormatting.eExcelConditionalFormattingRuleType.GreaterThan: 
         rule = dest.ConditionalFormatting.AddGreaterThan();        
         break; 
        case OfficeOpenXml.ConditionalFormatting.eExcelConditionalFormattingRuleType.GreaterThanOrEqual: 
         rule = dest.ConditionalFormatting.AddGreaterThanOrEqual(); 
         break; 
        case OfficeOpenXml.ConditionalFormatting.eExcelConditionalFormattingRuleType.LessThan: 
         rule = dest.ConditionalFormatting.AddLessThan(); 
         break; 
        case OfficeOpenXml.ConditionalFormatting.eExcelConditionalFormattingRuleType.LessThanOrEqual: 
         rule = dest.ConditionalFormatting.AddLessThanOrEqual(); 
         break;      
        default: 
         break; 
       } 
       rule.Style.Fill = cf.Style.Fill; 
       rule.Style.Border = cf.Style.Border; 
       rule.Style.Font = cf.Style.Font; 
       rule.Style.NumberFormat = cf.Style.NumberFormat; 

       // I have no clue why the Formula property is not included in the  IExcelConditionalFormattingRule interface. So I needed to cast this. 
       ((ExcelConditionalFormattingRule)rule).Formula = ((ExcelConditionalFormattingRule)cf).Formula; 
       ((ExcelConditionalFormattingRule)rule).Formula2 = ((ExcelConditionalFormattingRule)cf).Formula2; 


       // Calculate the new address for the formatting. This will be different in your case  
       var adr = new ExcelAddress(dest.Start.Row , cf.Address.Start.Column -1 , dest.Start.Row, cf.Address.Start.Column -1 + cf.Address.Columns -1); 


       rule.Address = adr; 

我不知道爲什麼Formula屬性不包含在IExcelConditionalFormattingRule接口中。所以我需要投這個。