将包含所有条件格式设置规则的excel文件导入到epplus

我有一个excel文件,其中包含大量数据以及基于单元格中的值的图标集和数据栏。 它看起来像这样: 在此处输入图像描述

我想导入此excel表以及条件格式。 这有什么图书馆? 我浏览了这个http://www.sitecorecleveland.com/resources/blogs-posts/easy_excel_interaction_pt6但它只导入数据而不是格式。

如果那是不可能的,那么在epplus中有代码可以在Excel工作表中使用这些图标集。 我可以有箭头,红绿灯等,但不是这些。

我不认为EPP支持自定义条件格式,它在Excel文件的xml中存储为“Workbook Extensions”。 您可以将包含自定义格式的“extLst”的xml节点从一个工作表复制到另一个工作表。 只需确保在您不希望复制的节点中的cond格式化xml旁边没有其他内容,在这种情况下,您只需要选择所需的子节点。

为了测试,我创建了以下excel表(temp.xlsx),仅执行了一个copy.paste值并保存到一个新文件(temp2.​​xlsx):

在此处输入图像描述

然后运行以下命令并成功复制格式:

public void Custom_Condition_Copy_Test() { //http://stackoverflow.com/questions/28493050/importing-excel-file-with-all-the-conditional-formatting-rules-to-epplus //File with custom conditional formatting var existingFile = new FileInfo(@"c:\temp\temp.xlsx"); //Copy of the file with the conditonal formatting removed var existingFile2 = new FileInfo(@"c:\temp\temp2.xlsx"); using (var package = new ExcelPackage(existingFile)) using (var package2 = new ExcelPackage(existingFile2)) { //Make sure there are document element for the source var worksheet = package.Workbook.Worksheets.First(); var xdoc = worksheet.WorksheetXml; if (xdoc.DocumentElement == null) return; //Make sure there are document element for the destination var worksheet2 = package2.Workbook.Worksheets.First(); var xdoc2 = worksheet2.WorksheetXml; if (xdoc2.DocumentElement == null) return; //get the extension list node 'extLst' from the ws with the formatting var extensionlistnode = xdoc .DocumentElement .GetElementsByTagName("extLst")[0]; //Create the import node and append it to the end of the xml document var newnode = xdoc2.ImportNode(extensionlistnode, true); xdoc2.LastChild.AppendChild(newnode); package2.Save(); } } 

可能想在那里试一试,但这应该让你接近。


更新:基于OP评论。

如果您希望能够添加自定义条件格式而不需要包含它的原始文件,我会看到两个选项。

选项1 ,您使用更“正确”的方式并使用DocumentFormat.OpenXml命名空间。 但是,这将要求您提供Office Open XML库,这可能会也可能不那么容易,具体取决于您运行此环境的环境。您可以从此处获取它http://www.microsoft.com/en-我们/ download / details.aspx?id = 30425它附带了一个reflection工具,可以生成你想要的代码,它可以帮到你:

 using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; using DocumentFormat.OpenXml; using X14 = DocumentFormat.OpenXml.Office2010.Excel; using Excel = DocumentFormat.OpenXml.Office.Excel; ...... WorksheetExtensionList worksheetExtensionList1 = new WorksheetExtensionList(); WorksheetExtension worksheetExtension1 = new WorksheetExtension(){ Uri = "{78C0D931-6437-407d-A8EE-F0AAD7539E65}" }; worksheetExtension1.AddNamespaceDeclaration("x14", "http://schemas.microsoft.com/office/spreadsheetml/2009/9/main"); X14.ConditionalFormattings conditionalFormattings1 = new X14.ConditionalFormattings(); X14.ConditionalFormatting conditionalFormatting1 = new X14.ConditionalFormatting(); conditionalFormatting1.AddNamespaceDeclaration("xm", "http://schemas.microsoft.com/office/excel/2006/main"); X14.ConditionalFormattingRule conditionalFormattingRule1 = new X14.ConditionalFormattingRule(){ Type = ConditionalFormatValues.IconSet, Priority = 2, Id = "{CD6B2710-0474-449D-881A-22CFE15D011D}" }; X14.IconSet iconSet1 = new X14.IconSet(){ IconSetTypes = X14.IconSetTypeValues.FiveArrows, Custom = true }; X14.ConditionalFormattingValueObject conditionalFormattingValueObject1 = new X14.ConditionalFormattingValueObject(){ Type = X14.ConditionalFormattingValueObjectTypeValues.Percent }; Excel.Formula formula1 = new Excel.Formula(); formula1.Text = "0"; conditionalFormattingValueObject1.Append(formula1); X14.ConditionalFormattingValueObject conditionalFormattingValueObject2 = new X14.ConditionalFormattingValueObject(){ Type = X14.ConditionalFormattingValueObjectTypeValues.Percent }; Excel.Formula formula2 = new Excel.Formula(); formula2.Text = "20"; conditionalFormattingValueObject2.Append(formula2); X14.ConditionalFormattingValueObject conditionalFormattingValueObject3 = new X14.ConditionalFormattingValueObject(){ Type = X14.ConditionalFormattingValueObjectTypeValues.Percent }; Excel.Formula formula3 = new Excel.Formula(); formula3.Text = "40"; conditionalFormattingValueObject3.Append(formula3); X14.ConditionalFormattingValueObject conditionalFormattingValueObject4 = new X14.ConditionalFormattingValueObject(){ Type = X14.ConditionalFormattingValueObjectTypeValues.Percent }; Excel.Formula formula4 = new Excel.Formula(); formula4.Text = "60"; conditionalFormattingValueObject4.Append(formula4); X14.ConditionalFormattingValueObject conditionalFormattingValueObject5 = new X14.ConditionalFormattingValueObject(){ Type = X14.ConditionalFormattingValueObjectTypeValues.Percent }; Excel.Formula formula5 = new Excel.Formula(); formula5.Text = "80"; conditionalFormattingValueObject5.Append(formula5); X14.ConditionalFormattingIcon conditionalFormattingIcon1 = new X14.ConditionalFormattingIcon(){ IconSet = X14.IconSetTypeValues.ThreeSymbols, IconId = (UInt32Value)0U }; X14.ConditionalFormattingIcon conditionalFormattingIcon2 = new X14.ConditionalFormattingIcon(){ IconSet = X14.IconSetTypeValues.ThreeTrafficLights1, IconId = (UInt32Value)0U }; X14.ConditionalFormattingIcon conditionalFormattingIcon3 = new X14.ConditionalFormattingIcon(){ IconSet = X14.IconSetTypeValues.ThreeTriangles, IconId = (UInt32Value)0U }; X14.ConditionalFormattingIcon conditionalFormattingIcon4 = new X14.ConditionalFormattingIcon(){ IconSet = X14.IconSetTypeValues.ThreeTriangles, IconId = (UInt32Value)1U }; X14.ConditionalFormattingIcon conditionalFormattingIcon5 = new X14.ConditionalFormattingIcon(){ IconSet = X14.IconSetTypeValues.ThreeTriangles, IconId = (UInt32Value)2U }; iconSet1.Append(conditionalFormattingValueObject1); iconSet1.Append(conditionalFormattingValueObject2); iconSet1.Append(conditionalFormattingValueObject3); iconSet1.Append(conditionalFormattingValueObject4); iconSet1.Append(conditionalFormattingValueObject5); iconSet1.Append(conditionalFormattingIcon1); iconSet1.Append(conditionalFormattingIcon2); iconSet1.Append(conditionalFormattingIcon3); iconSet1.Append(conditionalFormattingIcon4); iconSet1.Append(conditionalFormattingIcon5); conditionalFormattingRule1.Append(iconSet1); Excel.ReferenceSequence referenceSequence1 = new Excel.ReferenceSequence(); referenceSequence1.Text = "A1:C201"; conditionalFormatting1.Append(conditionalFormattingRule1); conditionalFormatting1.Append(referenceSequence1); conditionalFormattings1.Append(conditionalFormatting1); worksheetExtension1.Append(conditionalFormattings1); worksheetExtensionList1.Append(worksheetExtension1); .... worksheet1.Append(worksheetExtensionList1); 

选项2将按照您的要求执行并执行字符串操作。 这更容易但是它有点脏,因为你正在弄乱字符串而不是对象,但是如果你需要设置的唯一的东西是那些看起来不那么糟糕的单元格范围。 我使用上面的测试方法用= extensionlistnode.OuterXml提取字符串:

 [TestMethod] public void Custom_Condition_From_String_Test() { //http://stackoverflow.com/questions/28493050/importing-excel-file-with-all-the-conditional-formatting-rules-to-epplus //Throw in some data var datatable = new DataTable("tblData"); datatable.Columns.Add(new DataColumn("Col1", typeof(int))); datatable.Columns.Add(new DataColumn("Col2", typeof(int))); datatable.Columns.Add(new DataColumn("Col3", typeof(int))); for (var i = 0; i < 20; i++) { var row = datatable.NewRow(); row["Col1"] = i; row["Col2"] = i * 10; row["Col3"] = i * 100; datatable.Rows.Add(row); } //Copy of the file with the conditonal formatting removed var existingFile2 = new FileInfo(@"c:\temp\temp2.xlsx"); if (existingFile2.Exists) existingFile2.Delete(); using (var package2 = new ExcelPackage(existingFile2)) { //Add the data var ws = package2.Workbook.Worksheets.Add("Content"); ws.Cells.LoadFromDataTable(datatable, true); //The XML String extracted from the orginal excel doc using '= extensionlistnode.OuterXml' var cellrange = "A1:C201"; var rawxml = String.Format( "020406080{0}" , cellrange); var newxdoc = new XmlDocument(); newxdoc.LoadXml(rawxml); //Create the import node and append it to the end of the xml document var xdoc2 = ws.WorksheetXml; var newnode = xdoc2.ImportNode(newxdoc.FirstChild, true); xdoc2.LastChild.AppendChild(newnode); package2.Save(); } }