【问题标题】:Creating Dynamic Tables in Word by C#.NET通过 C#.NET 在 Word 中创建动态表格
【发布时间】:2010-09-21 23:06:15
【问题描述】:

我有一个 C# 应用程序,我想在其中实现一个程序的逻辑,该程序将打开 word 文档并转到页面中的某个位置并创建一个表并将值放入其中。谁能告诉我如何实现这一点。我正在使用 Visual Studio 2005

【问题讨论】:

  • (您对我的评论)我不想告诉您这一点,但 Word 不是托管应用程序。因此,要使用 Word 应用程序本身,您将不得不使用 COM api...另一种方法是使用 3rd-party 工具直接编写 word 文件(使用 .docx 比使用 .doc 更容易)。

标签: c# dynamic ms-word


【解决方案1】:

以下是将datagridview复制到单词表的代码:

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

        }

【讨论】:

    【解决方案2】:

    查找“文字自动化”。

    例如,KB316384,其中包括:

    本文中的示例代码演示了如何执行以下操作:

    • 插入带有文本和格式的段落。
    • 浏览和修改文档中的各种范围。
    • 插入表格、格式化表格并用数据填充表格。
    • 添加图表。

    【讨论】:

    • 谢谢。但我正在寻找一种使用 .NET 参考而不是 COM 参考的解决方案。搜索了很多。但找不到。任何人都可以吗?
    【解决方案3】:

    如果您不想使用 Word Automation,例如你没有在运行你的程序的计算机上安装 Word,你应该看看Aspose.Words

    唯一的问题是它不是免费的。

    【讨论】:

      【解决方案4】:

      Word 将非常乐意打开扩展名为 .Doc 的 HTML 文件。您可以使用内部样式表来获得所需的所有格式。这里出现了一个非常相似的问题:

      Export to Word Document in C#

      【讨论】:

        【解决方案5】:

        您可以尝试我的方法将数据导出到 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); 
            }
           }
        

        谢谢。

        【讨论】:

          【解决方案6】:

          我有一个代码用于将表格插入到数据库中的特定书签检索模型中,我希望对社区有所帮助,我使用 mvc C#、microsoft office interop word 来创建一个 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;
          
              }
          

          【讨论】:

            猜你喜欢
            • 2010-09-22
            • 1970-01-01
            • 1970-01-01
            • 2016-08-13
            • 2014-10-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多