快速把ListView数据导出至EXCEL 别拿复制过的代码发

luluyy 2011-02-21 03:56:25
我的方法是



public void OperateExcel(ListView list, string text)
{
SaveFileDialog S = new SaveFileDialog();
S.Filter = "Excel files(*.xls)|*.xls";
S.RestoreDirectory = true;
S.CheckFileExists = false;
S.OverwritePrompt = false;
DialogResult dr=S.ShowDialog();
if (dr==DialogResult.Cancel)
{
return;
}
Interop.Excel.Application app = new Interop.Excel.Application();
try
{
if (app == null)
{
return;
}
app.Visible = false;
Workbooks workbooks = app.Workbooks;
_Workbook workbook = workbooks.Add(XlWBATemplate.xlWBATWorksheet);
Sheets sheets = workbook.Worksheets;
_Worksheet worksheet = (_Worksheet)sheets.get_Item(1);
if (worksheet == null)
{
return;
}
app.Visible = false;
app.Cells[1, 4] = text;
for (int x = 1; x <= list.Columns.Count; x++)
{
app.Rows.Cells[2, x] = list.Columns[x - 1].Text;
}
for (int i = 3; i <= list.Items.Count + 2; i++)
{
for (int j = 1; j <= list.Columns.Count; j++)
{
app.Rows.Cells[i, j] = list.Items[i - 3].SubItems[j - 1].Text;

}
}

//保存
workbook.SaveCopyAs(S.FileName);
workbook.Saved = true;
MessageBox.Show("保存成功!", "振勇提示!", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
Sdyy_Change.Log.WriteLog(ex.ToString());
MessageBox.Show("保存失败,请重试!", "振勇提示!", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
//关闭Excel工作空间
app.UserControl = false;
app.Quit();
}
}


但是很慢` 点了保存以后会卡
还有就是导完了以后进程里面会有一个 excel进程
如果用System.Diagnostics.Process的Kill方法杀掉进程的话那么如果我开着一个excel正在办公然后用软件导出`
那么也就杀掉了`而且如果里面的东西没有保存就会丢失
...全文
1071 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
qoushui 2011-05-21
  • 打赏
  • 举报
回复
结束EXCEL进程可以使用API来根据句柄找进程ID,然后就可以单独只杀死你创建的EXCEL进程了
qoushui 2011-05-21
  • 打赏
  • 举报
回复
二维表式的数据可以使用整行赋值或者用剪切板交换数据(有界面的话SENDKEY),电子表单形式的我也没有好办法,只能一格一格填 了,不过这种表单数据量一般也不会多。 如果只是显示但不用编辑的数据,可以使用流的方式输入HTML的EXCEL描述文件。如果是服务器,可以使用NPOI或者 POI.我最近在做嵌入EXCEL在C#中操作的例子,但是扫描的确很慢,今天准备改种方式 ,先用EXCEL编辑,然后保存后用NPOI来解析数据。目前的例子可以到我资源中去下.

拿来主义不是什么坏事,但不能一点脑子不动,自己要去反复尝试,解决。网上的只是给个思路,不改是不符合自己要求的
luluyy 2011-03-02
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 effun 的回复:]
主要是慢在逐个单元格赋值,这里可以用一种更快的办法,定义一个与目标区域一样大的object二维数组,然后把值先放到这个数组相应的元素中,最后再将这个数组赋给Range的Value属性。例如要从A2开始填充2行3列数据,

object[,] array = new object[2, 3];
// 对数组赋值
worksheet.get_Range("A2:C3").value = arr……
[/Quote]

单元格赋值很慢很慢`郁闷
effun 2011-02-23
  • 打赏
  • 举报
回复
主要是慢在逐个单元格赋值,这里可以用一种更快的办法,定义一个与目标区域一样大的object二维数组,然后把值先放到这个数组相应的元素中,最后再将这个数组赋给Range的Value属性。例如要从A2开始填充2行3列数据,

object[,] array = new object[2, 3];
// 对数组赋值
worksheet.get_Range("A2:C3").value = array;
笑道江湖情 2011-02-22
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 luluyy 的回复:]
一发贴 从这里弄个链接`从那里弄个连接`其实百度一下就出来了,这样不是白发嘛
[/Quote]
百度的那一堆是根据关键字搜出来的,而别人给你的链接很多都是自己经验,或者是自己遇到了类似的情况,避免你少走弯路才提供的。
sihonglaoren 2011-02-22
  • 打赏
  • 举报
回复
三连帖了,帮你断一下。
luluyy 2011-02-22
  • 打赏
  • 举报
回复
笑死我了

[Quote=引用 75 楼 bao110908 的回复:]
我靠,楼主啊!你在 Java 版发学挖掘机好,还是学 Java 好,在这里就变成 ASP.net 了啊?

http://topic.csdn.net/u/20110218/14/5831cfab-a320-4742-8b77-ea019f1befb7.html
这个帖子的楼主是你的马夹,还是你是他的马夹?
[/Quote]
luluyy 2011-02-22
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 sihonglaoren 的回复:]
lz这种初级IT民工我最了解。也就会一点电脑操作,整天网上整个代码往编辑框里面一贴,看看能不能使,不能使就换一个。遇到没有现成代码的时候就傻眼了。
[/Quote]
http://topic.csdn.net/u/20110217/12/7edbaa07-8738-4ddb-967e-5d7abceabc1a.html#replyachor
[Quote=引用 65 楼 46539492 的回复:]
引用 58 楼 lih163 的回复:
学技工吧,这行业没学历很难混,除非你技术特牛,否则学历是问题,刚开始还不需要,时间长了,你就知道了

以你的学历,学asp.net没戏,不是鄙视你学不好,而是,以后你找工作都很难!找到薪水很难高,涨薪也很难!建议你挖掘机或者烹饪!
[/Quote]

这哥们儿回答最准啊
luluyy 2011-02-22
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 sihonglaoren 的回复:]
lz这种初级IT民工我最了解。也就会一点电脑操作,整天网上整个代码往编辑框里面一贴,看看能不能使,不能使就换一个。遇到没有现成代码的时候就傻眼了。
[/Quote]
你太牛了
sihonglaoren 2011-02-22
  • 打赏
  • 举报
回复
lz这种初级IT民工我最了解。也就会一点电脑操作,整天网上整个代码往编辑框里面一贴,看看能不能使,不能使就换一个。遇到没有现成代码的时候就傻眼了。
luluyy 2011-02-22
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20110222/16/3a58e8ef-e252-4b57-8baf-11b8b68e2399.html?seed=681207958&r=71748098#r_71748098
这个上面有一个导出到文本的`这样快`但是格式不对啊 哎`
luluyy 2011-02-22
  • 打赏
  • 举报
回复
一发贴 从这里弄个链接`从那里弄个连接`其实百度一下就出来了,这样不是白发嘛
luluyy 2011-02-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 fangxinggood 的回复:]
挨个单元格赋值,的确很慢的。
不知道你的数据量如何?可以考虑赋到系统剪切板,再一口气粘到Excel中。
另外,com组件在使用完毕后,需要手动释放一下对COM的引用。

C# code
System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
GC.Collect();

http://blog.csdn.net/f……
[/Quote]

没多大数据量,基本都是2000行左右,最多不会超8000
[Quote=引用 10 楼 qldsrx 的回复:]
引用 8 楼 wuyq11 的回复:
public static void ExpToExcel(ListView lst)
{
if (lst.Items.Count == 0) return;
Excel.Application excel = new Excel.Application();
Excel.Workbooks workbooks = excel.Workbooks;
……
[/Quote]
这玩意儿是以前很早的代码 从以前的程序里面弄出来的,现在我都是在Debug下面做的`这个下面没有
问题了才Release
qldsrx 2011-02-21
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wuyq11 的回复:]
public static void ExpToExcel(ListView lst)
{
if (lst.Items.Count == 0) return;
Excel.Application excel = new Excel.Application();
Excel.Workbooks workbooks = excel.Workbooks;
Excel.W……
[/Quote]
楼主都说了,“别拿复制过的代码发”,你还去复制代码,这代码Google上搜下都不知道出现过多少遍了,而且还不对题,答非所问。
qldsrx 2011-02-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 luluyy 的回复:]
引用 3 楼 qldsrx 的回复:
用完后,调用app.Quit();就可以把Excel进程干掉了,你说的“导完了以后进程里面会有一个 excel进程”是不可能发生的。


你看我上面的代码 就是那个样子的 确实有个excel进程 刚重启了机子 硬盘也挂了 妈的 我说怎么那么慢
不过程序代码确实有点慢哦
我上面的代码有哪位高手能给指点一下子优化优化不 提高一下速度
[/Quote]
针对你说的现象,我改为Debug模式测试了下,的确excel进程不会立刻结束,不过过些时候还是会消失的。我之所以没碰到过你的这种现象,因为我不是在Debug模式下编译的,我知道Debug模式有些BUG,对于一个程序,最终应该使用Release模式编译,这样才会更加稳定,使用Release模式编译的程序,调用的excel进程会立刻结束,你可以试试。

另外关于赋值慢的现象可以考虑先用get_Range方法获取一个范围,然后针对这个范围进行赋值,我曾看到有人使用数组对每个列范围进行赋值,可能会提速,你可以试试。
wuyq11 2011-02-21
  • 打赏
  • 举报
回复
public static void ExpToExcel(ListView lst)
{
if (lst.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<=lst.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.XlParameterDataType.xlParamTypeUnknown ;
sheet.Cells[rowPos,i] = item.SubItems[i-1].Text;
}
rowPos++;
}
GC.Collect() ;
}
机器人 2011-02-21
  • 打赏
  • 举报
回复
机器人 2011-02-21
  • 打赏
  • 举报
回复
挨个单元格赋值,的确很慢的。
不知道你的数据量如何?可以考虑赋到系统剪切板,再一口气粘到Excel中。
另外,com组件在使用完毕后,需要手动释放一下对COM的引用。
System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
GC.Collect();

http://blog.csdn.net/fangxinggood/category/751589.aspx

这篇文章有更详细的介绍: .NET操作Excel COM对象

luluyy 2011-02-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 qldsrx 的回复:]
用完后,调用app.Quit();就可以把Excel进程干掉了,你说的“导完了以后进程里面会有一个 excel进程”是不可能发生的。
[/Quote]

你看我上面的代码 就是那个样子的 确实有个excel进程 刚重启了机子 硬盘也挂了 妈的 我说怎么那么慢
不过程序代码确实有点慢哦
我上面的代码有哪位高手能给指点一下子优化优化不 提高一下速度
加载更多回复(3)

111,132

社区成员

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

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

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