Member 13055644 Ответов: 4

Как экспортировать выбранные строки из datagridview в excel на языке C#


Я работал с несколькими методами но все они экспортируют datagridview мне просто нужна строка которая будет выбрана
Заранее спасибо

Что я уже пробовал:

я попробовал этот код, но он позволяет экспортировать все строки datagridview, но я хочу экспортировать только ту строку, которая будет выбрана
using System;  
using System.Collections.Generic;  
using System.ComponentModel;  
using System.Data;  
using System.Drawing;  
using System.Linq;  
using System.Text;  
using System.Threading.Tasks;  
using System.Windows.Forms;  
  
namespace CSharpCornerDemo  
{  
    public partial class Form3 : Form  
    {  
        public Form3()  
        {  
            InitializeComponent();  
        }  
  
        private void button1_Click(object sender, EventArgs e)  
        {  
            myDataGridView.Columns.Clear();  
  
            myDataGridView.ColumnCount = 2;  
            myDataGridView.Columns[0].Name = "User ID";  
            myDataGridView.Columns[1].Name = "Password";  
  
            string[] row = new string[] { "abc", "abc" };  
            myDataGridView.Rows.Add(row);  
            row = new string[] { "pqr", "pqr" };  
            myDataGridView.Rows.Add(row);  
            row = new string[] { "ghanashyam", "ghanashyam" };  
            myDataGridView.Rows.Add(row);  
            row = new string[] { "jignesh", "jignesh" };  
            myDataGridView.Rows.Add(row);  
  
            DataGridViewLinkColumn dgvLink = new DataGridViewLinkColumn();  
            dgvLink.UseColumnTextForLinkValue = true;  
            dgvLink.LinkBehavior = LinkBehavior.SystemDefault;  
            dgvLink.HeaderText = "Link Data";  
            dgvLink.Name = "SiteName";  
            dgvLink.LinkColor = Color.Blue;  
            dgvLink.TrackVisitedState = true;  
            dgvLink.Text = "http://www.c-sharpcorner.com";  
            dgvLink.UseColumnTextForLinkValue = true;  
  
            myDataGridView.Columns.Add(dgvLink);  
        }  
  
        private void myDataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)  
        {  
  
            string UserId = myDataGridView.Rows[e.RowIndex].Cells[0].Value.ToString();  
            string Password = myDataGridView.Rows[e.RowIndex].Cells[1].Value.ToString();  
            // creating Excel Application  
  
            Microsoft.Office.Interop.Excel._Application app = new Microsoft.Office.Interop.Excel.Application();  
            // creating new WorkBook within Excel application  
  
            Microsoft.Office.Interop.Excel._Workbook workbook = app.Workbooks.Add(Type.Missing);  
  
            // creating new Excelsheet in workbook  
  
            Microsoft.Office.Interop.Excel._Worksheet worksheet = null;  
  
            // see the excel sheet behind the program  
  
            app.Visible = true;  
  
            // get the reference of first sheet. By default its name is Sheet1.  
  
            // store its reference to worksheet  
  
            worksheet = workbook.Sheets["Sheet1"];  
  
            worksheet = workbook.ActiveSheet;  
  
            // changing the name of active sheet  
  
            worksheet.Name = "Exported from gridview";  
  
            // storing header part in Excel  
  
            for (int i = 1; i < myDataGridView.Columns.Count + 1; i++)  
            {  
  
                worksheet.Cells[1, i] = myDataGridView.Columns[i - 1].HeaderText;  
  
            }  
  
  
            // storing Each row and column value to excel sheet  
  
             
                for (int j = 0; j < myDataGridView.Columns.Count; j++)  
                {  
  
                    worksheet.Cells[0, j + 1] = myDataGridView.Rows[0].Cells[j].Value.ToString();  
  
                }  
  
            
  
            // save the application  
  
            workbook.SaveAs("c:\\output.xls", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing);  
  
  
  
            // Exit from the application  
  
            app.Quit();  
  
        }  
    }  
}  

4 Ответов

Рейтинг:
26

Member 13055644

Я знаю как выбрать строку в datagridview но я хочу экспортировать выбранную строку в excel как это сделать пожалуйста

Graeme_Grant

тогда у вас уже есть код. Посмотрите на это:

for (int i = 1; i < myDataGridView.Columns.Count + 1; i++)  
{  
    worksheet.Cells[1, i] = myDataGridView.Columns[i - 1].HeaderText;  
}

Member 13055644

Этот код уже написан в скрипте который я разместил но он не позволяет экспортировать выбранную строку

Graeme_Grant

Я был не в том положении, чтобы запускать VS и создавать для вас примерный проект. Во всяком случае, у вас уже был код для этого, и вы решили, что, видя, как вы "знать, как выбрать строку в DataGridView - остальное будет для тебя легко.

Рад видеть, что вы ее решили.

Рейтинг:
2

Bryian Tan

Я бы предложил добавить кнопку, нажать и экспортировать выбранную строку.

private void btnExport_Click(object sender, EventArgs e)
        {
            if (myDataGridView.SelectedRows.Count != 0)
            {
                Microsoft.Office.Interop.Excel._Application app = new Microsoft.Office.Interop.Excel.Application();
                // creating new WorkBook within Excel application  
                Microsoft.Office.Interop.Excel._Workbook workbook = app.Workbooks.Add(Type.Missing);
                // creating new Excelsheet in workbook  
                Microsoft.Office.Interop.Excel._Worksheet worksheet = null;
                // see the excel sheet behind the program  
              //  app.Visible = true;
                // get the reference of first sheet. By default its name is Sheet1.  
                // store its reference to worksheet  
                worksheet = workbook.Sheets["Sheet1"];
                worksheet = workbook.ActiveSheet;
                // changing the name of active sheet  
                worksheet.Name = "Exported from gridview";

                DataGridViewRow row = this.myDataGridView.SelectedRows[0];
                //row.Cells["ColumnName"].Value;

                // storing header part in Excel  
                for (int i = 1; i < myDataGridView.Columns.Count + 1; i++)
                {
                    worksheet.Cells[1, i] = myDataGridView.Columns[i - 1].HeaderText;
                }

                int rowIndex = 2;
                foreach (DataGridViewRow r in myDataGridView.SelectedRows)
                {
                    for (int j = 0; j < r.Cells.Count; j++)
                    {
                        worksheet.Cells[rowIndex, j + 1] = r.Cells[j].Value.ToString();
                    }

                    rowIndex++;
                }

                workbook.SaveAs("c:\\temp\\output.xls", Type.Missing, Type.Missing, Type.Missing,
                    Type.Missing, Type.Missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive,
                    Type.Missing, Type.Missing, Type.Missing, Type.Missing);

                // Exit from the application  
                app.Quit();
            }


Member 13055644

СПАСИБО Я ПОПРОБУЮ ЭТОТ КОД

Member 13055644

Когда я выполняю они опубликовали эту ошибку

Индекс non valide. (Исключение из HRESULT: 0x8002000B (DISP_E_BADINDEX))

Bryian Tan

какая строка выбрасывает эту ошибку, потому что я не получаю эту ошибку на своем конце.

Member 13055644

в этой строке


лист = книга.Простыни["Лист1"];

Bryian Tan

Странный. Потому что это то, что у вас есть изначально. Изменения, которые я предложил, таковы: добавьте кнопку, используйте тот же код + приведенную ниже модификацию. Я рад, что другие решения работают на вас.

if (myDataGridView.SelectedRows.Count != 0)

И
// storing header part in Excel  
                for (int i = 1; i < myDataGridView.Columns.Count + 1; i++)
                {
                    worksheet.Cells[1, i] = myDataGridView.Columns[i - 1].HeaderText;
                }

                int rowIndex = 2;
                foreach (DataGridViewRow r in myDataGridView.SelectedRows)
                {
                    for (int j = 0; j < r.Cells.Count; j++)
                    {
                        worksheet.Cells[rowIndex, j + 1] = r.Cells[j].Value.ToString();
                    }

                    rowIndex++;
                }

Member 13055644

Большое вам спасибо за вашу помощь всегда у меня одна и та же ошибка

Рейтинг:
18

CHill60

Вам действительно нужно внимательно прочитать решение по ссылке, которую дал вам @Graeme_Grant. Это ясно показывает, что вам нужно смотреть на SelectedRows собственность.
Пример использования вашего кода:

          // storing header part in Excel  
for (var i = 0; i < dataGridView1.Columns.Count; i++)
    worksheet.Cells[1, i + 1] = dataGridView1.Columns[i].HeaderText;


// storing Each row and column value to excel sheet  
for (var i = 0; i < dataGridView1.SelectedRows.Count; i++)
{
    for (var j = 0; j < dataGridView1.Columns.Count; j++)
    {
        if (dataGridView1.Rows[i].Cells[j].Value == null) continue;
        worksheet.Cells[2 + i, j + 1] = dataGridView1.Rows[i].Cells[j].Value.ToString();
    }
}

В качестве отступления - я бы не стал помещать это в обобщенное событие CellContentClick - это означает, что вам будет трудно выбрать более одной строки. Если вы хотите иметь кнопку с надписью "экспортировать эту строку", то вам нужно проверить, что вы нажимаете в правильном столбце, прежде чем погрузиться прямо в создание электронной таблицы.


Рейтинг:
1

Member 12686587

<pre> int cr = 1;
            int cc = 1;
           
            //Loop through each row and read value from each column. 
            for (int i = 0; i < dataGridView1.Rows.Count - 1; i++)
            {

                for (int j = 0; j < dataGridView1.Columns.Count; j++)
                {
                    // Excel index starts from 1,1. As first Row would have the Column headers, adding a condition check. 
                    if (cr == 1)
                    {
                        xlWorkSheet.Cells[cr, cc] = dataGridView1.Columns[j].HeaderText;
                    }

                    cc++;
                }
                cc = 1;
                cr++;


            } 
            //get data:
            //you can erase this if you dont need data from rows:
            for (int i = 0; i <= dataGridView1.RowCount - 1; i++)
            {
                for (int j = 0; j <dataGridView1.Columns.Count; j++)
                {
                    DataGridViewCell cell = dataGridView1[j, i];
                    xlWorkSheet.Cells[i + 2, j + 1] = cell.Value;
                    
                }
            }


Richard Deeming

Не разместите свой вопрос как "решение" на чужие вопросы!