ClosedXML Excel filtert Zeilen nach Werten in mehreren SpaltenC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 ClosedXML Excel filtert Zeilen nach Werten in mehreren Spalten

Post by Anonymous »

Ich habe eine Excel-Datei mit mehreren tausend Zeilen und Spalten bis zu „BP“.
Ich muss alle diese Zeilen nach bestimmten Werten in den Spalten C und BP filtern.

Ich habe die Filterfunktionalität in ClosedXML gemäß dem folgenden Code getestet.

Wenn ich einen Filter auf eine Spalte anwende, funktioniert alles gut und die Daten werden in der neuen Datei gespeichert.

Wenn ich es versuche Wenden Sie zwei Filter an, der zuletzt ausgeführte ist derjenige, der angewendet wird.

Ich habe versucht, das Arbeitsblatt als Bereich/Tabelle zu verwenden, dasselbe Filterproblem.

Ich habe schließlich den Ausdruck „rows“ erstellt, der funktioniert, aber die erste Zeile (Kopfzeile) wird herausgefiltert.

Code: Select all

public static void Filter(string source, string newFile)
{
using (var workbook = new XLWorkbook(source))
{
IXLWorksheet worksheet = workbook.Worksheet(1);

int salesFoundCell = worksheet.FirstRow().Cells().First(c => c.Value.ToString() == "Sales Order Description").Address.ColumnNumber;
int revenueFoundCell = worksheet.FirstRow().Cells().First(c => c.Value.ToString() == "Revenue recognition date").Address.ColumnNumber;

//worksheet.RangeUsed().SetAutoFilter().Column(salesFoundCell).EqualTo("Equipment Sale");
//worksheet.RangeUsed().SetAutoFilter().Column(revenueFoundCell).EqualTo("00.00.0000");

//var rows = worksheet.RowsUsed().Where(r => r.CellsUsed().Any(c => c.GetString().Contains("Equipment Sale")) &&
//                                          r.CellsUsed().Any(c => c.GetString().Contains("00.00.0000")));

Console.WriteLine(rows.Count());

//workbook.SaveAs(newFile);
}
}
Ich habe auch die im ClosedXML-Wiki veröffentlichte Methode ausprobiert, bei der Sie das Arbeitsblatt als MemoryStream speichern, den Filter erneut anwenden und es dann in einer neuen Datei speichern.

Dies ist die Kurzversion:

Code: Select all

public void Create(string filePath)
{
var wb = new XLWorkbook();
IXLWorksheet ws;

#region Multi Column
String multiColumn = "Multi Column";
ws = wb.Worksheets.Add(multiColumn);

// Add filters
ws.RangeUsed().SetAutoFilter().Column(2).EqualTo(3).Or.GreaterThan(4);
ws.RangeUsed().SetAutoFilter().Column(3).Between("B", "D");

// Sort the filtered list
ws.AutoFilter.Sort(3);
#endregion

using (var ms = new MemoryStream())
{
wb.SaveAs(ms);

var workbook = new XLWorkbook(ms);

#region Multi Column
workbook.Worksheet(multiColumn).AutoFilter.Column(3).EqualTo("E");
workbook.Worksheet(multiColumn).AutoFilter.Sort(3, XLSortOrder.Descending);
#endregion

workbook.SaveAs(filePath);
ms.Close();
}
}
Ich habe mehrere Iterationen der folgenden beiden Ausdrücke durchlaufen:

Code: Select all

worksheet.RangeUsed().SetAutoFilter().Column(salesFoundCell).EqualTo("Equipment Sale");
worksheet.RangeUsed().SetAutoFilter().Column(revenueFoundCell).EqualTo("00.00.0000");
Ich habe versucht, direkt nach den Spalten, als Bereich, als Tabelle zu filtern und dabei die Zeilen auszublenden, die nicht die erforderlichen Werte hatten.

Alle Filter basieren entweder auf einer Spalte oder überhaupt nicht.

Der „Ausdruck.AddFilter(ein Wert).AddFilter(ein anderer Wert);“ Hilft nicht, da ich nicht versuche, mehrere Filter in derselben Spalte hinzuzufügen.

Die „Und/Oder“-Funktionalität bewirkt dasselbe, mehrere Filter in derselben Spalte.

Hat es irgendjemandem geschafft, basierend auf Werten in mehreren Spalten zu filtern?

Jeder Rat wäre mir sehr willkommen.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post