Создание динамических таблиц в Word с помощью C # .NET - PullRequest
3 голосов
/ 12 ноября 2008

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

Ответы [ 5 ]

6 голосов
/ 27 мая 2012

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

Ссылка - 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();
                }                                              
            }

        }
3 голосов
/ 12 ноября 2008

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

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

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

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

Вы можете попробовать мой метод экспорта данных в 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); 
    }
   }

Спасибо.

0 голосов
/ 09 января 2009

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

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

0 голосов
/ 12 ноября 2008

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

Единственная проблема в том, что это не бесплатно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...