Benutzer mit den meisten Antworten
Grafik in bestimmte Zelle in Excel einfügen und Zellengröße anpassen

Frage
-
Hallo,
Ich möchte eine Liste mit Objekten in eine neu erstellte Arbeitsmappe in Excel einfügen.
Das funktioneirt über die Interops bis zu der Stelle, wo es an die in den Objekten enthaltenen Grafiken geht. Es geht um Grafiken mit 100 * 100 Pixeln, die in entsprechend vorgegebene zellen eingefügt werden sollen; beim anschließenden Range.Columns.AutoFit() bzw. Range.Rows.AutoFit() sollen die Abmessungen der Grafiken berücksichtigt werden.Geht das? Wie bekomme ich Grafiken "in" bestimmte Zellen hinein anstatt einfach nur an eine Position?
Grüße
Anja
Antworten
-
Hallo Anja,
also AutoFit unterstützt keine Shape-Breiten Autoanpassung.
Insofern kann man da AFAIK höchstens eine manuelle Nach-Justierung durchführen.
Das wäre etwas wie folgendes:using System; using System.Reflection; using System.Windows.Forms; using Excel = Microsoft.Office.Interop.Excel; using Microsoft.Office.Core; namespace WinExcelGrafik { public partial class Form1 : Form { Excel.Application oXL; Excel._Workbook oWB; Excel._Worksheet oSheet; Excel.Range oRng; public Form1() { InitializeComponent(); } private void button1_Click(object sender, System.EventArgs e) { try { oXL = new Excel.Application(); oXL.ScreenUpdating = false; oWB = (Excel._Workbook)(oXL.Workbooks.Add(Missing.Value)); oSheet = (Excel._Worksheet)oWB.ActiveSheet; oSheet.Cells[1, 1] = "Vorname"; oSheet.Cells[1, 2] = "Nachname"; oSheet.Cells[1, 3] = "Kompletter Name"; oSheet.Cells[1, 4] = "Einkommen"; oSheet.get_Range("A1", "D1").Font.Bold = true; oSheet.get_Range("A1", "D1").VerticalAlignment = Excel.XlVAlign.xlVAlignCenter; string[,] saNames = NamenEinsetzen("Aron", "Hunt", "Berta", "Buntmann", "Cäsar", "Carlmann", "Dora", "Dzaebel", "Emil", "Erdmann"); oSheet.get_Range("A2", "B6").Value2 = saNames; oRng = oSheet.get_Range("C2", "C6"); oRng.Formula = "=A2 & \" \" & B2"; oRng = oSheet.get_Range("D2", "D6"); oRng.Formula = "=RAND()*100000"; oRng.NumberFormat = "0.00 $"; oRng = oSheet.get_Range("A1", "D1"); GrafikenZufügen(oSheet); oRng.EntireColumn.AutoFit(); AutoFitMitShape(oRng.EntireColumn); oXL.Visible = true; oXL.UserControl = true; } catch (Exception exp) { if (oXL != null) oXL.Visible = true; string fehlerHinweis = "Fehler: " + exp.Message + "\r\n\r\n" + exp.StackTrace.ToString(); MessageBox.Show(fehlerHinweis, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1, MessageBoxOptions.ServiceNotification); ; } finally { if (oXL != null) oXL.ScreenUpdating = true; } } private void AutoFitMitShape(Excel.Range range) { range.AutoFit(); foreach (Excel.Range spalte in range.Columns) { for (int i = 0; i < range.Worksheet.Shapes.Count; i++) { var shape = range.Worksheet.Shapes.Item(i + 1); if (shape.TopLeftCell.Column == spalte.Column) if (shape.Width > spalte.ColumnWidth) SetzeSpaltenBreite(spalte.Column, shape.Width); } } } void SetzeSpaltenBreite(int colNr, float breite) { if (colNr < 1 || colNr > 255) return; var spalte1 = oXL.Columns[colNr + 1]; var spalte0 = oXL.Columns[colNr + 0]; while (spalte1.Left - spalte0.Left - 0.1 > breite) spalte0.ColumnWidth = spalte0.ColumnWidth - 0.1; while (spalte1.Left - spalte0.Left + 0.1 < breite) spalte0.ColumnWidth = spalte0.ColumnWidth + 0.1; } private void GrafikenZufügen(Excel._Worksheet oSheet) { Excel.Shape shape = oSheet.Shapes.AddShape( MsoAutoShapeType.msoShapeDiamond, 0, 0, 100, 100); shape.Placement = Excel.XlPlacement.xlMove; shape.Select(); oXL.Selection.Copy(); oSheet.Range["B7"].Select(); oSheet.Paste(); shape.Delete(); shape = oSheet.Shapes.Item(oSheet.Shapes.Count); oXL.ScreenUpdating = true; } private string[,] NamenEinsetzen(params string[] namen) { int i = 0, j = 0; string[,] saNames = new string[namen.Length / 2, 2]; foreach (var name in namen) { saNames[i, j++] = name; if (j == 2) { j = 0; i++; } } return saNames; } } }
ciao Frank- Als Antwort vorgeschlagen Robert BreitenhoferModerator Mittwoch, 28. September 2011 10:57
- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 29. September 2011 08:42
Alle Antworten
-
Hallo Anja,
also AutoFit unterstützt keine Shape-Breiten Autoanpassung.
Insofern kann man da AFAIK höchstens eine manuelle Nach-Justierung durchführen.
Das wäre etwas wie folgendes:using System; using System.Reflection; using System.Windows.Forms; using Excel = Microsoft.Office.Interop.Excel; using Microsoft.Office.Core; namespace WinExcelGrafik { public partial class Form1 : Form { Excel.Application oXL; Excel._Workbook oWB; Excel._Worksheet oSheet; Excel.Range oRng; public Form1() { InitializeComponent(); } private void button1_Click(object sender, System.EventArgs e) { try { oXL = new Excel.Application(); oXL.ScreenUpdating = false; oWB = (Excel._Workbook)(oXL.Workbooks.Add(Missing.Value)); oSheet = (Excel._Worksheet)oWB.ActiveSheet; oSheet.Cells[1, 1] = "Vorname"; oSheet.Cells[1, 2] = "Nachname"; oSheet.Cells[1, 3] = "Kompletter Name"; oSheet.Cells[1, 4] = "Einkommen"; oSheet.get_Range("A1", "D1").Font.Bold = true; oSheet.get_Range("A1", "D1").VerticalAlignment = Excel.XlVAlign.xlVAlignCenter; string[,] saNames = NamenEinsetzen("Aron", "Hunt", "Berta", "Buntmann", "Cäsar", "Carlmann", "Dora", "Dzaebel", "Emil", "Erdmann"); oSheet.get_Range("A2", "B6").Value2 = saNames; oRng = oSheet.get_Range("C2", "C6"); oRng.Formula = "=A2 & \" \" & B2"; oRng = oSheet.get_Range("D2", "D6"); oRng.Formula = "=RAND()*100000"; oRng.NumberFormat = "0.00 $"; oRng = oSheet.get_Range("A1", "D1"); GrafikenZufügen(oSheet); oRng.EntireColumn.AutoFit(); AutoFitMitShape(oRng.EntireColumn); oXL.Visible = true; oXL.UserControl = true; } catch (Exception exp) { if (oXL != null) oXL.Visible = true; string fehlerHinweis = "Fehler: " + exp.Message + "\r\n\r\n" + exp.StackTrace.ToString(); MessageBox.Show(fehlerHinweis, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1, MessageBoxOptions.ServiceNotification); ; } finally { if (oXL != null) oXL.ScreenUpdating = true; } } private void AutoFitMitShape(Excel.Range range) { range.AutoFit(); foreach (Excel.Range spalte in range.Columns) { for (int i = 0; i < range.Worksheet.Shapes.Count; i++) { var shape = range.Worksheet.Shapes.Item(i + 1); if (shape.TopLeftCell.Column == spalte.Column) if (shape.Width > spalte.ColumnWidth) SetzeSpaltenBreite(spalte.Column, shape.Width); } } } void SetzeSpaltenBreite(int colNr, float breite) { if (colNr < 1 || colNr > 255) return; var spalte1 = oXL.Columns[colNr + 1]; var spalte0 = oXL.Columns[colNr + 0]; while (spalte1.Left - spalte0.Left - 0.1 > breite) spalte0.ColumnWidth = spalte0.ColumnWidth - 0.1; while (spalte1.Left - spalte0.Left + 0.1 < breite) spalte0.ColumnWidth = spalte0.ColumnWidth + 0.1; } private void GrafikenZufügen(Excel._Worksheet oSheet) { Excel.Shape shape = oSheet.Shapes.AddShape( MsoAutoShapeType.msoShapeDiamond, 0, 0, 100, 100); shape.Placement = Excel.XlPlacement.xlMove; shape.Select(); oXL.Selection.Copy(); oSheet.Range["B7"].Select(); oSheet.Paste(); shape.Delete(); shape = oSheet.Shapes.Item(oSheet.Shapes.Count); oXL.ScreenUpdating = true; } private string[,] NamenEinsetzen(params string[] namen) { int i = 0, j = 0; string[,] saNames = new string[namen.Length / 2, 2]; foreach (var name in namen) { saNames[i, j++] = name; if (j == 2) { j = 0; i++; } } return saNames; } } }
ciao Frank- Als Antwort vorgeschlagen Robert BreitenhoferModerator Mittwoch, 28. September 2011 10:57
- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 29. September 2011 08:42