导出DataGridView、DataTable到Excel

 

最近遇到导出DataGridView到Excel速度慢问题,数据量不大,但其中有几列字段很大(汉子2000左右),查了网上许多方法要么还是慢,

要么不能正常运行;修改一下,调试通过,导出比以前快很多,而且不会再卡死。整理如下:

用Excel将要生成的表格设计好:

另存为XML表格:

用文本编辑器打开保存的xml:

找到Table节点,将节点的ss:ExpandedRowCount=”2” 删除掉:

往下会看到列标题:

下面就是数据,将数据Row删除并替换成 {0}:

主要代码:

 1 protected override void btn_exprot_Click(object sender, EventArgs e)
 2         {
 3             BuildWhere();
 4
 5             //dgv_Details.DataSource = controller.GetAreaSiteInfo(strWhere.ToString()).Tables[0];
 6
 7             DataTable dt = controller.GetAreaSiteInfo(strWhere.ToString()).Tables[0];//取得数据
 8             string Row = @"<Row>
 9                             <Cell ss:StyleID=""s21""><Data ss:Type=""String"">{0}</Data></Cell>
10                             <Cell ss:StyleID=""s21""><Data ss:Type=""String"">{1}</Data></Cell>
11                             <Cell ss:StyleID=""s21""><Data ss:Type=""String"">{2}</Data></Cell>
12                             <Cell ss:StyleID=""s21""><Data ss:Type=""String"">{3}</Data></Cell>
13                             <Cell ss:StyleID=""s21""><Data ss:Type=""String"">{4}</Data></Cell>
14                             <Cell ss:StyleID=""s21""><Data ss:Type=""String"">{5}</Data></Cell>
15                             <Cell ss:StyleID=""s21""><Data ss:Type=""String"">{6}</Data></Cell>
16                             <Cell ss:StyleID=""s21""><Data ss:Type=""String"">{7}</Data></Cell>
17                             <Cell ss:StyleID=""s21""><Data ss:Type=""String"">{8}</Data></Cell>
18                             <Cell ss:StyleID=""s21""><Data ss:Type=""String"">{9}</Data></Cell>
19                             <Cell ss:StyleID=""s21""><Data ss:Type=""String"">{10}</Data></Cell>
20                             <Cell ss:StyleID=""s21""><Data ss:Type=""String"">{11}</Data></Cell>
21                             <Cell ss:StyleID=""s21""><Data ss:Type=""String"">{12}</Data></Cell>
22                             <Cell ss:StyleID=""s21""><Data ss:Type=""String"">{13}</Data></Cell>
23                             </Row>";
24
25             List<string> Rows = new List<string>();
26             foreach (DataRow dr in dt.Rows)
27             {
28                 Rows.Add(string.Format(Row, dr[0],dr[1],dr[2],dr[3],dr[4],dr[5],dr[6],dr[7],dr[8],dr[9],dr[10],dr[11],dr[12],dr[13]));
29             }
30
31             StreamReader reader = new StreamReader(Application.StartupPath + "\\区域查询导出.xml");
32
33             SaveFileDialog diag = new SaveFileDialog();
34             diag.Filter = "Excel文件(*.xls)|*.xls";
35             diag.RestoreDirectory = true;
36             string path = "";
37
38             if (diag.ShowDialog() == DialogResult.OK)
39             {
40                 path = diag.FileName.ToString();
41                 StreamWriter writer = new StreamWriter(path);
42                 writer.Write(reader.ReadToEnd(), String.Join("\r\n", Rows.ToArray()));
43                 writer.Flush();
44                 writer.Close();
45             }
46             reader.Close();
47             if (ConvertExcel(path))
48                 FUIHelper.ShowDialog(this, "导出成功!!", "提示", MessageIcon.Information);
49             //dgv_Details.ExportToExcel("区域表查询");
50         }
51
52         private bool ConvertExcel(string savePath)
53         {
54             //将xml文件转换为标准的Excel格式
55             Object Nothing = System.Reflection.Missing.Value;//由于yongCOM组件很多值需要用Missing.Value代替
56             Microsoft.Office.Interop.Excel.Application ExclApp = new Microsoft.Office.Interop.Excel.Application();// 初始化
57             Microsoft.Office.Interop.Excel.Workbook ExclDoc = ExclApp.Workbooks.Open(savePath, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing);//打开Excl工作薄
58             try
59             {
60                 Object format = Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal;//获取Excl 2007文件格式  xlWorkbookNormal
61                 ExclApp.DisplayAlerts = false;
62                 ExclDoc.SaveAs(savePath, format, Nothing, Nothing, Nothing, Nothing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive, Nothing, Nothing, Nothing, Nothing, Nothing);//保存为Excl 2007格式
63             }
64             catch (Exception ex)
65             {
66                 return false;
67             }
68             ExclDoc.Close(Nothing, Nothing, Nothing);
69             ExclApp.Quit();
70             return true;
71         }

时间: 2024-12-21 19:09:44

导出DataGridView、DataTable到Excel的相关文章

C#WinForm 直接导出DataGridView数据到Excel表格的二种方法对比

方法一.利用微软的excel 操作类 引用:using Excel = Microsoft.Office.Interop.Excel; 代码如下:         #region导出数据表:Excle (微软的excel 操作类)         ///<summary>         ///导出数据表:Excle         ///</summary>         ///<param name="myDGV"></param>

C#读取Excel表格数据到DataGridView中和导出DataGridView中的数据到Excel

其实想在datagridview中显示excel表格中的数据跟读取数据库中的数据没什么差别,只不过是创建数据库连接的时候连接字段稍有差别. private void btnShow_Click(object sender, EventArgs e) { OpenFileDialog fd = new OpenFileDialog();//首先根据打开文件对话框,选择excel表格 ofd.Filter = "表格|*.xls";//打开文件对话框筛选器 string strPath;/

winform导出dataviewgrid数据为excel的方法

本文实例讲述了winform导出dataviewgrid数据为excel的方法.分享给大家供大家参考.具体实现方法如下: 代码如下: #region 导出dataViewGrid视图中的数据为xls格式 private void btnExportList_Click(object sender, EventArgs e) { string fname = string.Empty; SaveFileDialog sfd = new SaveFileDialog(); sfd.Filter =

使用Aspose将DataTable转Excel

0.准备工作 1.下载并引入Aspose.Cells 下载Aspose Cells并引入using Aspose.Cells 下面示例中用的是.net 3.0版本的Aspose Cells,编译环境VS2013 具体下载和引入方法见:http://www.cnblogs.com/moonache/p/4991459.html 1.使用Aspose将DataTable转为Excel 1.代码 下面代码用于将DataTable dt 转为Excel文件并存在path目录下 /// <summary>

winform导出datagridview数据到excle

if (dgvResult.Rows.Count == 0) { MessageBox.Show("列表为空"); } //创建Excel对象 Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application(); excel.Application.Workbooks.Add(true); // 生成字段名称 excel.Cells[1, 1] = &qu

.NET使用Office Open XML导出大量数据到 Excel

我相信很多人在做项目的都碰到过Excel数据导出的需求,我从最开始使用最原始的HTML拼接(将需要导出的数据拼接成TABLE标签)到后来happy的使用开源的NPOI, EPPlus等开源组件导出EXCEL,但不久前,我在一个项目碰到一个需求:要将几个分别有近60多万的数据源导出到Excel中,我们先不要讨论这个需求本身是否合理,客户就是要这样.我先后用NPOI和EPPlus,都发现同一个问题:OutOfMemoryException,我电脑12G内存居然不够用? 的确内存溢出了,但内存还剩下好

SpreadSheet数据导出为DataTable

devexpress也提供了一种将excel数据,而且可以指定区域进行转换,用起来相当灵活,本人将其解决方法分享如下(代码):         private DataTable export(Worksheet sheet, Range range, bool rangeHasHeaders) // sheet为文档中的sheet表,range为要导出的数据范围,rangeHasHeaders表示数据是否包含表头        {            // 采用CreateDataTable

PHP导出MySQL数据到Excel文件

PHP导出MySQL数据到Excel文件 转载 常会碰到需要从数据库中导出数据到Excel文件,用一些开源的类库,比如PHPExcel,确实比较容易实现,但对大量数据的支持很不好,很容易到达PHP内存使用上限.这里的方法是利用fputcsv写CSV文件的方法,直接向浏览器输出Excel文件. ? 1 <br><!--?php// 输出Excel文件头,可把user.csv换成你要的文件名header('Content-Type: application/vnd.ms-excel');he

js导出table中的EXCEL总结

导出EXCEL一般是用PHP做,但是项目中,有时候PHP后端工程师返回的数据不是我们想要的,作为前端开发工程师,把对应的数据编号转换为文字后,展示给用户,但是,需求要把数据同时导出一份EXCEl.无奈之下,我只能用js导出table中的数据了. 导出EXCEl一般是自己人用的,所以用js导出,因为js导出EXCEL一般情况下兼容性不是很好,很多只是兼容IE浏览器,还要设置在工具栏中进行设置才能导出,因为会相对比较烦.下面介绍几种方法: 一.js导出EXCEl带单元格合并[已验证,比较好用] //