2017-11-24 2 views
1

Ich versuche, den Inhalt meiner DataGridView In Excel zu exportieren, habe ich den Code, dies zu tun, was ich will, ist es eine zusätzliche Spalte hinzufügen mit ein Excel FormulaExportieren nach Excel von C# und Hinzufügen in einer anderen Spalte mit Excel-Formel

ich diesen Code habe bisher

private void button1_Click_1(object sender, EventArgs e) 
    { 
     Microsoft.Office.Interop.Excel._Application app = new Microsoft.Office.Interop.Excel.Application(); 
     Microsoft.Office.Interop.Excel._Workbook workbook = app.Workbooks.Add(Type.Missing); 
     Microsoft.Office.Interop.Excel._Worksheet worksheet = null; 
     app.Visible = true; 
     worksheet = workbook.Sheets["Sheet1"]; 
     worksheet = workbook.ActiveSheet; 
     worksheet.Name = "Testing this"; 
     for (int i = 1; i < dataGridView2.Columns.Count + 1; i++) 
     { 
      worksheet.Cells[1, i] = dataGridView2.Columns[i - 1].HeaderText; 
     } 
     for (int i = 0; i < dataGridView2.Rows.Count - 1; i++) 
     { 
      for (int j = 0; j < dataGridView2.Columns.Count; j++) 
      { 
       worksheet.Cells[i + 2, j + 1] = dataGridView2.Rows[i].Cells[j].Value.ToString(); 
      } 
     } 
     workbook.SaveAs("c:\\output.xlsx", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing); 
     app.Quit(); 
    } 

ich bin nicht sicher, wie über das Hinzufügen in der Formel Spalte zu gehen, jede mögliche Hilfe wäre sehr geschätzt.

Dank!

Antwort

1

Sie können einfach verwenden, um die .Formula Eigenschaft des Bereichs möchten Sie die Formel hinzufügen, aber wenn Sie andere Zellen verweisen (was wahrscheinlich ist), dann ist die .FormulaR1C1 ist wirklich schön, weil es Ihnen Zellen ihre relative verweisen können, basierend auf Position, anstatt zu versuchen, herauszufinden, was die Zeile/Spalte ist.

In Ihrem Beispiel oben würde dies eine Formel als letzte Spalte und nehmen den Wert der zweiten Spalte von links addieren und multiplizieren Sie ihn mit zwei:

int formulaCol = dataGridView2.Columns.Count + 1; 
for (int i = 0; i < dataGridView2.Rows.Count - 1; i++) 
{ 
    for (int j = 0; j < dataGridView2.Columns.Count; j++) 
    { 
     worksheet.Cells[i + 2, j + 1] = dataGridView2.Rows[i].Cells[j].Value.ToString(); 
    } 

    worksheet.Cells[i + 2, formulaCol].FormulaR1C1 = "=R[0]C[-2]*2"; 
} 

R[0] bedeutet die aktuelle Zeile. R1 wäre eine Zeile voraus, und R[-1] wäre eine Zeile zurück.

- EDIT 11/28/17 -

Per Ihrem Kommentar, das ist ein netter Trick, eine Standardformel zu Z1S1 ohne Gehirn-Macht zu konvertieren. Geben Sie Ihre Formel ein, so wie sie ist. Gehe zu Datei-> Optionen-> Formeln und überprüfe die Registerkarte "R1C1 Formeln". Es wird Ihre normale Formel in R1C1 konvertieren und die Verwendung in Ihrem Code erleichtern.

Was ist cool ist, wenn Sie die Formel kopieren/einfügen, werden Sie feststellen, dass es nicht wie der normale A1-Stil ändert.

in Ihrem Beispiel also, wenn ich deine Formel in J7 setzen, wäre es geworden:

= IF (ISNA (MATCH (R [-5] C [-9], C [-7], 0)), "", INDEX (C [-7], MATCH (R [-5] C [-9], C [-7], 0)))

Dies ist natürlich nicht richtig, Es hängt ganz davon ab, in welcher Zelle Sie Ihre Standardformel eingeben.

So geben Sie es wie Sie normalerweise, wechseln Sie zu R1C1, und verwenden Sie das für Ihren C# -Code.

enter image description here

+0

Das ist großartig danke! Ich kämpfe jetzt ein bisschen, um in meiner Formel hinzuzufügen, die Formel, die ich hinzufügen möchte, ist = IF (ISNA (MATCH (A2, C: C, 0)), "", INDEX (C: C, MATCH (A2 , C: C, 0))) - Ersetzen von 'A2' durch die aktuelle Position 'A' –

+0

@DavidWaldron - Ich habe meine Antwort etwas bearbeitet, um Ihnen bei diesem letzten Teil zu helfen. Probieren Sie es aus, und wenn Sie immer noch Probleme haben, laden Sie vielleicht eine Kopie der Arbeitsmappe auf Dropbox oder G-Laufwerk – Hambone

+0

Perfect genau das, was ich brauche! - viel einfacher, wenn Sie die RC-Konvertierungen automatisch durchführen können –

Verwandte Themen