rss· 投稿· 设为首页· 加入收藏· 繁體版
当前位置: 火魔网 » 程序开发 » VB.NET

asp.net(VB.net,C#) 导出excel一种比较完善的解决方案

由于自己的生成的查询页面临时要增加导出xls的功能,但是以前没做过,所以查询了很多文章,大多来自于博客园 cnblog(再次表示感谢) 但是发现很多并没有很好的深入。

以前有的是C#,不过项目是用VB.NET 编的,所以只能用VB.net 去实现导出excel的功能,其实一样,

不过要注意再循环时,C#中的“\n”“\t” 在VB.NET 中是vbLf ,也可以vbCrLf,vbtab,用来分隔单元格的输入

目前的需求是 将DataGrid上的数据 导出excel 表格 并且在数据行的上面附带查询的条件

比如开始时间,结束时间,产品编号等,选择的物料种类是什么。

总结了一下 网络上搜索到的生成excel文件的方法 基本确定了三种方法作为解决方案

1)使用UI.web.Control的RendControl(参数是htmlstring类的字符串)方法一次性写出优点是方便省事 ,不过对生成的格式无法直接控制

2)遍历DataSet 或者其他类似表格的形式获取数据,然后用httprespose 对象写出好处是控制数据放入你想放入的每个单元格,但是问题是单元格的格式(颜色)没有

3)引用COM或者 。net 的 excel 的dll 。这个算是正宗的方式,里面的对象方法可以从容的操作定义单元格的格式,但是由于公司的权限设置,出现的问题无法解决。看上去很美但是无法解决

其实1,2方法归根结底都是由httprespose 对象来操作,可以算作同一种大类的方法。

先来说说方法3,公司权限设置的相当严格,环境是server 2008 R2 + sqlserver2005 +vs2008   

1.检索COM类工厂中的CLSID为{。。。}的组件时失败,原因是出现以下的错误80070005
Retrieving the COM class factory for componet with CLSID {...} failed due to the following erro:80070005
.
asp.net(VB.net,C#) 导出excel一种比较完善的解决方案

查了一段时间的资料,发现需要设置DCOM config ,但是打开server 2008的DCOM发现连个Microsoft excel 应用程序的鬼影都没有,此路不通!
2.COMException was unhandled by user code .

asp.net(VB.net,C#) 导出excel一种比较完善的解决方案

无解

由于我对格式的要求无非是要有Datagrid的表头数据列的颜色,字体粗细,没有合并单元格的要求,格式也不是很复杂,现在的问题是只能使用方法1,2解决。但是方法2 没有格式。
所以只能把方法放在1上。

这时候才意识到应该用断点跟踪一下 RendControl中的输入参数到底是个什么鬼东西!
经过附加进程,跟踪,发现参数htmlstring 的字符串是html的代码,其实就是一个前后都是table 标签包括的,以tr td 来控制格式颜色的html代码的字符串,
由于excel 完全可以读取这样的非标准的xls后缀文件,所以我们到处打开之后可以另存为同名的文件替代覆盖就成了标准的excel文件了

table 字符串大体结构

<table cellspacing="0" cellpadding="4" rules="all" border="1" id="ctl00_PlaceHolderMain_dtGrid" style="background-color:White;border-color:#3366CC;border-width:1px;border-style:None;font-family:tahoma;font-size:11px;border-collapse:collapse;"> <tr style="color:#003399;background-color:White;font-weight:bold;font-size:13px;">       <td ></td>
    <td style="color:Blue;">Start Date:</td>
    <td style="color:Black;font-weight:bold;"></td>
</tr> //原有的数据
<tr style="color:#003399;background-color:White;">
    <td>1001</td>
    <td>0001</a>
    </td>
    <td>产品ID</td>
    <td>产品名称</td>
    <td style="width:100px;">产品属性</td>
    <td align="center">A1</td>
    <td align="center" style="white-space:nowrap;">29 Oct 2010</td>
    <td align="center">07:32:41</td>
    <td align="right">11.00</td>
    <td align="right">&nbsp;</td>
    <td align="center">单位</td>
    <td align="center">NO</td>
    <td align="center">NO</td>
    <td align="center">REL</td>
</tr>
。。。略 <tr align="left" style="color:#003399;background-color:#99CCCC;">
    <td colspan="14">
      <span>1</span>
    </td>
</tr>

</table>-----------

接下来的无非就是对字符串的操作:替换<br>,这样单元格不会自动换行。
Datagrid 中有超链接字符,需要在html中用正则表达式替换掉<a href=..> 和</a>标签 插入设计好的查询信息的<tr>标签字段,设计好这些信息的布局,可以参考参数的html数据。
这样就能输出符合需求的xls文件了。

。。略

       ctl.RenderControl(hw)
        Dim strWrite = tw.ToString().Replace("<br>", " ").Replace(" – ", " - ").Replace(">000", ">'000")

        Dim reg As Regex = New Regex("(?i)</?a\b[^>]*>")
        strWrite = reg.Replace(strWrite, "") 'delete the hyperlink <a ..> and </a>

        Dim strInsert As String = "<tr style=""color:#CCCCFF"

        If strWrite.Contains(strInsert) Then
            strWrite = strWrite.Replace(strInsert, CreatDataHeader() & strInsert)
        Else
            lblMessage.Text = "Can not containt the header"
            lblMessage.Visible = True
        End If

        HttpContext.Current.Response.Write(strWrite) 'delete <br>,make the excel cell single line
        HttpContext.Current.Response.End()

只要表格能做到的就能够输出出来,这些需要具体问题具体分析。

类似生产excel 的文章一搜一大把 但是我认为下列文章对我帮助最大

参考文章:

本文的几种方法主要来自于
http://www.cnblogs.com/sufei/archive/2009/05/23/1487540.html
方法3的开发参考
http://www.cnblogs.com/xuanhun/archive/2010/04/29/1724500.html

顶一下
(0)
踩一下
(0)