C#.net 代码优化
一下是小弟的一段代码,运行起来速度比较慢,点下按钮到保存好文档并打开需要2-5秒不等。请各位.net达人帮忙指点一下,怎么才能优化一下性能。顺便指导一下在这个打印过程中怎样方便的添加一个进度条。小弟是.net菜鸟,不胜感激.//打印按钮处理
private void print_btn_Click(object sender, EventArgs e)
{
// 取得画面上的数据
System.Data.DataTable objDataTable = GetDgvData();
// 打印取得的数据
if (objDataTable.Rows.Count < 1)
{
MessageBox.Show("画面上没有可以打印的数据,请确认!");
}
else
{
string tempPoNo = string.Empty;
tempPoNo = this.pono_tbx.Text.Trim() ;
string tempInvoice = string.Empty;
tempInvoice = this.invoice_tbx.Text.Trim();
string invoiceNo = string.Empty;
if ("".Equals(tempInvoice))
{
MessageBox.Show("画面上没有输入正确的Invoice#数据,保存的文档将直接以P.O.#命名!");
invoiceNo = tempPoNo;
}
else
{
invoiceNo = tempInvoice.Substring(0, 7);
}
// 单据名称
string formName = IniFA.ifa.IniReadValue("system_Inf", "INVOICE_RECORD");
// 模板取得
//string filename = @printAddress + sysDate + "_" + tempPoNo + "_" + formName;
string filename = @printAddress + invoiceNo + "_" + formName;
FileInfo mode = new FileInfo(templateAddress + formName);
try
{
mode.CopyTo(filename, true);
}
catch (Exception ee)
{
MessageBox.Show(ee.Message);
return;
}
Excel.Application objApp = new Excel.Application();
Excel.Workbooks workbooks = objApp.Workbooks;
object missing = Missing.Value;
workbooks.Open(filename, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing);
Excel.Sheets objSheets = objApp.Worksheets;
Excel._Worksheet objSheet;
//采用索引的方式规定写入Index张的工作表
objSheet = (Excel._Worksheet)objSheets.get_Item(1);
// 设定item数据
int dataCount = objDataTable.Rows.Count;
if (dataCount > 20)
{
MessageBox.Show("数据行数超过20行,请修改模板!");
return;
}
// 循环写入数据
for (int i = 0; i < dataCount; i++)
{
string item = GetStr(objDataTable.Rows[i]["item"]);
string description = GetStr(objDataTable.Rows[i]["description"]);
string quantity = GetStr(objDataTable.Rows[i]["quantity"]);
string unit = GetStr(objDataTable.Rows[i]["unit"]);
string unit_price = GetStr(objDataTable.Rows[i]["unit_price"]);
string extened_US = GetStr(objDataTable.Rows[i]["extened_US"]);
objSheet.Cells[i + 19, 2] = item;
objSheet.Cells[i + 19, 4] = description;
objSheet.Cells[i + 19, 13] = quantity;
if ("".Equals(unit))
{
objSheet.Cells[i + 19, 15] = "pcs";
}
else {
objSheet.Cells[i + 19, 15] = unit;
}
objSheet.Cells[i + 19, 17] = unit_price;
objSheet.Cells[i + 19, 19] = extened_US;
}
//设定其他数据
string tempRefCode = string.Empty;
string tempDate;
string tempTo = string.Empty;
string tempAddress = string.Empty;
string tempAddress2 = string.Empty;
string tempAddress3 = string.Empty;
string tempAttn = string.Empty;
string tempDeliveryTime = string.Empty;
string tempPayment = string.Empty;
string tempSayUsDollars = string.Empty;
string tempTotal = string.Empty;
string tempBalance = string.Empty;
string tempP_Balance = string.Empty;
string tempRemark1 = string.Empty;
string tempRemark2 = string.Empty;
tempRefCode = this.ref_code_tbx.Text.Trim();
tempDate = this.date_dtp.Value.ToShortDateString().ToString();
tempTo = this.to_tbx.Text.Trim();
tempAddress = this.address_tbx.Text.Trim();
tempAddress2 = this.address2_tbx.Text.Trim();
tempAddress3 = this.address3_tbx.Text.Trim();
tempAttn = this.attn_tbx.Text.Trim();
tempDeliveryTime = this.delivery_time_dtp.Value.ToShortDateString().ToString();
tempPayment = this.payment_tbx.Text.Trim();
tempSayUsDollars = this.say_US_dollars_tbx.Text.Trim();
tempRemark1 = this.remark1_tbx.Text.Trim();
tempRemark2 = this.remark2_tbx.Text.Trim();
if (!"".Equals(this.total_tbx.Text.Trim()))
{
tempTotal = this.total_tbx.Text.Trim();
}
if (!"".Equals(this.balance_tbx.Text.Trim()))
{
tempBalance = this.balance_tbx.Text.Trim();
}
tempP_Balance = this.p_balance_tbx.Text.Trim();
objSheet.Cells[10, 19] = tempPoNo;
objSheet.Cells[11, 19] = tempInvoice;
objSheet.Cells[12, 19] = tempRefCode;
objSheet.Cells[13, 19] = tempDate;
objSheet.Cells[10, 3] = tempTo;
objSheet.Cells[11, 3] = tempAddress;
objSheet.Cells[12, 3] = tempAddress2;
objSheet.Cells[13, 3] = tempAddress3;
objSheet.Cells[14, 3] = tempAttn;
if (!"".Equals(tempDeliveryTime))
{
objSheet.Cells[39, 2] = "Delivery time:";
objSheet.Cells[39, 4] = tempDeliveryTime;
}
if (!"".Equals(tempPayment))
{
objSheet.Cells[40, 2] = "Payment:";
objSheet.Cells[40, 4] = tempPayment;
}
if (!"".Equals(tempRemark1))
{
objSheet.Cells[41, 2] = "Remark:";
objSheet.Cells[41, 4] = tempRemark1;
}
if (!"".Equals(tempRemark2))
{
objSheet.Cells[42, 4] = tempRemark2;
}
objSheet.Cells[44, 2] = tempSayUsDollars;
if ((!"".Equals(this.balance_tbx.Text.Trim())) && (0 != Convert.ToDecimal(this.balance_tbx.Text.Trim())))
{
if (100 > Convert.ToInt32(this.p_balance_tbx.Text.Trim()))
{
objSheet.Cells[44, 15] = tempP_Balance + "% Balance:";
objSheet.Cells[44, 19] = this.balance_tbx.Text.Trim();
}
else
{
objSheet.Cells[44, 15] = "TOTAL:";
objSheet.Cells[44, 19] = this.total_tbx.Text.Trim();
}
}
else
{
objSheet.Cells[44, 15] = "TOTAL:";
objSheet.Cells[44, 19] = this.total_tbx.Text.Trim();
}
//去掉保存的对话框,若肯定无重复的文件或需要提示,将下面两行注释即可
objApp.DisplayAlerts = false;
objSheet.SaveAs(filename, missing, missing, missing, missing, missing, missing, missing, missing, missing);
objApp.Workbooks.Close();
//退出依然会驻留的进程
objApp.Quit();
System.GC.Collect();
MessageBox.Show("已经将单子保存到" + printAddress + "目录下面!");
// 打开生成的excel文件
System.Diagnostics.Process.Start(filename);
}
} --------------------编程问答-------------------- --------------------编程问答-------------------- 先要知道哪段代码耗时
写下log看看
进度条的问题, 可以通过后台线程来处理,完成一步通知一次界面, 直到最终完成
假死确实对用户体验很不好 --------------------编程问答-------------------- 因为你的代码全都在表示层里,在进行保存的时候,编译器要全部编译一便,代码少的话是不会等那么长时间的,如果代码多的话,那编译耗费的时间肯定长了。程序的运行速度自然就慢了。
.....知道三层架构么??
如果编写的时候是用三层架构的,将要访问数据库的那段代码都放到数据访问层,逻辑判断放到业务逻辑层,在表示层只要调用业务逻辑层的方法就可以了。 --------------------编程问答-------------------- 三层架构 或许会好点吧
这个我还没遇到过 --------------------编程问答-------------------- 你调用Excel来帮你存文件,不慢才怪。 --------------------编程问答-------------------- 好好学习天天向上 --------------------编程问答-------------------- na ni 好好弄 --------------------编程问答-------------------- 单元测试主要是哪里影响效率
--------------------编程问答-------------------- use profiler to check which function uses most of the time,
like this one:
http://www.jetbrains.com/profiler/index.html
visual studio has a built in profiler, F1 --------------------编程问答-------------------- for (int i = 0; i < dataCount; i++)
{
string item = GetStr(objDataTable.Rows[i]["item"]);
string description = GetStr(objDataTable.Rows[i]["description"]);
string quantity = GetStr(objDataTable.Rows[i]["quantity"]);
string unit = GetStr(objDataTable.Rows[i]["unit"]);
string unit_price = GetStr(objDataTable.Rows[i]["unit_price"]);
string extened_US = GetStr(objDataTable.Rows[i]["extened_US"]);
objSheet.Cells[i + 19, 2] = item;
这部分最耗时间。 objSheet.Cells每个EXCEL格挨个遍历赋值。
建议 把数据放在数组 用objSheet。range(区域,数组)
这样会提高N倍速度。 --------------------编程问答-------------------- 明显是启动Excel耗的时间
直接用流输出生成Exxcel格式的文件,别启动Excel程序 --------------------编程问答-------------------- 代码太多啦!~~!~~~~~~~~~~~~~~~ --------------------编程问答-------------------- 创建excel的application对象是很费时间的,花个2秒钟打开一个excel已经算是飞速了
这个和架构无关,就算用N层结构都没用
--------------------编程问答-------------------- 你能少用点if 多用点switch吗 --------------------编程问答-------------------- 优化,至少你也把代码拆成多个方法。一个方法完成一个任,别全部写在一个方法里。 --------------------编程问答-------------------- 顶。。。。。。。。。。。 --------------------编程问答-------------------- Excel 那的事吧。 --------------------编程问答-------------------- ding! --------------------编程问答-------------------- 面向对象 --------------------编程问答-------------------- --------------------编程问答-------------------- 我也学习学习、、、、 --------------------编程问答--------------------
友情帮顶下!顺便学习学习!
--------------------编程问答--------------------
呵呵,楼上太搞笑了吧 --------------------编程问答-------------------- 我也写过一个解析excel的东东,慢的跟驴一样 --------------------编程问答-------------------- EXcel --------------------编程问答-------------------- excel就是这么慢。 --------------------编程问答-------------------- 我也觉得用流导出excel会比较快! --------------------编程问答-------------------- 好长。。慢慢看 --------------------编程问答-------------------- 慢慢跑,看哪费时,在优化 --------------------编程问答-------------------- 路过 学习..... --------------------编程问答-------------------- 飘过 学习 --------------------编程问答-------------------- 你先单步跟踪试试啊,如果循环次数多了,那就没法优化 --------------------编程问答-------------------- 你用了office的COM组件,要手动释放该组件的资源 --------------------编程问答-------------------- 应该是打开EXCEL的问题吧,一般电脑打开个EXCEL5秒左右吧,特别是office2007之后,打开更慢
--------------------编程问答-------------------- 一定要用流的方式来操作Excel 使用OleDB可以直接连Excel文件的 然后使用Sql语句直接操作Excel的Sheet 一个Sheet就是一张表 --------------------编程问答-------------------- 1. 2到5秒,其实不算很长
2. 请问目前的数据量有多大,如果数据量大,2到5秒,完全可以认为是正常的。如果只有几百条数据,那么最关键的地方是Excel.Application objApp = new Excel.Application();这块。这种方式会启动excel进程,这个过程本身也需要差不多2秒时间。而且这种方式最麻烦的是excel进程一般并随程序关闭而关闭严重占用资源
3.建议使用非vsto方式开发,比如nopi,openxml这类无需office本身支持的方式开发
补充:.NET技术 , .NET Framework