[转]asp.net导出excel/csv格式数据最优方案(c#)

<p>本文转自:<a href="http://www.cnblogs.com/lovenets2008/archive/2008/05/06/1184234.html" target="_blank">http://www.cnblogs.com/lovenets2008/archive/2008/05/06/1184234.html</a></p><p>原文如下:</p><p><font style="background-color: #cce8cf;">好久没有写点什么了,也许是太忙。一年了,积累了不少好的东东,有机会时就写出来与大家分享。 </font></p><p><font style="background-color: #cce8cf;">好,言归正传。 <br>导出到excel/csc文件并不难,所以就有好多方法:控件直接render、把dataset输出成string再write出来等,(当然如果调用excel程序的库文件的话还可以使用更强的直接操作excel的方法,但这种方法用于web服务显得有点要求太高:必须让web服务器安装指定版本的excel或其支持库文件)。就其前两种方法,实际上也是一样的,render也是把由dataset转变的view生成为一个table输出到客户端而已,只不过隐藏了细节,如果不信,你用editplus什么的看看生成的.xls文件就知道了。 </font></p><p><font style="background-color: #cce8cf;">excel的识别力太强了,以至于它本身的格式、csv格式、tab分隔符格式、网页的table格式等都能够很好的打开。但是它“太聪明”了,以至于自动识别数字和字符串,而且要把超过11位的数字自动变为科学计数法的格式,你试试输入“123456789012”,离开那个单元格,就成“123457e+11”了,够聪明的吧,不过有时会让我们感觉不便,因为我输入的就是我自己的身份证号码,尾巴上没有“x”,本来好好的15位数字,得现在成这么个计数法了。那我就改改显示格式吧,改为把数字显示为文本,好了。可是国家的身份证升级了,号码变成18位,我把它输入到数据库,导出来时,用刚才的方法处理过,18位没错,可是最后三位怎么都是零了!excel为我们做了太多的事,不管是应该的还是不应该的。 </font></p><p><font style="background-color: #cce8cf;">怎么解决?请看代码: </font></p><font style="background-color: #cce8cf;"><p> public static string exporttable(dataset ds)<br> {<br> string data = "";<br> //data = ds.datasetname + "\n";</p><p> foreach (datatable tb in ds.tables)<br> {<br> //data += tb.tablename + "\n";<br> data += "<table cellspacing=\"0\" cellpadding=\"5\" rules=\"all\" border=\"1\">";<br> //写出列名<br> data += "<tr style=\"font-weight: bold; white-space: nowrap;\">";<br> foreach (datacolumn column in tb.columns)<br> {<br> data += "<td>" + column.columnname + "</td>";<br> }<br> data += "</tr>";</p><p> //写出数据<br> foreach (datarow row in tb.rows)<br> {<br> data += "<tr>";<br> foreach (datacolumn column in tb.columns)<br> {<br> if (column.columnname.equals("证件编号") || column.columnname.equals("报名编号"))<br> data += "<td style=\"vnd.ms-excel.numberformat:@\">" + row[column].tostring() + "</td>";<br> else <br> data += "<td>" + row[column].tostring() + "</td>";<br> }<br> data += "</tr>";<br> }<br> data += "</table>";<br> }</p><p> return data;<br> }</p><p><br> public static void exportdstoxls(page page, string sql)<br> {<br> exportdstoxls(page, "filename", sql);<br> }<br> public static void exportdstoxls(page page, string filename, string sql)<br> {<br> dataset ds = dbutil.getdataset(sql);<br> if (ds != null) exportdstoxls(page, filename, ds);<br> }<br> public static void exportdstoxls(page page, dataset ds)<br> {<br> exportdstoxls(page, "filename", ds);<br> }<br> public static void exportdstoxls(page page, string filename, dataset ds)<br> {<br> page.response.clear();<br> page.response.buffer = true;<br> page.response.charset = "gb2312";<br> //page.response.charset = "utf-8";<br> page.response.appendheader("content-disposition", "attachment;filename=" + filename + system.datetime.now.tostring("_yymmdd_hhmm") + ".xls");<br> page.response.contentencoding = system.text.encoding.getencoding("gb2312");//设置输出流为简体中文<br> page.response.contenttype = "application/ms-excel";//设置输出文件类型为excel文件。 <br> page.enableviewstate = false;<br> page.response.write(exporttable(ds));<br> page.response.end();<br> }<br>//style="vnd.ms-excel.numberformat:@" 可以去除自动科学计数法的困扰 <br>//输出为table,能够最大限度的减少字段中数据对生成的文件格式的影响,在这里我没有处理数据中含有html标签的情况 在页面后台中,这样使用就可以了: </p><p> protected void lbtntoexcel_click(object sender, eventargs e)<br> {<br> string strwhere = buildsearchwherestring(); <br> string strorder = this.hidorderstring.value; <br> string sql = "select 报名编号, 证件编号, 姓名, 考区考点, 报考类别, " <br> + "行政区划名称 as 行政区划, 单位名称 as 工作单位, 毕业学校名称, 毕业专业名称 as 毕业专业, 毕业年月, " <br> + "通讯地址, 性别"<br> + " from [vw报名]"; <br> if (!string.isnullorempty(strwhere)) sql += " where " + strwhere; <br> if (!string.isnullorempty(strorder)) sql += " order by " + strorder; <br> else sql += " order by [报考类别]";<br> pageexport.exportdstoxls(this.page, "baoming", sql);<br> databind();<br> }</p><p></p></font>暂写到这里,休息。<br>更新日期:2008-5-5<p><font color="#336699">#7楼</font>[<span class="louzhu"><font color="#999999">楼主</font></span>] <font color="#999999">2008-05-09 12:33 </font><font color="#336699">爱网2008</font><font color="#336699" size="2"></font></p><p>修改了这个函数:在导出1k条数据时,估计速度提高上百倍,数据量越大越明显,原理很简单,stringbuilder的性能和“+”的性能的区别。 <br>public static string exporttable(dataset ds) <br>{ <br>stringbuilder sb = new stringbuilder(); <br>//data = ds.datasetname + "\n"; <br>int count = 0; <br><br>foreach (datatable tb in ds.tables) <br>{ <br>//data += tb.tablename + "\n"; <br>sb.appendline("<meta http-equiv=\"content-type\" content=\"text/html; charset=gb2312\">"); <br>sb.appendline("<table cellspacing=\"0\" cellpadding=\"5\" rules=\"all\" border=\"1\">"); <br>//写出列名 <br>sb.appendline("<tr style=\"font-weight: bold; white-space: nowrap;\">"); <br>foreach (datacolumn column in tb.columns) <br>{ <br>sb.appendline("<td>" + column.columnname + "</td>"); <br>} <br>sb.appendline("</tr>"); <br><br>//写出数据 <br>foreach (datarow row in tb.rows) <br>{ <br>sb.append("<tr>"); <br>foreach (datacolumn column in tb.columns) <br>{ <br>if (column.columnname.equals("证件编号") || column.columnname.equals("报名编号")) <br>sb.append("<td style=\"vnd.ms-excel.numberformat:@\">" + row[column].tostring() + "</td>"); <br>else <br>sb.append("<td>" + row[column].tostring() + "</td>"); <br>} <br>sb.appendline("</tr>"); <br>count++; <br>} <br>sb.appendline("</table>"); <br>} <br><br>return sb.tostring(); <br>} <br><br>稍后会提供下载版</p>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值