通过剪贴板实现将DataGridView中的数据导出到Excel_实用技巧

将DataGridView中的数据导出到Excel中有许多方法,常见的方法是使用Office COM组件将DataGridView中的数据循环复制到Excel Cell对象中,然后再保存整个Excel Workbook。但是如果数据量太大,例如上万行数据或者有多个Excel Sheet需要同时导出,效率会比较低。可以尝试使用异步操作或多线程的方式来解决UI死锁的问题。

这里介绍一种直接通过Windows剪贴板将数据从DataGridView导出到Excel的方法。代码如下:

复制代码 代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Excel = Microsoft.Office.Interop.Excel;
using System.Reflection;
using Microsoft.Office.Interop.Excel;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.saveFileDialog1.Filter = "Excel Workbook|*.xlsx|Excel Macro-Enabled Workbook|*.xlsm|Excel 97-2003 Workbook|*.xls";
this.saveFileDialog1.FileName = "demo.xlsx";

LoadData();
}

private void LoadData()
{
BindingList<Car> cars = new BindingList<Car>();

cars.Add(new Car("Ford", "Mustang", 1967));
cars.Add(new Car("Shelby AC", "Cobra", 1965));
cars.Add(new Car("Chevrolet", "Corvette Sting Ray", 1965));

this.dataGridView1.DataSource = cars;
}

private void toolStripButton1_Click(object sender, EventArgs e)
{
string filePath = string.Empty;
if (this.saveFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
filePath = this.saveFileDialog1.FileName;
}
else
{
return;
}

this.dataGridView1.SelectAll();
Clipboard.SetDataObject(this.dataGridView1.GetClipboardContent());

Excel.Application objExcel = null;
Excel.Workbook objWorkbook = null;
Excel.Worksheet objsheet = null;
try
{
objExcel = new Microsoft.Office.Interop.Excel.Application();
objWorkbook = objExcel.Workbooks.Add(Missing.Value);
objsheet = (Excel.Worksheet)objWorkbook.ActiveSheet;
objExcel.Visible = false;

objExcel.get_Range("A1", System.Type.Missing).PasteSpecial(XlPasteType.xlPasteAll, XlPasteSpecialOperation.xlPasteSpecialOperationNone, Type.Missing, Type.Missing);
objsheet.Name = "Demo";
//Set table properties
objExcel.Cells.EntireColumn.AutoFit();//auto column width
objExcel.Cells.VerticalAlignment = Microsoft.Office.Interop.Excel.Constants.xlCenter;
objExcel.Cells.HorizontalAlignment = Microsoft.Office.Interop.Excel.Constants.xlLeft;
objExcel.ErrorCheckingOptions.BackgroundChecking = false;

//save file
objWorkbook.SaveAs(filePath, Missing.Value, Missing.Value, Missing.Value, Missing.Value,
Missing.Value, Excel.XlSaveAsAccessMode.xlShared, Missing.Value, Missing.Value, Missing.Value,
Missing.Value, Missing.Value);
}
catch (Exception error)
{
MessageBox.Show(error.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
finally
{
//Dispose the Excel related objects
if (objWorkbook != null)
{
objWorkbook.Close(Missing.Value, Missing.Value, Missing.Value);
}
if (objExcel.Workbooks != null)
{
objExcel.Workbooks.Close();
}
if (objExcel != null)
{
objExcel.Quit();
}

objsheet = null;
objWorkbook = null;
objExcel = null;
GC.Collect(); // force final cleanup.
}
}
}

public class Car
{
private string _make;
private string _model;
private int _year;

public Car(string make, string model, int year)
{
_make = make;
_model = model;
_year = year;
}

public string Make
{
get { return _make; }
set { _make = value; }
}

public string Model
{
get { return _model; }
set { _model = value; }
}

public int Year
{
get { return _year; }
set { _year = value; }
}
}
}

导出数据到Excel的操作在事件toolStripButton1_Click中,代码的第49行和50行是将DataGridView当前选中的行复制到系统剪贴板中,62行将剪贴板中的内容粘贴到Excel默认Sheet的A1单元格中。Excel会自动格式化将粘贴的内容,如下图。

使用剪贴板导出数据过程比较简单,省去了对Excel对象的遍历和操作,缺点是无法对导出的数据进行格式和样式的设置。如果需要对导出的数据进行样式设置,可以尝试使用OpenXML的方式来修改Excel文件的样式,

时间: 2024-11-03 21:43:38

通过剪贴板实现将DataGridView中的数据导出到Excel_实用技巧的相关文章

将datagridview中的数据导出为Excel文件

问题描述 那位能给出C#的详细代码呢? 解决方案 解决方案二:OfficeExcelcom网上太多了我们以前用Farpoint控件.http://blog.csdn.net/blackhero/archive/2006/08/25/1116399.aspx解决方案三:privatevoidImport(DataTabledt_p){Excel.Applicationexcel=newExcel.Application();introwIndex=1;intcolIndex=0;excel.App

asp.net小孔子cms中的数据添加修改_实用技巧

题外话:我为什么研究小孔子的cms,从我自己写一个cms我就开始研究起别人的cms,早期我是研究netcms,但这系统过于庞大,看上去十分的累,也没那个精力,于是打算从一套比较小的开始研究,于是小孔子cms就进入了我的研究范围.没过多久我就放下我手中的cms,决定研究清楚有了更多经验再继续写完我没有完成的cms.        最近都在看小孔子cms的代码,其添加与修改数据十分方便,做下笔记,代码主要提取自小孔子cms,去掉了不用的函数并把相关代码写到一个文件中: 结合上面的图片,当我们要往数据

c#-如何把datagridview中的数据保存到SQL数据库中?VB.NET或C#

问题描述 如何把datagridview中的数据保存到SQL数据库中?VB.NET或C# 如下图:已经实现从EXCEL导入数据到Datagridview中,现在要把其中的数据保存到数据库的AAAie表里面.请用代码说明,谢谢. 解决方案 取数据用ado.net保存到SQL Server数据库.http://blog.csdn.net/lysc_forever/article/details/7697536 解决方案二: 方法1.创建一个数据库,表,表名自取,表的字段和Excel相同,取Excel

c#-在datagridview中修改数据,为什么数据库没有更新

问题描述 在datagridview中修改数据,为什么数据库没有更新 string connstr = "Provider=Microsoft.Jet.OleDb.4.0;"; connstr += @"Data Source=D:Merger201503016caohuanGEARCNC.mdb";//创建连接对象 OleDbConnection tempconn = new OleDbConnection(connstr); tempconn.Open(); O

求 怎样把DataGridView中的数据导入到默认的.MXD地图中

问题描述 用AE和VB做的一个系统在SQL中查询数据然后把在DataGridView中的数据(站名,区站号,经度,纬度,温度)导入到默认的.MXD地图中然后能在地图上显示温度然是按了Button3但是没有任何反应以下是代码求大侠指导PrivateSubButton3_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton3.ClickDimrowsAsInteger=DataGridView1.DataSou

怎么将datagridview中的数据导入到datatable中,并且批量存入数据库

问题描述 //从datagridview中获取数据,导入到datatable中privatevoidbutton3_Click(objectsender,EventArgse){DataTabledt=newDataTable();for(inti=0;i<dataGridView2.Rows.Count;i++){DataRowdr=dt.NewRow();for(intj=0;j<dataGridView2.Columns.Count;j++){dr[j]=dataGridView2.Ro

机房收费系统的实现:VB中如何将MSHFlexGrid控件中的数据导出到Excel

机房收费系统中,好多查询的窗体都包含同一个功能:将数据库中查询到的数据显示在MSHFlexGrid控件中,然后再把MSHFlexGrid控件中的数据导出到Excel表格中. 虽然之前做过学生信息管理系统,不过并没有涉及到这个功能,因此记录于此,于己,回顾反思,于大家,分享学习. 方法一:在根目录中事先建立空的Excel表格 1.在与VB工程同一根目录中建立将要导入数据的Excel表格: 2.在VB事件中写代码: Private Sub cmdExport_Click() Dim i As Int

将DBGrid中的数据导出到Word和Excel

昨天ccrun刚写了将ListView中内容导出到Word文档和Excel文档的一篇文章,今天写程序凑巧用到了将DBGrid中数据导出到Office的功能,干脆再写个兄弟版的函数出来,DBGrid2Word和DBGrid2Excel,分别实现将DBGrid中数据导出到Word和Excel文档.需要注意的是DBGrid中的数据并不代码数据库中所有的数据,因为数据集在打开的时候有可能进行了筛选,取决于使用者如何打开这个数据集,总之就是DBGrid中显示多少数据,就导出多少.看在写代码很辛苦的份上,请

sqlite-Android如何将SQLite数据库中的数据导出为csv格式的文件

问题描述 Android如何将SQLite数据库中的数据导出为csv格式的文件 搜到了下边这个方法,但是我没实现功能,请各位指教.最好能有代码 public void ExportToCSV(Cursor c, String fileName) { int rowCount = 0; int colCount = 0; FileWriter fw; BufferedWriter bfw; File sdCardDir = Environment.getExternalStorageDirecto