.Net源码论坛 [ 繁体中文 ]

发新话题 回复该主题

转Excel的一种简单方法 [复制链接]

楼主
写了这么久的程序﹐越来越喜欢那种简单的解决方法﹐这段时间在做一个报表系统﹐其中有需要转Excel﹐而且要求兼容openoffice﹐遂利用asp语法,asp.net的控件封装特性以及excel 2003xml试算清格式做了一个看起来比较"清爽"excel转档方案。 .开始 原理很简单﹐excel2003增加了一种xml电子表格的格式﹐如下
  1. <?xml version="1.0"?>
  2. 2<?mso-application progid="Excel.Sheet"?>
  3. 3<Workbook
  4. 4 xmlns="urn:schemas-microsoft-com:office:spreadsheet"
  5. 5 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
  6. 6 <Worksheet ss:Name="Sheet1">
  7. 7  <Table>
  8. 8   <Row>
  9. 9     <Cell ss:MergeAcross="1"><Data ss:Type="String">Excel xml</Data></Cell>
  10. 10   </Row>
  11. 11   <Row>
  12. 12    <Cell><Data ss:Type="String">A2</Data></Cell>
  13. 13    <Cell><Data ss:Type="Number">0.112</Data></Cell>
  14. 14   </Row>
  15. 15  </Table>
  16. 16 </Worksheet>
  17. 17</Workbook>
复制代码
将这段代码存成xml或xls的后缀﹐excel都能正确打开﹐当然openoffice则只能存成xml的后缀。 因此我们只要输出一个这样的文字文件就行。 但是如果要I/O操作﹐写一个这样的文字文件出来﹐还是比较烦琐的﹐因此直接利用aspx的特性: 在aspx.cs中写到﹕
  1. protected void Page_Load(object sender, EventArgs e)
  2. 2    {
  3. 3         Response.Clear();
  4. 4        Response.ContentType = "application/vnd.ms-excel";
  5. 5        string excelname = "ExcelReport";    
  6. 6        Response.AddHeader("content-disposition", "attachment; filename=" + System.Web.HttpUtility.UrlEncode(excelname, System.Text.Encoding.UTF8) + ".xml");
  7. 7    }
  8. 8
复制代码
而在aspx中则只要填入上上面那段代码﹐当然<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ExcelExport.aspx.cs" Inherits="ExcelExport" %>不要忘喽﹐这样在直接访问aspx时﹐就能够下载一个excel档案了。 二.模板语言 尽管asp的<%语法被很多人诟病﹐说是意大利面条﹐其实任何技朮都有其适用范围﹐只要心中有刀... asp的<%=%>和<% %>很适于UI的制作﹐可能有些TX没有接触过asp﹐简单讲一下﹐在aspx文件中是可以直接写代码的﹐不要类﹐方法﹐就是顺序执行﹐如 <% 2DateTime now = DateTime.Now; 3%> 4你好﹐现在是<%=now.ToString("yyyy/MM/dd HHss")%> 这样就完成了一个动态的页面。将上面的代码存成一个aspx﹐访问一下就可以看 到效果了。 回过头来﹐asp语法输出一个DataSet的代码如下(Source可以在aspx.cs中设置为一个属性﹐然后从这里取)
  1. <%@ Import Namespace="System.Data" %>
  2. 2 <Worksheet ss:Name="<%=SheetName%>">
  3. 3  <Table>
  4. 4   <%
  5. 5       if (Source != null && Source.Tables.Count > 0 && Source.Tables[0].Rows.Count > 0)
  6. 6       {
  7. 7           foreach (DataRow dr in Source.Tables[0].Rows)
  8. 8           {
  9. 9               %>
  10. 10               <Row>
  11. 11               <%
  12. 12               foreach (object data in dr.ItemArray)
  13. 13               {
  14. 14                   %>
  15. 15                    <Cell><Data ss:Type="String"><%=data.ToString()%></Data></Cell>
  16. 16                   <%
  17. 17               }//end for each cell
  18. 18               %>
  19. 19               </Row>
  20. 20               <%
  21. 21           }//end for each row
  22. 22       }//end if Source is null
  23. 23       else
  24. 24       {
  25. 25       %>
  26. 26       <Row><Cell><Data ss:Type="String">sorry no data</Data></Cell></Row>
  27. 27       <%  
  28. 28       }
  29. 29   %>
  30. 30  </Table>
  31. 31 </Worksheet>
复制代码
呵呵﹐千万别把什么都放到<% %>来喽﹐否则﹐那些骂asp的人可能又有战场了。 只有与view有关的东西才到这里来,切记切记。 用这种方法﹐写文字文件可谓.. 三.asp.net也要隆重上场了。 asp.net多了一个东西,ascx﹐这个东西除了它的"常规用法"外﹐也有一些"歪门邪道"﹐看招﹕ aspx:
  1. <%@ Page Language="C#" AutoEventWireup="true"  
  2. 2CodeFile="ExcelExport.aspx.cs" Inherits="ExcelExport" %>
  3. 3<%@ Register Src="Sheet3.ascx" TagName="Sheet3" TagPrefix="uc2" %>
  4. 4<?xml version="1.0"?>
  5. 5<?mso-application progid="Excel.Sheet"?>
  6. 6<Workbook
  7. 7 xmlns="urn:schemas-microsoft-com:office:spreadsheet"
  8. 8 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
  9. 9<%
  10. 10for(int i=0;i<3;i++){
  11. 11%>
  12. 12<uc2:Sheet3 ID="Sheet3_1" SheetName="Sheet<%=(i+1)%>" runat="server" />
  13. 13<%
  14. 14}
  15. 15%>
  16. 16</Workbook>
复制代码
ascx:
  1. <Worksheet ss:Name="<%=SheetName%>">
  2. 2  <Table>
  3. 3   <Row>
  4. 4    <Cell><Data ss:Type="String">简单的sheet表页</Data></Cell>
  5. 5   </Row>
  6. 6  </Table>
  7. 7 </Worksheet>
复制代码
ascx.cs:
  1. string _sheetName = "default";
  2. 2
  3. 3    public string SheetName
  4. 4    {
  5. 5        get
  6. 6        {
  7. 7            return _sheetName;
  8. 8        }
  9. 9        set
  10. 10        {
  11. 11            _sheetName = value;
  12. 12        }
  13. 13    }
复制代码
出来就是三个sheet表喽﹐用这个东西﹐可是封装的好方法呀﹐如何发挥它的效果﹐大家可以发挥想象力... 最后﹐还是要说明一下这种方式的优缺点﹕ 优点﹕ 1简单﹐搭配asp.net的模板输出引擎﹐直接完成档案输出﹐不需要任何的I/O操作和额外进程资源。 2.兼容OpenOffice﹐ 一般的OpenOffice都支持此种格式﹐基本上不需要作任何修改(部分格式如自动筛选可能不支持) 3.对各种Sheet表格式的支持充分(如居中﹐框线﹐合并﹐金额数字﹐条件格式﹐排序﹐筛选等) 缺点﹕ 1.不支持Excel2003以下版本﹐如ExcelXP,Excel2000,Excel97 2.不能转出图表,图片 3.当Excel中的xml格式设置错误时﹐除错可能麻烦一些﹐但是Excel会提供出错log﹐根据经验﹐这个log还是基本上能指明出错点的 适用范围﹕在客户端是openoffice或基本能保证Excel2003﹐且报表一般都为固定格式(如财报)或只有数据输出的场合比较适用。 顺便说一句﹐我很少用什么水晶报表呀﹐reporting service呀﹐原因是我喜欢自 己管控一切﹐我的user很刁(曾经有一个﹐它就要在报表上就是对某个数字要求能够单击时﹐能alert一下﹐hello﹐你好)﹐但是我﹐呵呵... 不怕! 完整Demo 专案下载﹐浏览﹕ExcelExport.aspx 注﹕我的是繁体﹐如果出错﹐可以自己改一下
分享 转发
从此我不再仰脸看青天,不再低头看白水,只谨慎着我双双的脚步,我要一不一不踏在泥土上,打上深深的脚印!
TOP
沙发

好!解释的真的是挺全的25
TOP
发新话题 回复该主题