Как программно вставить изображение в ячейку таблицы и автоматически масштабировать его по размеру

Я автоматически вставляю изображение в ячейку таблицы документа ms word. Однако .. Мне нужно автоматически масштабировать изображение (без потери dpi), чтобы оно соответствовало ячейке таблицы. Есть 2 ячейки таблицы, и обе они должны занимать 50% ширины, выделенной для таблицы. Итак ... как вы можете видеть ... изображение не масштабировано под размер ячейки таблицы. И ширина ячеек не равна. Обычно изображения должны быть размещены в 2 столбца с пустой строкой после каждой строки изображения. Для каждого 6-го изображения вставляется новая страница с новой таблицей. Я публикую изображение и код

Изображение не масштабируется

public void InsertTable()
        {
            List<string> pics = AmendPictures();

            Microsoft.Office.Interop.Word._Document WordDoc = null;         
            Microsoft.Office.Interop.Word._Application axWord = null;
            Microsoft.Office.Interop.Word.Table axTable = null;
            try
            {              
                axWord = new Microsoft.Office.Interop.Word.Application();
                axWord.Visible = true;

                object oMissing = System.Reflection.Missing.Value;
                WordDoc = axWord.Documents.Add(ref oMissing, ref oMissing, ref oMissing, ref oMissing);

                // This is For Header columns 
                object missing = System.Reflection.Missing.Value;

                int totalRows = (pics.Count % 2 == 0) ? pics.Count : (pics.Count + 1);
                int rowsPerTable = 6;
                int numberOfPages = Convert.ToInt32(Math.Round(Convert.ToDouble(totalRows/6)));

                int pageBreakCounter = 1;
                int y = 1;
                for (int x = 0; x < pics.Count; x += 2)
                {

                    if (((x % rowsPerTable) == 0) || (x ==0))
                    {
                        axWord.Selection.GoTo(WdGoToItem.wdGoToLine, WdGoToDirection.wdGoToLast, oMissing, oMissing);
                        axTable = WordDoc.Tables.Add(axWord.Selection.Range, rowsPerTable, 2);
                        axTable.PreferredWidthType = WdPreferredWidthType.wdPreferredWidthPercent;
                        axTable.PreferredWidth = 100;
                        axTable.AutoFitBehavior(WdAutoFitBehavior.wdAutoFitWindow);
                        axTable.Range.Rows.Alignment = WdRowAlignment.wdAlignRowCenter;
                        axTable.Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;
                        axTable.Range.ParagraphFormat.SpaceAfter = 0;
                        axTable.Range.ParagraphFormat.SpaceBefore = 0;
                        // Show Borders

                        axTable.Range.Columns.Borders.Enable = 1;

                        axTable.Columns[1].PreferredWidthType = WdPreferredWidthType.wdPreferredWidthPercent;
                        axTable.Columns[1].SetWidth(50, WdRulerStyle.wdAdjustNone);

                        axTable.Columns[2].PreferredWidthType = WdPreferredWidthType.wdPreferredWidthPercent;
                        axTable.Columns[2].SetWidth(50, WdRulerStyle.wdAdjustNone);
                    }

                    InlineShape inline_shape = null;
                    InlineShape inline_shape2 = null;

                    Range rngPic1 = axTable.Cell((x+1) % 6, 1).Range;
                    rngPic1.Cells.VerticalAlignment = WdCellVerticalAlignment.wdCellAlignVerticalCenter;
                    inline_shape = rngPic1.InlineShapes.AddPicture(pics.ElementAt(x).ToString(), ref missing, ref missing, ref missing);
                    if (inline_shape != null)
                    {
                        Shape shape = inline_shape.ConvertToShape();
                        shape.WrapFormat.Type = WdWrapType.wdWrapInline;
                    }

                    if ((x + 1) < pics.Count)
                    {
                        Range rngPic2 = axTable.Cell((x + 1) % 6, 2).Range;
                        rngPic2.Cells.VerticalAlignment = WdCellVerticalAlignment.wdCellAlignVerticalCenter;
                        inline_shape2 = rngPic2.InlineShapes.AddPicture(pics.ElementAt(x+1).ToString(), ref missing, ref missing, ref missing);
                        if (inline_shape2 != null)
                        {
                            Shape shape = inline_shape2.ConvertToShape();
                            shape.WrapFormat.Type = WdWrapType.wdWrapInline;
                        }
                    }

                    pageBreakCounter++;

                    y = y + 2;
                    if ((x % rowsPerTable) == 0)
                    {
                        axWord.Selection.GoTo(WdGoToItem.wdGoToLine, WdGoToDirection.wdGoToLast, oMissing, oMissing);
                        axWord.Selection.InsertNewPage();
                        y = 0;
                    }
                }
                WordDoc.Content.Font.Size = 12;
                WordDoc.Content.Font.Name = "Calibri";

                Microsoft.Office.Interop.Word.Dialog dialog = axWord.Dialogs[Microsoft.Office.Interop.Word.WdWordDialog.wdDialogFileSaveAs];
                dialog.Show(ref oMissing);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message + "     " + ex.InnerException);
            }
            finally
            {
                if (axTable != null)
                {
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(axTable);
                    // Release all Interop objects.
                }

                if (WordDoc != null)
                {
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(WordDoc);
                }

                if (axWord != null)
                {
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(axWord);
                }

                WordDoc = null;
                axWord = null;
                GC.Collect();
            }
        }

person Eminem    schedule 01.03.2019    source источник


Ответы (1)


Если установить для высоты строки или ширины столбца точное значение, изображение должно масштабироваться до этого размера.

При этом также убедитесь, что поведение автоподгонки таблицы не допускает расширения ячеек. Это означает, что при добавлении таблицы установите DefaultTableBehavior в wdWord8TableBehavior. И AutoFitBehavior должно быть wdAutoFitFixed.

Если таблица уже существует, последнюю также можно настроить отдельно. В коде вопроса я вижу, что это неверно:

axTable.AutoFitBehavior(WdAutoFitBehavior.wdAutoFitWindow);

Вам также необходимо проверить, поддерживает ли использование процентов в качестве PreferredWidthType точные настройки. Возможно, потребуется изменить это на использование баллов.

person Cindy Meister    schedule 01.03.2019