2017-11-26 4 views
0

ich den gleichen Ansatz setzen verwenden möchten, wie oben auf Interop verwendet, sondern müssen in EPPLUSInterop zu Epplus Konvertierungen Problem. Reichweite nicht in der Lage das gleiche Szenario für Epplus

ExcelRange r; 
string s = string.empty; 

//returns range address (A10:L90) 
s = (SValues(ws)) 

//assigns range from row like in : ws.Range[s][1, 1].Row [ws.range["A10:L90][1,1].row // returns count for further use 
r = ws.Range[ws.Cells[ws.Range[s][1, 1].Row, 1], ws.Cells[ws.Range[s][1, 1].Row + ws.Range[s].Rows.Count - 1, ws.Range[s][1, 1].Column + ws.Range[s].Columns.Count - 1]]; 


//setting certain cells to NumberFormat 
ws.Range[ws.Cells[r[1, 1].Row, 3], ws.Cells[r[1, 1].Row + r.Rows.Count - 1, r[1, 1].Column + r.Columns.Count - 1]].NumberFormat = "0.00"; 

//for the range in r sort data based on index [] 
r.Sort(Key1: r[1, 3], Order1: Excel.XlSortOrder.xlDescending, Key2: r[1, r.Columns.Count], Order2: Excel.XlSortOrder.xlDescending, Key3: r[1, 2], Order3: Excel.XlSortOrder.xlDescending, Header: Excel.XlYesNoGuess.xlNo, OrderCustom: 1, MatchCase: false, Orientation: Excel.XlSortOrientation.xlSortRows, DataOption1: Excel.XlSortDataOption.xlSortNormal, DataOption2: Excel.XlSortDataOption.xlSortNormal, DataOption3: Excel.XlSortDataOption.xlSortNormal 

Ich bin mir bewusst, dass EPPLUS verwendet Listen anstelle von Arrays verwendet in auszuführen Interop daher muss ich eine Alternative finden, um diesen Prozess durchzuführen. Ich entwickle eine Anwendung, die auf vorhandenen Excel-Tabellen arbeitet und sie sortiert, mit Reihen und Spalten manipuliert, Blätter prüft, sie überprüft usw.

2. Frage: Müssen diesen Interop-Code zu Epplus ws.Range [ws wiederholen. Zellen [1, 1], ws.Cells [1, 1]]. Ende [Excel.XlDirection.xlUp] .End [Excel.XlDirection.xlUp] .Offset [-1];

+0

Was versuchen Sie hier zu erreichen? Was sollte dieser Code tun? –

+0

Entschuldigung, immer noch nicht klar. können Sie bitte Ihre Frage anstelle von Kommentaren aktualisieren? und was ist s? Was ist r? –

+0

@YahyaHussein haben meine Frage – Ives

Antwort

1

Scheint so, als würden Sie nur Bereiche einstellen. Bei Epplus wird das Objekt Cells doppelt beansprucht, da es sich um eine Range handelt. Ich bin rostig mit Interop verwenden, aber ich denke, das sollte man nahe kommen, was Sie suchen (können die - 1 ‚s neu einstellen müssen, wenn ich die 0-basierte bekam vs 1-basierte Indizes falsch):

//assigns range from row like in : ws.Range[s][1, 1].Row [ws.range["A10:L90][1,1].row // returns count for further use 
/* 
r = ws.Range 
[ 
    ws.Cells[ws.Range[s][1, 1].Row, 1] 
    , ws.Cells[ 
     ws.Range[s][1, 1].Row + ws.Range[s].Rows.Count - 1 
     , ws.Range[s][1, 1].Column + ws.Range[s].Columns.Count - 1 
     ] 
]; 
*/ 

//*****Rough translation with s as any proper Excel string range 
var srange = ws.Cells[s]; 
var startcell = srange.Start; 
var endcell = srange[srange.End.Row - 1, srange.End.Column - 1].Start; // or if you just want the end you can do = srange.End 

//Reset the indexer 
srange = ws.Cells[s]; 
r = srange[startcell.Row, startcell.Column, endcell.Row, endcell.Column]; 

//*****From there you can just set formatting as you like 

//setting certain cells to NumberFormat 
//ws.Range[ws.Cells[r[1, 1].Row, 3], ws.Cells[r[1, 1].Row + r.Rows.Count - 1, r[1, 1].Column + r.Columns.Count - 1]].NumberFormat = "0.00"; 
r[1, 3, r.End.Row - 1, r.End.Column - 1].Style.Numberformat.Format = "0.00"; 

//for the range in r sort data based on index [] 
//r.Sort(Key1: r[1, 3], Order1: Excel.XlSortOrder.xlDescending, Key2: r[1, r.Columns.Count], Order2: Excel.XlSortOrder.xlDescending, Key3: r[1, 2], Order3: Excel.XlSortOrder.xlDescending, Header: Excel.XlYesNoGuess.xlNo, OrderCustom: 1, MatchCase: false, Orientation: Excel.XlSortOrientation.xlSortRows, DataOption1: Excel.XlSortDataOption.xlSortNormal, DataOption2: Excel.XlSortDataOption.xlSortNormal, DataOption3: Excel.XlSortDataOption.xlSortNormal 
r.Sort(new[] {3, r.Columns - 1}, new[] {true, true}); 

Reaktion auf die Kommentare

Hier ist ein Full-Unit-Test:

[TestMethod] 
public void RangeConversionTest() 
{ 
    var fileInfo = new FileInfo("c:\\temp\\RangeConversionTest.xlsx"); 
    if (fileInfo.Exists) 
     fileInfo.Delete(); 

    using (var pck = new ExcelPackage(fileInfo)) 
    { 
     //Some random data 
     var wb = pck.Workbook; 
     var ws = wb.Worksheets.Add("Sheet1"); 

     var random = new Random(); 

     const int rows = 20; 
     const int cols = 15; 
     for (var row = 0; row < rows; row++) 
     { 
      for (var c = 0; c < cols; c++) 
      { 
       if (row == 0 && c == 0) 
        ws.Cells[row + 1, c + 1].Value = null; 

       else if (row == 0) 
        ws.Cells[row + 1, c + 1].Value = $"Column {c}"; 

       else if (c == 0) 
        ws.Cells[row + 1, c + 1].Value = $"Row {row}"; 
       else 
        ws.Cells[row + 1, c + 1].Value = random.Next(5); 
      } 
     } 

     ExcelRange r; 
     string s = "B2:N20"; 

     var srange = ws.Cells[s]; 
     var startcell = srange.Start; 
     var endcell = srange[srange.End.Row - 1, srange.End.Column - 1].Start; 

     srange = ws.Cells[s]; 
     r = srange[startcell.Row, startcell.Column, endcell.Row, endcell.Column]; 
     r.Sort(new[] {3, r.Columns - 1}, new[] {true, true}); 
     r[1, 3, r.End.Row, r.End.Column].Style.Numberformat.Format = "0.00"; 

     pck.Save(); 
    } 

enter image description here

+0

hanks Ich habe es versucht, aber in Zeile 3: var endcell .. es würde den srange auf die Adresse zurücksetzen, die auf endcell eingestellt ist, und daher die tatsächliche set-Adresse von srange nicht mehr verwenden, warum wird es entfernt? und r.sort nicht auf VS 2015 erkannt wird nur auf epplus beta? . Danke Ernie – Ives

+0

@Ives Ja, sorry, vergaß den Epplus gerne den Indexer wenn Sie darauf zugreifen. Sehen Sie meine Bearbeitung oben, müssen Sie nur den Bereich neu erstellen. Welche Version verwendest du genau? Ich benutze 4.10 und Sortierung ist da - VS-Version sollte keine Rolle spielen. – Ernie

+0

hi, also habe ich versucht, auf 4.1.0 herunterzustufen, aber es konnte nicht gefunden werden. Hinweis r ist als ExcelRangeBase im Debug definiert. Können Sie bitte bestätigen, dass es funktioniert, da diese FAQ das Gegenteil sagt: https://epplus.codeplex.com/workitem/14791 – Ives