C# 如何仅将选定行从datagridview导出到excel?
如何将所选行从dgv导出到excel?下面是我导入excel并查找值的代码C# 如何仅将选定行从datagridview导出到excel?,c#,winforms,datagrid,C#,Winforms,Datagrid,如何将所选行从dgv导出到excel?下面是我导入excel并查找值的代码 private void button1_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog1 = new OpenFileDialog(); if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog1 = new OpenFileDialog();
if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
//this.textBox1.Text = openFileDialog1.FileName;
//string PathConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + textBox1.Text + ";Extended Properties=\"Excel 8.0;HDR=Yes:\";";
String PathConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + openFileDialog1.FileName + ";Extended Properties=\"Excel 12.0 XML;HDR=Yes:\";";
OleDbConnection conn = new OleDbConnection(PathConn);
OleDbDataAdapter myDataAdapter = new OleDbDataAdapter("Select * from [sheet1$]", conn);
DataTable dt = new DataTable();
myDataAdapter.Fill(dt);
dataGridView1.DataSource = dt;
}
}
private void button2_Click(object sender, EventArgs e)
{
dataGridView1.ClearSelection();
dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
try
{
foreach (DataGridViewRow row in dataGridView1.Rows)
{
if (row.Cells["Name"].Value.ToString().ToUpperInvariant().Contains(textBox1.Text.ToUpperInvariant()))
{
dataGridView1.Rows[row.Index].Selected = true;
}
}
}
catch (Exception)
{
}
}
我假设您知道如何将DataTable导出到Excel,您可以使用现有库(如Aspose Cells)或使用Interop,因此我只编写创建该DataTable的代码:
private DataTable CreateDataTableFromSelectedRows()
{
var dtToExport = new DataTable();
foreach(DataGridViewRow row in dataGridView1.SelectedRows)
{
var dr = row.DataBoundItem as DataRow;
dtToExport.ImportRow(dr);
}
return dtToExport;
}
如果您使用它,它将变成:
private void btnExportSelectedRows(object sender, EventArgs e)
{
string filePath = "C:\\test.xlsx";
Aspose.Cells.Workbook wb = new Aspose.Cells.Workbook();
wb.FileFormat = Aspose.Cells.FileFormatType.Xlsx;
Worksheet sheet = wb.Worksheets[0];
DataTable dt = CreateDataTableFromSelectedRows();
sheet.Cells.ImportDataTable(dt, true, "A1");
wb.Save(filePath);
}
但通过使用您提供的导出代码,所有这些都将变成:
为了简洁起见,我删除了对代码的现有注释
private void button1_Click_1(object sender, EventArgs e)
{
Microsoft.Office.Interop.Excel._Application app = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel._Workbook workbook = app.Workbooks.Add(Type.Missing);
Microsoft.Office.Interop.Excel._Worksheet worksheet = null;
app.Visible = true;
worksheet = workbook.Sheets["Sheet1"];
worksheet = workbook.ActiveSheet;
worksheet.Name = "Exported from gridview";
for(int i=1;i<dataGridView1.Columns.Count+1;i++)
{
worksheet.Cells[1, i] = dataGridView1.Columns[i-1].HeaderText;
}
// It's the part which we are interested in
// we just need to change dataGridView1.Rows to dataGridView1.SelectedRows
for (int i=0; i < dataGridView1.SelectedRows.Count ; i++)
{
for(int j=0;j<dataGridView1.Columns.Count;j++)
{
worksheet.Cells[i + 2, j + 1] = dataGridView1.SelectedRows[i].Cells[j].Value.ToString();
}
}
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);
app.Quit();
}
我想这就可以了。请参阅下面导出到Excel的代码:
private void button1_Click_1(object sender, EventArgs e)
{
// 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<dataGridView1.Columns.Count+1;i++)
{
worksheet.Cells[1, i] = dataGridView1.Columns[i-1].HeaderText;
}
// storing Each row and column value to Excel sheet
for (int i=0; i < dataGridView1.Rows.Count-1 ; i++)
{
for(int j=0;j<dataGridView1.Columns.Count;j++)
{
worksheet.Cells[i + 2, j + 1] = dataGridView1.Rows[i].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();
}
您的问题是仅获取选定行,还是导出到excel时遇到问题?上述代码适用于选择行,但我需要导出到excelonly selected的代码。您还可以提供将dgv导出到excel的代码,包括上述代码。抱歉,我不熟悉此字段。我有将dgv导出到excel的代码,但它不会导出所选行。如果你想要,我会提供给你。谢谢你。我认为这节省了我们的时间,所以请提供代码。我刚刚添加了代码,你能检查一下吗。我认为最好将它附加到你自己的问题中。