Creating Dynamic Tables in Word by C#.NET

前端 未结 6 1632
甜味超标
甜味超标 2020-12-11 09:24

I have a C# application where i want to implement a logic for a programm which will open the word document and go to a certain place in the page and create a Table and put v

相关标签:
6条回答
  • 2020-12-11 09:37

    You can try my method to export data to Word (*.docx) , it's easy to use and works 100% with any DataGridView , just add Microsoft.Office.Interop.Word reference and copy the following code :

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

    Thank you.

    0 讨论(0)
  • 2020-12-11 09:42

    Look up "Word Automation".

    For example, KB316384, which covers:

    The sample code in this article demonstrates how to do the following:

    • Insert paragraphs with text and formatting.
    • Browse and modify various ranges within a document.
    • Insert tables, format tables, and populate the tables with data.
    • Add a chart.
    0 讨论(0)
  • 2020-12-11 09:43

    Here is code to copy datagridview to a word table:

    Reference is Microsoft.Office.Interop.Word C:\Program Files (x86)\Microsoft Visual Studio 10.0\Visual Studio Tools for 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();
                    }                                              
                }
    
            }
    
    0 讨论(0)
  • 2020-12-11 09:46

    I have a code for insert table in to specific bookmark retreiving model in database, i hope helps community, i use mvc C#, microsoft office interop word for create a word file and add dynamic table from helper class

    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;
    
        }
    
    0 讨论(0)
  • 2020-12-11 09:50

    Word will quite happily open a file in HTML with the extension .Doc. You can have all the formatting you want by using an internal style sheet. A very similar question came up here:

    Export to Word Document in C#

    0 讨论(0)
  • 2020-12-11 09:51

    If you don't want to use Word Automation, e.g. you don't have Word installed on the computer running your program, you should have a look at Aspose.Words.

    The only problem is that it's not free.

    0 讨论(0)
提交回复
热议问题