.NET在Winform开发中,如何高效的将ListView中的数据导出至EXCEL中,谢谢

keconghua 2006-09-25 09:52:58
以下是网上找的一段代码,可是数据稍稍大一些,确实很慢
请问各位高手有什么好的方法呢,谢谢~~

这个类能实现ListView数据导出成Excel的功能,但是还是有些美中不足,就是效率不是很好,如果数据量比较大的话,建议用其他方法,不过我也没有找到比较好的办法,哪位仁兄有好的方法记得共享一份给小弟,先谢谢啦。
ListView数据导出成Excel#region ListView数据导出成Excel
/**//// <summary>
/// ListView数据导出成Excel
/// </summary>
/// <param name="listviewname">ListView控件ID</param>
public static void ExpToExcel(ListView listviewname)
{
if (listviewname.Items.Count == 0) return;
Excel.Application excel = new Excel.Application();
Excel.Workbooks workbooks = excel.Workbooks;
Excel.Workbook workbook = workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet);
Excel.Sheets worksheets = workbook.Worksheets;
Excel.Worksheet sheet = (Excel.Worksheet) worksheets.get_Item(1);
excel.Visible = true;

Excel.Range range;
excel.Cells.Select();
excel.Cells.RowHeight = 30;
excel.Cells.Font.Size = 10;
excel.Cells.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;

int rowPos = 2;
range = excel.get_Range(sheet.Cells[rowPos,1],sheet.Cells[rowPos,1]);
range.Select();

for(int i=1;i<=listviewname.Columns.Count;i++)
{
range = excel.get_Range(sheet.Cells[rowPos,i],sheet.Cells[rowPos,i]);
range.Borders.LineStyle = 1;
range.Font.Name = "华文仿宋";
range.Font.Size = 16;
range.Font.Bold = true;
range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
range.ColumnWidth = 18;
sheet.Cells[rowPos,i] = listviewname.Columns[i-1].Text.ToString();

}
rowPos++;

foreach(ListViewItem item in listviewname.Items)
{
for(int i=1;i<=listviewname.Columns.Count;++i)
{
range = excel.get_Range(sheet.Cells[rowPos,i],sheet.Cells[rowPos,i]);
range.Borders.LineStyle = 1;
range.Font.Name = "华文仿宋";
range.Font.Size = 12;
range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
// range.NumberFormat = Excel.xlColumnDataType.xlTextFormat ;
range.NumberFormat = Excel.XlParameterDataType.xlParamTypeUnknown ;
sheet.Cells[rowPos,i] = item.SubItems[i-1].Text;
}
rowPos++;
}
GC.Collect() ;
}
#endregion
...全文
894 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
keconghua 2006-10-29
  • 打赏
  • 举报
回复
首先是实现ListView控件的自定义排序,订阅ListView控件的ColumnClick事件
private void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
{
 if (this.listView1.Columns[e.Column].Tag == null)
  this.listView1.Columns[e.Column].Tag = true;
  bool tabK = (bool)this.listView1.Columns[e.Column].Tag;
 if (tabK)
  this.listView1.Columns[e.Column].Tag = false;
 else
  this.listView1.Columns[e.Column].Tag = true;
  this.listView1.ListViewItemSorter = new ListViewSort(e.Column, this.listView1.Columns[e.Column].Tag); 
  //指定排序器并传送列索引与升序降序关键字
  this.listView1.Sort();//对列表进行自定义排序
}
  排序类的定义:

///
///自定义ListView控件排序函数
///

class ListViewSort : IComparer
{
 private int col;
 private bool descK;

 public ListViewSort()
 {
  col = 0;
 }
 public ListViewSort(int column, object Desc)
 {
  descK = (bool)Desc;
  col = column; //当前列,0,1,2...,参数由ListView控件的ColumnClick事件传递
 }
 public int Compare(object x, object y)
 {
  int tempInt = String.Compare(((ListViewItem)x).SubItems[col].Text, ((ListViewItem)y).SubItems[col].Text);
  if (descK) return -tempInt;
  else return tempInt;
 }
}
  上面的ListView控件的自定义排列,即单击ListView控件的标题时进行排序
  下面将实现ListView控件的最后一列的去除,即自动调整合适的大小
  首先写一个调整ListView控件列宽的函数
///
///自动调整listView控件最后一列的列宽
///

private void 调整LV列宽()
{
 listView1.ColumnWidthChanged -= new ColumnWidthChangedEventHandler(listView1_ColumnWidthChanged);
 备注.AutoResize(ColumnHeaderAutoResizeStyle.HeaderSize);
 listView1.ColumnWidthChanged += new ColumnWidthChangedEventHandler(listView1_ColumnWidthChanged);
}
  上面的备注列是listview控件的最后一列的名称,而listview控件的实例名为listView1
  然后订阅ListView控件的ColumnWidthChanged事件,即列宽改变时自动调整列宽
///
/// listview列宽改变事件函数
///

void listView1_ColumnWidthChanged(object sender, ColumnWidthChangedEventArgs e)
{
 调整LV列宽();
}

  再订阅ListView控件的Size_Change事件,即窗口大小被改变时调整列宽
void listView1_SizeChanged(object sender, EventArgs e)
{
 调整LV列宽();
}

  最后在窗体的Shown事件中调整ListView控件的列宽,即第一次显示的时候马上调整列宽
private void 商品管理_Shown(object sender, EventArgs e)
{
 调整LV列宽();
}
brbrm 2006-10-29
  • 打赏
  • 举报
回复
其实在批量写入数据时,Excel有着很好的性能优化。
我们完全没有必要逐个单元格的进行操作,而可以在数组和单元格区域中进行整体转换。
Range对象的Value属性为object类型,但可以把一个二维数组赋值给该属性,这就完成了对整个区域的一次性写入
brbrm 2006-10-29
  • 打赏
  • 举报
回复
VSTO中操纵Excel的更多技术可参看《.NET Office开发指南——Excel篇》一书:
http://www.tup.tsinghua.edu.cn/book/SHOWBOOK.asp?cpbh=023623-01
brbrm 2006-10-29
  • 打赏
  • 举报
回复
快速的解决方案是将ListView中的数据都缓存起来,而后一次性写入到Excel表格中!
看下面的代码示例:

object[,] cache = new object[listView1.Items.Count + 1, listView1.Columns.Count];
for (int i = 0; i < listView1.Columns.Count; i++)
{
cache[0, i] = listView1.Columns[i].Text;
for (int j = 0; j < listView1.Items.Count; j++)
{
cache[j + 1, i] = listView1.Items[j].SubItems[i].Text;
}
}
Excel.Application app1 = new Excel.Application();
Excel.Workbook book1 = app1.Workbooks.Add(Type.Missing);
Excel.Worksheet sheet1 = (Excel.Worksheet)book1.Sheets[1];
string sRange = string.Format("A1:{0}{1}", (char)('A' + (listView1.Columns.Count - 1)), listView1.Items.Count + 1);
sheet1.get_Range(sRange, Type.Missing).Value2 = cache;
app1.Visible = true;
luqinghua 2006-09-28
  • 打赏
  • 举报
回复
给你一个最快的,不过要先把数据放在DataTable里面,执行完之后就能在C盘下看到一个book.xls文件
public void WriteToExcel(DataTable table)
{
try
{
string strFilePath = @"C:\book.xls";
System.IO.StreamWriter sw = new System.IO.StreamWriter(strFilePath, false, System.Text.Encoding.Default);
object[] values = new object[table.Columns.Count];
for (int i = 0; i < table.Columns.Count; ++i)
{
sw.Write(table.Columns[i].Caption.ToString());
sw.Write('\t');
}
sw.Write("\r\n");
for (int i = 0; i < table.Rows.Count; i++)
{
for (int j = 0; j < values.Length; ++j)
{
sw.Write(table.Rows[i][j].ToString());
sw.Write('\t');
}
sw.Write("\r\n");
}
sw.Flush();
sw.Close();
}
catch (Exception ex)
{

throw ex;
}
}
wagod 2006-09-28
  • 打赏
  • 举报
回复
直接写cvs样式的最快,其他的都很慢啊,只能在客户体验上下功夫了,比如出现一个进度条之类的,最好用多线程,不耽误其他的工作就好了
zhiang75 2006-09-28
  • 打赏
  • 举报
回复
楼上的导出的不是Excel格式,我看这是没有办法的事情..要使用EXCEL格式就要调用COM..
建议此操作领开一个后台处理线程,这样前台不会没有响应.
lireng 2006-09-27
  • 打赏
  • 举报
回复
导出数据是手动写的,你只要将你绑定到LISTVIEW的数据写出就行了啊
Knight94 2006-09-25
  • 打赏
  • 举报
回复
你可以试试这种方式

Export a DataSet to Microsoft Excel without the use of COM objects
http://www.codeproject.com/dotnet/ExportToExcel.asp
keconghua 2006-09-25
  • 打赏
  • 举报
回复
改了一下,好像是快了一点点,不过还是很慢
还有什么可以改进的呢,我现在数据还只有四五百,上了几千的话,我想慢的就会让人难以接受,希望有更好的方法来导数据,有经验之高手进来讨论一下吧,谢谢~~
livode 2006-09-25
  • 打赏
  • 举报
回复
你把格式设置放在循环里,对每个格子进行设置。不慢才叫怪呢。把格式设置放到循环外面来。
mqmmx 2006-09-25
  • 打赏
  • 举报
回复
http://www.cnblogs.com/unruledboy/archive/2004/07/07/22093.aspx

这个非常快,还不要求本机装excel,就是有些特殊格式不支持,但用新版本保存一下就能用改了.
csrwgs 2006-09-25
  • 打赏
  • 举报
回复
if(list!=null)
{
Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
if (excel != null)
{
excel.Visible = true;
excel.Application.Workbooks.Add(true);
int col = list.Columns.Count;
int row = list.Items.Count;
for(int i=1;i<=col;i++)
{
excel.Cells[1, i] = list.Columns[i - 1].Text;
}

for (int i = 0; i < row; i++)
for (int j = 0; j < col; j++)
if (j == 0)
excel.Cells[i + 2, j + 1] = list.Items[i].Text;
else
excel.Cells[i + 2, j + 1] = list.Items[i].SubItems[j].Text;

}
excel.Application.Save("c:\\123.xls");
//excel.SaveWorkspace
excel.Quit();
keconghua 2006-09-25
  • 打赏
  • 举报
回复
楼上这种方法好像也不行,导了半天没有一点反应
继续关注.........................................................
.Net精品就业班课程表 : 1、.Net基础加强(10天) 核心技术课程 常用数据结构(List、Dictionary、Array)、多态、常用设计模式、反射、常用.net类库、泛型、IO流、委托事件、正则表达式、XML、反射、GC等。 2、数据开发及ADO.Net(6天) 核心技术课程 数据开发基础、Microsoft SQLServer基础、SQL语言基础、索引、事务、SQL语言高级技术(空值处理、聚合与分组、数据分页、Union、日期函数、类型转换函数、流控函数、表连接、子查询、存储过程、触发器)、数据库设计范式、数据库调优。 ADO.Net(行集、数据集、类型化数据集、SQLHelper、SQL注入漏洞防范、数据绑定)。 3、三层架构MIS项目(5天) 查看项目演示 功能点 本项目基于流行的三层架构(DAL+BLL+UI)。 主要功能点:高安全性的用户管理体系、高安全性的异构系统数据导入导出、拼音检索、复合检索、无限级次数据管理、个性化邮件群发、Excel文件导入导出。 技术点 ADO.Net技术应用、SQLServer、MD5安全算法、基于NPOI的Excel文件处理、树状结构数据处理、递归、CodeSmith、代码生成器、三层架构。 项目说明 这是一个用WinForm技术实现的系统,传智播客在开课的半个月就安排一个项目,体现了传智播客“项目驱动学习”的先进教学理念。 4、网页开发与JavaScript(7天) 查看案例演示 核心技术课程 HTML基础加强、css(包含Div+CSS布局)、JavaScript、Dom(事件、window对象、document对象、对话框、定时器、粘贴板、动态Dom、跨浏览器兼容性解决方案、JS压缩和CDN、Internet Explorer Developer Toolbar)、JQuery(JQuery函数、隐式迭代、链式编程、id选择器、tag选择器、CSS选择器、层次选择器、表单选择器、过滤选择器、复合选择器、节点导航、节点操作、样式操作、事件、动画、JQuery Cookie、JQuery Live、JQueryUI)。 课程说明 CSS、JavaScript是ASP.Net开发的基础,把这些掌握好了就能很轻松的学会ASP.Net;Dom是实现网页动态效果的技术,在网站越来越个性化年代,招聘企业对应聘者的Dom水平要求非常高;JQuery是近几年异军突起的JavaScript框架库,几乎成了Web前端开发事实上的标准,大部分企业都是使用JQuery进行Web前端的开发。 学完了这阶段课程,学员将学会开发主流网站的前端效果,比如:焦点图、滚动展示图、网页防复制、网页自定义菜单、WebOS、美女时钟、无刷新评论、评分控件、表格特效、图片悬浮详细信息、微博界面、QQ消息框效果、Div对话框等。 5、ASP.Net开发(12天) 核心技术课程 自己动手写Web服务器(Socket、多线程)、ashx模式Web开发、ViewState、Cookie、Session、Http协议、Web开发基本原则、XSS漏洞防范、Request对象、Response对象、Server对象、虚拟路径、HttpHandler深入、ASP.Net生命周期、WebForm原理、服务端基本控件、WebShell漏洞防范、HTML服务端控件、验证框架、MasterPage、数据绑定控件(ObjectDataSource、列表类绑定控件、GridView、FormView、ListView、Repeater、高效率分页)、CKEditor、Membership、缓存、互联网调优(SEO、HTML压缩、页面静态化、移除ViewState、表单GET化)、URL重写、错误处理、AJAX(XMLHTTP、JQuery AJAX、Json)、全局文件、HttpHandler与HttpModule、IIS配置。 课程说明 由于微软对ASP.Net进行高度封装,因此ASP.Net入门非常简单,开发人员不需要了解HTML、JavaScript、Http协议也可以快速开发出一个Web系统,正因为如此,社会上充斥着大量这样的“拖控件的开发人员”,使得很多Java、PHP等语言的开发人员诋毁ASP.Net开发人员的时候经常会说“你们什么都不懂,就会拖控件”。ASP.Net的快速开发是ASP.Net非常大的一个优点,可以加快开发效率,这是行业的发展趋势,但是局限于这样的“傻瓜化开发方式”的开发人员的竞争力和成长性都是非常有限的,遇到ASP.Net一些高级技术(比如ASP.Net MVC、SEO、网站调优、服务端客户端混合编程、AJAX等)的时候就完全不能胜任。通过上一个阶段的HTML、JavaScript、Dom的学习,学员已经有了很好的HTML、JavaScript基础;在ASP.Net课程的一开始,不是直接教学员怎么拖ASP.Net控件进行快速开发,而是通过ashx的模式开发原始的动态网站,让学员明白“请求—处理—响应模型”、“Http协议、Http无状态”、“c#代码渲染生成浏览器端JavaScript”、“ViewState的作用”、“Session的原理”等这些基本而又重要的原理,从而扫清后面ASP.Net知识学习的基础性障碍。 由于访问量非常大,因此互联网项目的开发对ASP.Net开发人员的要求非常高,所以我们安排了互联网调优、缓存、网站防黑等内容。 ASP.Net控件数量是非常多的,讲解ASP.Net的教材通常要上千页,让初学者望而生畏,其实ASP.Net大部分控件相似性非常强的,同类型的控件学会了一个那么其他控件也就很容易学会了。比如只要学会了DropDownList,那么RadioButtonList、ListBox、CheckBoxList、BulletedList等几乎不用学就会用;再比如只要学会了ListView,那么Repeater、GridView、FormView等控件也是触类旁通。传智播客认真钻研教学,对知识进行分类、整理、提炼精华,让学员在短时间内掌握ASP.Net技术。 ASP.Net有一些技术是有局限性的,传智播客根据这些技术在企业的实际应用情况进行了调整、补充。比如项目几乎没有在UI层直接访问数据库的,而是采用三层架构,因此我们不讲解UI层直连数据库的控件SQLDataSource,而是把主要精力放在讲解三层架构开发模式。再比如ASP.Net内置的AJAX解决方案UpdatePanel只在部分要求不高的内网项目才被使用,因此我们在讲解UpdatePanel的使用和原理之外,把更多的时间放在讲解企业用的最多的JQuery AJAX解决方案上。 6、B/S系统项目(7天) 项目说明 1、网上图书商城。这是一个典型的B2C网上商城,使用经典的复杂三层架构(工厂模式)进行开发。涉及图书管理、搜索、订单管理、导航管理等核心模块。在讲解ASP.Net基础后安排这样一个B2C网上商城系统,让学员在实际项目将学到的知识学以致用。 2、办公自动化OA系统。这是一个典型的基于ASP.Net技术的OA协同办公项目,包含了权限管理、公告管理、文档管理、工作流、论坛管理、新闻模块管理、人员管理等典型的OA系统模块。 3、数据采集和邮件群发。这是一个基于多线程的邮件营销平台,核心技术包括网络爬虫、多线程、HTML解析、邮件发送、生产者消费者模式等。 注:以上三个案例,上课时会根据每个班的课堂反馈选择其一个案例予以讲解学习。 7、如鹏网项目(9天) 查看项目演示 功能点 站内搜索、栏目管理、视频播放(完全模仿优酷视频页面)、焦点图、静态页面生成(新浪、搜狐等大型网站普遍采用的技术)、文章管理、无刷新评论、评论的无刷新分页、敏感词过滤、用户管理、友情链接管理、缓存管理、广告位管理、RSS输出、水印设置、无刷新上传图片、搜索引擎优化设置、数据备份恢复、伪静态设置、网上商城、订单管理、在线支付(支持支付宝、财付通、块钱等第三方支付平台)、网站调优(数据库优化、缓存、静态页、CSS Spirit、js压缩)。 技术点 搜索引擎技术:Lucene.Net、多线程开发、爬虫技术、网页分析、正则表达式、Log4Net日志框架、Quartz.Net定时作业调度。 大型互联网开发技术:代码生成、网页静态化、基于JQuery的Web2.0页面开发、AJAX、SEO、网站调优、采集器、RSS/XML、网站防黑(防XSS攻击、防注入漏洞攻击、防CC攻击、防挂马、防盗链、敏感词过滤、广告帖智能过滤)、IIS管理与调优、流量分析、第三方脚本嵌入(广告、统计代码、内容联盟等)、图片服务器分离。 项目说明 如鹏网项目是已经上线三年的网站,日访问量最高20000人次,网址www.rupeng.com。本系统旧版本基于PHP、J2EE技术,由如鹏网开发者亲手操刀用.net重写新版本。系统分为前台Web界面、后台管理界面、站内搜索、监控客户端四个子系统。 大型互联网站由于访问量非常大,因此不是那些单纯用ASP.Net控件拖拽开发开发人员能够开发的,也不是闭门造车能够造出来的,必须是在实际项目经过无数访问者的使用、反馈、修改才能做出来的。搜房网、汽车之家等大型网站用到的网站静态化、图片服务器分离、高性能缓存、HTML/JS压缩、CDN、CSS Sprite、负载均衡、Memcached、镜像服务器同步等问题不是那些随手写出来的所谓在线商城、电子商务系统所所能够涉及到的。 这个项目完全按照高访问量互联网站进行设计,通过这个项目,学员不仅可以在实战巩固对前面学习的ASP.Net、ADO.NetWinForm等知识的掌握,还可以掌握网站防黑、缓存、SEO、静态化、搜索引擎技术、AJAX等大型互联网开发涉及到的技术。 8、.Net新技术(Windows Phone、ASP.Net MVC)(6天) 项目说明 未来是移动互联网的时代,未来将是Windows Phone、Android、iphone三足鼎立的时代,掌握了移动开发的技能的人是就业市场的抢手货。微软推出的Windows Phone平台是微软在移动互联网时代的一个重量级产品,微软对于WindowsPhone7的推广力度非常大,因此很多公司也开始进行Windows Phone7产品的研发,2011年下半年Windows Phone7开发人员的需求将会出现井喷,为了帮助学员掌握移动3G开发技术,传智播客.Net班加入了Windows Phone开发课程,采用传智播客独创的WP7Simulator教学平台,学员可以做出一个基于云计算架构的LBS系统。点击查看传智播客独创WP7Simulator教学平台。 ASP.Net MVC是微软推出的区别于ASP.Net WebForm的Web开发新技术,由于ASP.Net MVC解决了ASP.Net WebForm的很多缺点,非常适合大型、型项目的开发,一经推出就受到了.Net开发社区的追捧,很多.Net开发人员的职位要求都提到了MVC,可见掌握ASP.Net MVC技术必将提升自己就业的砝码。 9、就业指导(2天) 项目说明 总结以往所学知识,讲解《传智播客.Net面试、笔试宝典》,介绍简历、笔试、面试等所需的知识和技巧。

111,112

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧