C# Экспорт таблицы данных Выбранные строки в Word

У меня есть DataGridView в моей форме. Что я пытаюсь сделать, если пользователь выберет строку и нажмите Button(button_1) данные из этой строки следует отправить в текстовый документ и заменить число в соответствии с column[i], Теперь с кодом ниже
Проблема 1, когда я выбираю одну строку и нажимаю кнопку, данные находят и заменяют число в файле Word, но оно заменяет все вхождения, например, "1", но я хочу, чтобы это было сделано только один раз, потому что я хочу сделать это для каждого строка.Проблема 2, если пользователь выбирает более одной строки экспортируются только последние выбранные данные строки. Есть идеи??

    private void button1_Click(object sender, EventArgs e)
    {

        string SendPath = "";

        if (openFileDialogWord.ShowDialog(this) == DialogResult.OK)
        {
            SendPath =  (openFileDialogWord.InitialDirectory + openFileDialogWord.FileName).ToString();
        }


        WordDoc(SendPath);
    }



    public void WordDoc(string getfilename)
    {



        object FileName = getfilename; //The filepath goes here


        //Create word Application Object
        Word.Application word = new Word.Application();

        //Create word document Object
        Word.Document doc = null;

        //Create word Missing Object
        object missing = System.Type.Missing;

        object readOnly = false;
        object isVisible = false;
        // make visible Word application
        word.Visible = true;

        try
        {
            doc = word.Documents.Open(ref FileName, ref missing, ref missing,
            ref missing, ref missing, ref missing, ref missing, ref missing,
            ref missing, ref missing, ref missing, ref missing, ref missing,
            ref missing, ref missing, ref missing);
            doc.Activate();




            string Column1;
            string Column2;

            foreach (DataGridViewRow rows in dataGridView1.SelectedRows)
            {


                Column1 = rows.Cells[1].Value.ToString();
                Column2 = rows.Cells[2].Value.ToString();

                this.FindAndReplace(word, "1", Column1);
                this.FindAndReplace(word, "2", Column2);

            }

            MessageBox.Show("Complete");


        }
        catch (Exception ex)
        {
            MessageBox.Show("Error : " + ex.Message);
        }
    }



    private void FindAndReplace(Word.Application word, object findText, object replaceText)
    {
        object matchCase = true;
        object matchWholeWord = true;
        object matchWildCards = false;
        object matchSoundsLike = false;
        object matchAllWordForms = false;
        object forward = true;
        object format = false;
        object matchKashida = false;
        object matchDiacritics = false;
        object matchAlefHamza = false;
        object matchControl = false;
        object read_only = false;
        object visible = true;
        object replace = 2;
        object wrap = 1;
        word.Selection.Find.Execute(ref findText, ref matchCase,
        ref matchWholeWord, ref matchWildCards, ref matchSoundsLike,
        ref matchAllWordForms, ref forward, ref wrap, ref format,
        ref replaceText, ref replace, ref matchKashida,
        ref matchDiacritics,
        ref matchAlefHamza, ref matchControl);
    }

2 ответа

Решение

Проблема была с этой частью

объект заменить = 2;

Я нашел решение на DreaminCode

Заменены object replace = 2; с object replace = 1; и это работает отлично.

Если вам интересно, вы можете попробовать нашу стороннюю библиотеку GemBox.Document, чтобы получить требуемый эффект более простым способом. Проблемы с вашим текущим подходом следующие:

  1. использование жестко закодированных строк "1", "2",... в качестве заполнителей подвержено ошибкам
  2. трудно или даже невозможно импортировать несколько строк с поиском и заменой без сложного файла шаблона
  3. Ваше приложение может быть запущено только на компьютерах с установленным MS Word, так как оно использует Word Interop.

С нашим компонентом вы можете легко выполнить импорт данных всех выбранных строк DataGridView в документ Word. Вот пример кода C#, как это сделать с помощью слияния:

        // Create data source for DataGridView.
        var people = new DataTable()
        {
            Columns = 
            {
                new DataColumn("Name", typeof(string)),
                new DataColumn("Surname", typeof(string))
            },
            Rows =
            {
                { "John", "Doe" },
                { "Fred", "Nurk" },
                { "Hans", "Meier" },
                { "Ivan", "Horvat" }
            }
        };

        // Create DataGridView and show it to select rows.
        var dataGridView = new DataGridView()
        {
            DataSource = people,
            Dock = DockStyle.Fill
        };
        new Form() { Controls = { dataGridView } }.ShowDialog();

        // Get selected items which will be used as data source for mail merge.
        var selectedItems = dataGridView.SelectedRows.Cast<DataGridViewRow>().Select(dgvRow => dgvRow.DataBoundItem).ToArray();

        // Create template document which is usually created with MS Word application and loaded with GemBox.Document library.
        // This code just shows the structure of the template document.
        var doc = new DocumentModel();
        doc.Sections.Add(
            new Section(doc,
                new Table(doc,
                    new TableRow(doc,
                        new TableCell(doc,
                            new Paragraph(doc,
                                new Run(doc, "Name") { CharacterFormat = { Bold = true } })),
                        new TableCell(doc,
                            new Paragraph(doc,
                                new Run(doc, "Surname") { CharacterFormat = { Bold = true } })))
                    {
                        RowFormat = { RepeatOnEachPage = true }
                    },
                    new TableRow(doc,
                        new TableCell(doc,
                            new Paragraph(doc,
                                new Field(doc, FieldType.MergeField, "RangeStart:SelectedPeople"),
                                new Field(doc, FieldType.MergeField, "Name"))),
                        new TableCell(doc,
                            new Paragraph(doc,
                                new Field(doc, FieldType.MergeField, "Surname"),
                                new Field(doc, FieldType.MergeField, "RangeEnd:SelectedPeople")))))
                { 
                    TableFormat = { PreferredWidth = new TableWidth(100, TableWidthUnit.Percentage) } 
                }));

        // Execute mail merge. All selected people will be imported into the document.
        doc.MailMerge.Execute(selectedItems, "SelectedPeople");

        // Save document in DOCX and PDF formats.
        doc.Save(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "SelectedPeople.docx"));
        doc.Save(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "SelectedPeople.pdf"));
Другие вопросы по тегам