Создание динамических таблиц в Word с помощью C# .NET

У меня есть приложение C#, в котором я хочу реализовать логику для программы, которая откроет документ Word, перейдет в определенное место на странице, создаст таблицу и поместит в нее значения. Может ли кто-нибудь сказать мне, как это реализовать. Я использую Visual Studio 2005

(оставьте свой комментарий) Мне неприятно говорить вам об этом, но Word не является управляемым приложением. Итак, чтобы использовать само приложение Word, вам придется использовать COM api ... Альтернативой является использование стороннего инструмента для написания файлов Word напрямую (проще с .docx, чем .doc).

Marc Gravell 12.11.2008 16:07
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
1
38 250
6

Ответы 6

Посмотрите "Word Automation".

Например, KB316384, который охватывает:

Пример кода в этой статье демонстрирует, как сделать следующее:

  • Вставляйте абзацы с текстом и форматированием.
  • Просматривайте и изменяйте различные диапазоны в документе.
  • Вставляйте таблицы, форматируйте таблицы и заполняйте таблицы данными.
  • Добавьте диаграмму.

Спасибо. Но я ищу решение, которое использует .NET Reference вместо COM-ссылки. Много искал, но не нашел. Может ли кто-нибудь?

Tim Sullivan 12.11.2008 15:34

Если вы не хотите использовать Word Automation, например у вас не установлен Word на компьютере, на котором запущена ваша программа, вам следует взглянуть на Aspose.Words.

Проблема только в том, что это не бесплатно.

Word с радостью откроет файл в формате HTML с расширением .Doc. Вы можете получить любое желаемое форматирование, используя внутреннюю таблицу стилей. Здесь возник очень похожий вопрос:

Экспорт в документ Word на C#

Вот код для копирования datagridview в таблицу слов:

Ссылка - Microsoft.Office.Interop.Word. C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ Инструменты Visual Studio для Office \ PIA \ Office12 \ Microsoft.Office.Interop.Word.dll

using word = Microsoft.Office.Interop.Word;    
public static void ExportToWord(DataGridView dgv)
                {
                    SendMessage("Opening Word");

                    word.ApplicationClass word = null;



      word.Document doc = null;
            object oMissing = System.Reflection.Missing.Value;
            object oEndOfDoc = "\\endofdoc"; /* \endofdoc is a predefined bookmark */ 
            try
            {
                word = new word.ApplicationClass();
                word.Visible = true;
                doc = word.Documents.Add(ref oMissing, ref oMissing,ref oMissing, ref oMissing);
            }
            catch (Exception ex)
            {
                ErrorLog(ex);
            }
            finally
            {
            }
            if (word != null && doc != null)
            {
                word.Table newTable;
                word.Range wrdRng = doc.Bookmarks.get_Item(ref oEndOfDoc).Range;
                newTable = doc.Tables.Add(wrdRng, 1, dgv.Columns.Count-1, ref oMissing, ref oMissing);
                newTable.Borders.InsideLineStyle = Microsoft.Office.Interop.Word.WdLineStyle.wdLineStyleSingle;
                newTable.Borders.OutsideLineStyle = Microsoft.Office.Interop.Word.WdLineStyle.wdLineStyleSingle;
                newTable.AllowAutoFit = true;

                foreach (DataGridViewCell cell in dgv.Rows[0].Cells)
                {
                    newTable.Cell(newTable.Rows.Count, cell.ColumnIndex).Range.Text = dgv.Columns[cell.ColumnIndex].Name;

                }
                newTable.Rows.Add();

                foreach (DataGridViewRow row in dgv.Rows)
                {
                    foreach (DataGridViewCell cell in row.Cells)
                    {
                        newTable.Cell(newTable.Rows.Count, cell.ColumnIndex).Range.Text = cell.Value.ToString();                      
                    }
                    newTable.Rows.Add();
                }                                              
            }

        }

Вы можете попробовать мой метод экспорта данных в Word (* .docx), он прост в использовании и работает на 100% с любым DataGridView, просто добавьте ссылку Microsoft.Office.Interop.Word и скопируйте следующий код:

    using Word = Microsoft.Office.Interop.Word;

   public void Export_Data_To_Word(DataGridView DGV, string filename)
   {
    if (DGV.Rows.Count != 0)
    {
        int RowCount = DGV.Rows.Count;
        int ColumnCount = DGV.Columns.Count;
        Object[,] DataArray = new object[RowCount + 1, ColumnCount + 1];

        //add rows
        int r = 0;
        for (int c = 0; c <= ColumnCount - 1; c++)
        {
            for (r = 0; r <= RowCount - 1; r++)
            {
                DataArray[r, c] = DGV.Rows[r].Cells[c].Value;
            } //end row loop
        } //end column loop

        Word.Document oDoc = new Word.Document();
        oDoc.Application.Visible = true;

        //page orintation
        oDoc.PageSetup.Orientation = Word.WdOrientation.wdOrientLandscape;


        dynamic oRange = oDoc.Content.Application.Selection.Range;
        string oTemp = "";
        for (r = 0; r <= RowCount - 1; r++)
        {
            for (int c = 0; c <= ColumnCount - 1; c++)
            {
                oTemp = oTemp + DataArray[r, c] + "\t";

            }
        }

        //table format
        oRange.Text = oTemp;

        object Separator = Word.WdTableFieldSeparator.wdSeparateByTabs;
        object ApplyBorders = true;
        object AutoFit = true;
        object AutoFitBehavior = Word.WdAutoFitBehavior.wdAutoFitContent;

        oRange.ConvertToTable(ref Separator, ref RowCount, ref ColumnCount,
                              Type.Missing, Type.Missing, ref ApplyBorders,
                              Type.Missing, Type.Missing, Type.Missing,
                              Type.Missing, Type.Missing, Type.Missing,
                              Type.Missing, ref AutoFit, ref AutoFitBehavior, Type.Missing);

        oRange.Select();

        oDoc.Application.Selection.Tables[1].Select();
        oDoc.Application.Selection.Tables[1].Rows.AllowBreakAcrossPages = 0;
        oDoc.Application.Selection.Tables[1].Rows.Alignment = 0;
        oDoc.Application.Selection.Tables[1].Rows[1].Select();
        oDoc.Application.Selection.InsertRowsAbove(1);
        oDoc.Application.Selection.Tables[1].Rows[1].Select();

        //header row style
        oDoc.Application.Selection.Tables[1].Rows[1].Range.Bold = 1;
        oDoc.Application.Selection.Tables[1].Rows[1].Range.Font.Name = "Tahoma";
        oDoc.Application.Selection.Tables[1].Rows[1].Range.Font.Size = 14;

        //add header row manually
        for (int c = 0; c <= ColumnCount - 1; c++)
        {
            oDoc.Application.Selection.Tables[1].Cell(1, c + 1).Range.Text = DGV.Columns[c].HeaderText;
        }

        //table style 
        oDoc.Application.Selection.Tables[1].set_Style("Grid Table 4 - Accent 5");
        oDoc.Application.Selection.Tables[1].Rows[1].Select();
        oDoc.Application.Selection.Cells.VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter;

        //header text
        foreach (Word.Section section in oDoc.Application.ActiveDocument.Sections)
        {
            Word.Range headerRange = section.Headers[Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Range;
            headerRange.Fields.Add(headerRange, Word.WdFieldType.wdFieldPage);
            headerRange.Text = "your header text";
            headerRange.Font.Size = 16;
            headerRange.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter;
        }

      //save the file
        oDoc.SaveAs2(filename);

         //NASSIM LOUCHANI
    }  
   }




  private void button_Click(object sender, EventArgs e)
   {
    SaveFileDialog sfd = new SaveFileDialog();

    sfd.Filter = "Word Documents (*.docx)|*.docx";

    sfd.FileName = "export.docx";

    if (sfd.ShowDialog() == DialogResult.OK)
    {

        Export_Data_To_Word(dataGridView1, sfd.FileName); 
    }
   }

Спасибо.

У меня есть код для вставки таблицы в конкретную модель извлечения закладок в базе данных, я надеюсь, что это поможет сообществу, я использую mvc C#, слово взаимодействия Microsoft Office для создания файла Word и добавления динамической таблицы из вспомогательного класса

public void tableFromDatabase(Document doc, Application word, string risk, string bookmarkName, TableTemplate table) {
        Table newTable;//Create a new table
        Range wrdRng = doc.Bookmarks.get_Item(bookmarkName).Range;//Get a bookmark Range
        doc.Bookmarks[bookmarkName].Select();
        newTable = word.Selection.Tables.Add(wrdRng,1,1);//Add new table to selected bookmark by default set 1 row, 1 column (need set interval 1-63)
        newTable.Borders.InsideLineStyle = WdLineStyle.wdLineStyleSingle;
        newTable.Borders.OutsideLineStyle = WdLineStyle.wdLineStyleSingle;
        int a=0, b=0;//Set integer values for iterate in model arrays
        //Iterate model rows
        for (int i = 1; i <= table.Rows.Count; i++)//Set in 1 the value because in word tables the begin is (1,1)
        {
            //Only add rows if is after first row
            if (i > 1)
            {
                newTable.Rows.Add();
            }
            //Iterate model columns from rows
            for (int j = 1; j <= table.Rows[a].Columns.Count; j++)
            {
                //Only Add rows if is after first
                if (j == 1 && i == 1)
                {
                    newTable.Cell(i, j).Range.Font.Name = table.Rows[a].Columns[b].cellFontName;
                    newTable.Cell(i, j).Range.Font.Size = table.Rows[a].Columns[b].cellFontSize;
                    newTable.Cell(i, j).Width = float.Parse(table.Rows[a].Columns[b].cellWidth);
                }
                else
                {
                    //Add Cells to rows only if columns of the model is largen than table, this is for not exceed the interval
                    if (newTable.Rows[i].Cells.Count < table.Rows[a].Columns.Count)
                    {
                        newTable.Rows[i].Cells.Add();
                    }
                    //Set the values to new table
                    //The width must be float type
                    newTable.Cell(i, j).Range.Font.Name = table.Rows[a].Columns[b].cellFontName;
                    newTable.Cell(i, j).Range.Font.Size = table.Rows[a].Columns[b].cellFontSize;
                    newTable.Cell(i, j).Width = float.Parse(table.Rows[a].Columns[b].cellWidth);
                }
                b++;
                //Set 0 to reset cycle
                if (b == table.Rows[a].Columns.Count)
                {
                    b = 0;
                }
            }
            a++;
            //Set 0 to reset cycle
            if (a == table.Rows.Count)
            {
                a = 0;
            }
        }
        newTable.Borders.InsideLineStyle = Microsoft.Office.Interop.Word.WdLineStyle.wdLineStyleSingle;
        newTable.Borders.OutsideLineStyle = Microsoft.Office.Interop.Word.WdLineStyle.wdLineStyleSingle;
        newTable.AllowAutoFit = true;
        //Set gray color to borders
        newTable.Borders.InsideColor = (Microsoft.Office.Interop.Word.WdColor)12964311;
        newTable.Borders.OutsideColor = (Microsoft.Office.Interop.Word.WdColor)12964311;

    }

Другие вопросы по теме