none
Grafik in bestimmte Zelle in Excel einfügen und Zellengröße anpassen RRS feed

  • 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

    Freitag, 23. September 2011 13:12

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
    Samstag, 24. September 2011 12:32

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
    Samstag, 24. September 2011 12:32
  • Hallo Anja Länge,

    Hat Dir die Antwort geholfen?

    Grüße,
    Robert

    Mittwoch, 28. September 2011 10:57
    Moderator
  • Hallo Anja Länge,

    Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert

    Donnerstag, 29. September 2011 08:42
    Moderator
  • Hallo zusammen,

    gibt es da noch andere Möglichkeiten für das simulierte AutoFit? Diese Variante ist sehr zeitintensiv. Ich habe derzeit in einem Export 48 Grafiken und eine wachsende Zahl an Exporten.

    Grüße
    Anja

    Sonntag, 2. Oktober 2011 12:41