以上是方法的代码,就是将datagrilview中的数据导入到Excel中,网上找的导入方法,然后自己加的一个for循环判断,但是每次运行程序就造成电脑cpu占用大,所以请大牛帮我看看 这个for循环是不是死循环啊,或者有没有好的办法解决这个问题,求指教,在线等在线等
解决方案 »
- File.Copy(),如果指定目录有同命名文件就不能覆盖吗?如果没有copy上去 操作时间怎么以当前时间为准?>
- 新手问个很菜的问题,请大神帮下忙,谢了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- Gridview里面的控件id会变!我该怎么获得到。
- 删除多行数据
- 录入框如果联想呢?吃6元盒饭的人提问了。
- OUT参数 又有新问题 请大家帮一下
- 求正则表达式
- 如何访问远程的ACCESS数据库?
- 'xp_cmdshell'不能在C#程序调用,为什么?
- 请问:VC#项目中如何嵌入VC++项目
- 如何用C#实现listview多项目的倒计时
- 求助:更新listview数据套耗时,怎么处理?
我试过了,放到for外面的话,第4步骤的关闭Excel对象操作只能执行一次,然后程序就停止了,然后显示对象未引用实例的错误,如果吧1和4步骤都放到for外面 cpu占用还是很高,
我试过了,放到for外面的话,第4步骤的关闭Excel对象操作只能执行一次,然后程序就停止了,然后显示对象未引用实例的错误,如果吧1和4步骤都放到for外面 cpu占用还是很高,
你的程序总共开了几个线程?
我试过了,放到for外面的话,第4步骤的关闭Excel对象操作只能执行一次,然后程序就停止了,然后显示对象未引用实例的错误,如果吧1和4步骤都放到for外面 cpu占用还是很高,
你的程序总共开了几个线程?我就给这个方法开了一个现成,其他没有,我设置断点发现 就是这个for循环导致的cpu升高的,但是不知道该怎么解决
会刷新单元格,非常耗费资源,你加试试。类似如下:Sub compute_fill_all()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
'Rev
Call compute_fill_fm_data("", 0, 0)
'Cost
Call compute_fill_fm_data("(Comp.)Proj_Cost DIF", 60, 0)
'Vat
Call compute_fill_fm_data("", 111, 1)
'Dept OverHead
Call compute_fill_fm_data("(Comp.)Cost center DIF", 163, 0)
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
MsgBox "Calculate Complete."
End Sub执行前关闭UI刷新
Application.ScreenUpdating = False
执行完打开刷新
Application.ScreenUpdating = True
CPU 使用率高,表示程序运行很积极,基本没有停顿
图中显示高使用率的是 Excel 而不是你的程序感觉你的观点很奇特,难道说:不能发挥出 CPU 优异性能的程序,才是好程序?
老哥,我知道是Excel占用cpu高,这个程序本身就是去操作Excel去填入数据,因为数据量比较大,程序一直在那循环几十万次,所以才会造成现在这个情况,我只是想 有没有办法优化一下,找有这方面经验的大牛给点建议,我自己已经不知道该怎么去改善了,才来咨询的,我没有恶意啊
/// 导出文件至CSV文件
/// </summary>
/// <param name="dt">数据表</param>
/// <param name="strFileName">导出后的文件名,不要加后缀名</param>
public void ExportDataGridToCSV(DataTable dt, string strFileName)
{
//string strFile = "";
string path = HttpContext.Current.Server.MapPath("/Files/AutoCreate/Excel/"); //File info initialization
if (!strFileName.EndsWith(".xls"))
{
strFileName = strFileName + ".xls";
}
strFileName = path + "/" + strFileName;
//path = HttpContext.Current.Server.MapPath(strFile);
if (File.Exists(strFileName))
{
File.Delete(strFileName);
}
StringBuilder sbHtml = new StringBuilder();
sbHtml.Append("<table cellspacing='0' border='1' cellpadding='0'>");
sbHtml.Append("<tr>");
for (int i = 0; i < dt.Columns.Count; i++)
{
sbHtml.Append("<td>\t");
sbHtml.Append(dt.Columns[i].ColumnName);
sbHtml.Append("</td>");
}
sbHtml.Append("</tr>");
foreach (DataRow dr in dt.Rows)
{
sbHtml.Append("<tr>");
for (int i = 0; i < dt.Columns.Count; i++)
{
sbHtml.Append("<td>\t");
sbHtml.Append(dr[i].ToString());
sbHtml.Append("</td>");
}
sbHtml.Append("</tr>");
}
sbHtml.Append("</table>"); System.IO.FileStream fs = new FileStream(strFileName, System.IO.FileMode.Create, System.IO.FileAccess.Write);
StreamWriter sw = new StreamWriter(fs, new System.Text.UnicodeEncoding());
sw.Write(sbHtml.ToString());
sw.Flush();
sw.Close();
}
> 你为什么不 一次性把 源Excel 全部读完,然后释放掉 源文件。
> 你为什么不把 源数据拆分好了之后,汇总成一个 List<DataTable> —— 然后再把 每个Table 写入 Excel ?
> 为什么要 WaitOne() —— 为什么要多线程? 你在内存中,得到 List<DataTable> 之后,再使用 多线程不行么?—— 一个函数只做一件事,你一个函数 做了好几件事: 读取源Excel,拆分源Excel,写入新Excel,协调资源
生成后打开这个路径,看文件是不是生成到了这里,如果可以打开的话就成功了。这个速度很快,不会占太大资源的。
1. 里面有30万条数据吗,用户在用这个Winform时候,载入这30万的数据时间也不少吧? 一般都会做分页去展现给使用者,这样用户体验更好。系统Loading轻。
2. 你要把一个30万条的数据源,每一条存到一个Excel中,存成30万个Excel,这要用来干吗?背后是什么需求需要这样的?要生成30万个Excel文到硬盘上,那怎么做速度都会很慢的。如果是只生成一个Excel文件中,估计一分钟内就可以结束。
3. 另外,给你一个NPOI 写Excel的方式,会比微软的这个COM元件效率快很多。public static bool DataSetToExcel(DataSet _ds, string _Path)
{
try
{
#region NPOI 导出方式
HSSFWorkbook hw = new HSSFWorkbook(); #region styleH for 报表 Body 列名,正常字体,加粗,不加边框 左对齐
IFont fontH = hw.CreateFont();
fontH.Boldweight = (short)FontBoldWeight.BOLD; ICellStyle styleH = hw.CreateCellStyle();
styleH.SetFont(fontH);
styleH.Alignment = HorizontalAlignment.CENTER;
styleH.VerticalAlignment = VerticalAlignment.CENTER; #endregion #region output every sheet for (int t = 0; t < _ds.Tables.Count; t++)
{
HSSFSheet sheet2 = (HSSFSheet)hw.CreateSheet(_ds.Tables[t].TableName); HSSFRow rowCol2 = (HSSFRow)sheet2.CreateRow(0);
for (int j = 0; j < _ds.Tables[t].Columns.Count; j++)
{
HSSFCell cell = (HSSFCell)rowCol2.CreateCell(j);
//cell.SetCellValue("1000000000000000000000000000000000000000000");
cell.SetCellValue(_ds.Tables[t].Columns[j].ColumnName);
cell.CellStyle = styleH;
} for (int i = 0; i < _ds.Tables[t].Rows.Count; i++)
{
HSSFRow row = (HSSFRow)sheet2.CreateRow(i + 1);
for (int j = 0; j < _ds.Tables[t].Columns.Count; j++)
{
HSSFCell cell = (HSSFCell)row.CreateCell(j);
string _celldata = _ds.Tables[t].Rows[i][j].ToString();
cell.SetCellValue(_celldata);
if (_celldata.Trim().Contains("<br>")) //应用于Web
{
cell.SetCellValue(_celldata.Trim().Replace("<br>", "\r\n"));
}
cell.CellStyle.WrapText = true; cell.CellStyle.Alignment = HorizontalAlignment.CENTER;
cell.CellStyle.VerticalAlignment = VerticalAlignment.CENTER;
}
sheet2.AutoSizeColumn(i);//列宽自适应,对数字和英文有效,若列中存在中文或空格、*等特殊字符,自适应在当前列无效
}
}
#endregion //hw.Write(System.IO.Stream(@"c:\poi0.xls"));
FileStream file = new FileStream(_Path, FileMode.Create);
hw.Write(file);
file.Close(); #endregion //sw.WriteLine("生产的excel 建立完成,再次检查文件是否成功建立");
#region check if the excel file is created
if (!File.Exists(_Path))
{
//sw.WriteLine("生产的excel 未建立成功");
return false;
}
#endregion
return true;
}
catch (Exception ex)
{
throw new Exception(ex.Message, ex);
}
}需要引用4个文件:
NPOI.dll
NPOI.OOXML.dll
NPOI.OpenXml4Net.dll
NPOI.OpenXmlFormats.dll
生成后打开这个路径,看文件是不是生成到了这里,如果可以打开的话就成功了。这个速度很快,不会占太大资源的。
还是感谢回复,我又试了一下这个方法,导出几百行数据可以,,当导出7万行数据时,显示成功了,但是导出的Excel表格打不开,显示Excel程序未响应而且我看了一下,这个不是我想要的结果,这是把DataTable里面的数据导入到一个Excel里面了,我之前试过这样的其他的方法,导出到一个表格比较简单的,我现在要实现的是每一条数据导出一个表格,有多少条数据,就导出到多少表格中
这个阻塞可有可无的,去掉也没事,那老哥之前做的占用cpu的方法解决了没有,用的什么方法请指教一二