2017-01-13 5 views
1

, was ich brauche, ist Reihen-Gruppe, wenn der Wert der Zeile die gleiche wie die vorhergehende Zeile ist, ist der Wert von „B3“ das gleiche von „B2“, wie folgt aus:Gruppierung Excel-Zeilen mit EPPLUS

enter image description here

ich benutze C# mit epplus, und ich sehe, wie ich etwas ähnliches mit der Umriss-Option tun kann, und ist ähnlich, was ich will, aber diese Option hat einige Nachteile, wie das was nicht tut gruppiert automatisch auf Basis von Werten und kann verschiedene Gruppen nicht ausführen ....

ist es möglich, dies mit EPPLUS zu tun? wenn es ist nicht posible, wie ich den VBA-Code C# hinzufügen kann ?, ich versuche dies:

StringBuilder vbaCode = new StringBuilder(); 

    vbaCode.AppendLine("Sheets('Sheet1').Activate"); 
    vbaCode.AppendLine("Range('A1: D11').Select"); 
    vbaCode.AppendLine("Selection.Subtotal GroupBy:= 1, Function:= xlSum, TotalList:= Array(2, 3),Replace:= True, PageBreaks:= False, SummaryBelowData:= True"); 
pck.Save(); 

aber nicht arbeiten, ich kann nicht die Excel-Datei öffnen.

EDIT

Mit sugested jetzt ich versuche Interop mit der Gruppenfunktion, aber für einen extrain Grund er Spalten keine Zeilen Gruppierung, dann ist dies der Code:

var ExApp = new Microsoft.Office.Interop.Excel.Application(); 
Microsoft.Office.Interop.Excel.Workbooks Wbs = ExApp.Workbooks; 
Microsoft.Office.Interop.Excel.Workbook Wb = Wbs.Open(fi.FullName.ToString()); 
Microsoft.Office.Interop.Excel.Sheets wss = Wb.Worksheets; 
Microsoft.Office.Interop.Excel.Worksheet Ws = (Microsoft.Office.Interop.Excel.Worksheet)wss.get_Item("Sheet1"); 
Ws.Range["A6:A10"].Group(); 
Ws.Outline.SummaryRow =Microsoft.Office.Interop.Excel.XlSummaryRow.xlSummaryAbove; 
ExApp.Visible = true; 
+0

EPPlus nicht etwas tun können, die nicht mit Excel ist. Wenn Sie jedoch etwas mit Excel oder VBA machen können, können Sie dies mit EPPlus tun. Sie brauchen nicht VBA, um Zeilen zu gruppieren, Sie können einfach die gleiche Logik in C# schreiben - zB 'sheet.Cells [" A1: D11 "]' wird eine ExcelRange zurückgeben, auf der Sie 'Group' anrufen können –

+0

ja, wird gestellt dass alles, was Sie mit Excel tun können, mit EEPLUS tun, aber ich kann, wie dies zu tun ist, in Excel ist diese Option in der Registerkarte Daten, Zwischensummenoption. Wenn Sie wissen, wie Sie das mit EPPLUS machen, geben Sie bitte ein einfaches Beispiel dafür, wie das funktioniert. wenn ich ** sheet.Cells ["A1: D11"] ** sehe nicht die Gruppenoption, kann ich sehen, dass eine benannte Gruppe existieren, aber nicht verstehen, wie es funktioniert. – Ion

Antwort

2

ich das sehe, ist bereits beantwortet, aber ich dachte, einen EPPlus Weg bieten würde, die Sie sicherlich tun können, aber Sie müssen manuell die Summenzellen erstellen:

[TestMethod] 
public void Row_Grouping_Test() 
{ 
    //http://stackoverflow.com/questions/41636336/grouping-excel-rows-with-epplus 

    //Throw in some data 
    var datatable = new DataTable("tblData"); 
    datatable.Columns.AddRange(new[] 
    { 
     new DataColumn("Header", typeof (string)), new DataColumn("Col1", typeof (int)), new DataColumn("Col2", typeof (int)), new DataColumn("Col3", typeof (object)) 
    }); 

    for (var i = 0; i < 10; i++) 
    { 
     var row = datatable.NewRow(); 
     row[0] = $"Header {i}"; row[1] = i; row[2] = i * 10; row[3] = Path.GetRandomFileName(); datatable.Rows.Add(row); 
    } 

    //Create a test file 
    var fi = new FileInfo(@"c:\temp\Row_Grouping_Test.xlsx"); 
    if (fi.Exists) 
     fi.Delete(); 

    using (var pck = new ExcelPackage(fi)) 
    { 
     var worksheet = pck.Workbook.Worksheets.Add("Sheet1"); 
     worksheet.Cells.LoadFromDataTable(datatable, false); 

     worksheet.Cells["A11"].Value = "TOTAL"; 
     worksheet.Cells["B11"].Formula = "SUM(B2:B10)"; 
     worksheet.Cells["C11"].Formula = "SUM(C2:C10)"; 
     worksheet.Row(11).Style.Font.Bold = true; 

     //Row Group 1 (start with 1 since row index is 1-based) 
     for (var i = 1; i <= datatable.Rows.Count; i++) 
      worksheet.Row(i).OutlineLevel = 1; 

     pck.Save(); 
    } 
} 

Welche sieht wie folgt aus:

enter image description here

+0

Perfekt, ist genau das, was ich brauche – Ion

0

ich mit EPPLUS nicht vertraut bin Bibliothek.
aber Sie können diese Aufgabe sehr einfach mit Microsoft.Office.Interop.Excel Namespace erreichen.
und dann können Sie es tun, wie Sie es mit Vba-verwenden (mit der Merge() Methode) beachten Sie, dass Sie eine Referenz des Namespace zu Ihrem Projekt hinzufügen müssen.
hier ein Beispiel:

using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using Microsoft.Office.Interop.Excel; 

namespace WindowsFormsApplication32 
{ 
    public partial class Form1 : Form 
    { 
     public Microsoft.Office.Interop.Excel.Application ExApp; 


     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 

     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      ExApp = new Microsoft.Office.Interop.Excel.Application(); 
      // CREATE A NEW WORKBOOK (you can also open existing workbook using the Open() method) 
      Microsoft.Office.Interop.Excel.Workbook Wb = ExApp.Workbooks.Add(); 
      // SET WORKSHEET 
      Microsoft.Office.Interop.Excel.Worksheet Ws = Wb.Worksheets.Add(); 
      // MERGE CELLS (the answer to your question) 
      Ws.Range["A1:G5"].Merge(); 
      // GROUP ROWS (the final answer to your question) 
      Ws.Rows["4:7"].Group(); 
      ExApp.Visible = true; 
     } 
    } 
} 
+0

Danke für die Antwort, ich redigierte die Frage, was ich will, ist zu gruppieren, nicht fusionieren (das vorherige Bild ist nicht klar, sorry), wie Sie verdaut ich benutze Interop mit group() -Option, aber Excel merge Spalten, nicht Zeilen , Können Sie mir bitte helfen? – Ion

+1

Interop erfordert, dass Excel auf dem Server installiert wird. EPPlus generiert xlsx-Dateien direkt. –

+0

@lon sehe meine Bearbeitung auf die Antwort, wie Sie Reihen gruppieren ... // 'Ws.Rows [" 4: 7 "]. Gruppe();' – jonathana