Как программно вставить изображение в ячейку таблицы и автоматически масштабировать, чтобы соответствовать - PullRequest
0 голосов
/ 01 марта 2019

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

Image not scaling

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();
            }
        }

1 Ответ

0 голосов
/ 01 марта 2019

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

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

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

axTable.AutoFitBehavior(WdAutoFitBehavior.wdAutoFitWindow);

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

...