0

データ グリッド ビューから Word ドキュメントにエクスポートするこのコードがありますが、別のファイルを作成せずに既存の Word ファイルにエクスポートする必要がありますか? 別の画像を作成するのではなく、作成する必要がある2つの画像を含む美しいヘッダーを持つ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); 
    }
   }
4

1 に答える 1

2

これをしないでください:

Word.Document oDoc = new Word.Document();

Word はエラーを生成しませんが、ドキュメント オブジェクトは正しく機能しません。newWord でキーワードを使用できるのは for だけWord.Applicationです。それ以外の場合は、適切な方法を使用してください。ドキュメントの場合、これはDocuments.AddまたはになりDocuments.Openます。

また、Word.Application のオブジェクトを宣言してインスタンス化する必要があります。例えば:

Word.Application wdApp = new Word.Application();
wdApp.Visible = true;

既存のドキュメントから新しいドキュメントを作成する場合は、Addメソッドを使用して、テンプレートとして使用するファイルの名前を指定します。

object filePathAndName = "file info";
Word.Document oDoc = wdApp.Documents.Add(ref filePathAndName);

同様に、オブジェクトに依存するのではなく、オブジェクトを宣言し、必要に応じてインスタンス化する必要がありSelectionます。例えば:

Word.Range oRange = oDoc.Content;
Word.Table tbl = oRange.ConvertToTable(//params here);

非常に重要なのは、使用するすべてのオブジェクトを正しく解放し、アプリケーションを終了して明示的なガベージ コレクションを実行することです (「COM オブジェクトの解放」を参照してください https://msdn.microsoft.com/en-us/library/office/aa679807(v= office.11​​).aspx );

tbl = null;
oRange = null;
oDoc.Close();
oDoc = null;
wdApp.Quit();
wdApp = null;
//GC here
于 2016-04-29T18:42:18.440 に答える