轉Excel的一種簡單方法
寫了這么久的程序﹐越來越喜歡那種簡單的解決方法﹐這段時間在做一個報表系統﹐其中有需要轉Excel﹐而且要求兼容openoffice﹐遂利用asp語法,asp.net的控件封裝特性以及excel 2003的xml試算清格式做了一個看起來比較"清爽"的excel轉檔方案。
?
一.開始
?
原理很簡單﹐excel2003增加了一種xml電子表格的格式﹐如下﹕
?2<?mso-application?progid="Excel.Sheet"?>
?3<Workbook
?4?xmlns="urn:schemas-microsoft-com:office:spreadsheet"
?5?xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
?6?<Worksheet?ss:Name="Sheet1">
?7??<Table>
?8???<Row>
?9?????<Cell?ss:MergeAcross="1"><Data?ss:Type="String">Excel?xml</Data></Cell>
10???</Row>
11???<Row>
12????<Cell><Data?ss:Type="String">A2</Data></Cell>
13????<Cell><Data?ss:Type="Number">0.112</Data></Cell>
14???</Row>
15??</Table>
16?</Worksheet>
17</Workbook>
將這段代碼存成xml或xls的后綴﹐excel都能正確打開﹐當然openoffice則只能存成xml的后綴。
?
因此我們只要輸出一個這樣的文字文件就行。
?
但是如果要I/O操作﹐寫一個這樣的文字文件出來﹐還是比較煩瑣的﹐因此直接利用aspx的特性:
?
在aspx.cs中寫到﹕
2????{
3?????????Response.Clear();
4????????Response.ContentType?=?"application/vnd.ms-excel";
5????????string?excelname?=?"ExcelReport";?????
6????????Response.AddHeader("content-disposition",?"attachment;?filename="?+?System.Web.HttpUtility.UrlEncode(excelname,?System.Text.Encoding.UTF8)?+?".xml");
7????}
8
?
而在aspx中則只要填入上上面那段代碼﹐當然<%@ Page Language="C#"
AutoEventWireup="true" CodeFile="ExcelExport.aspx.cs" Inherits="ExcelExport" %>不要忘嘍﹐這樣在直接訪問aspx時﹐就能夠下載一個excel檔案了。
二.模板語言
盡管asp的<%語法被很多人詬病﹐說是意大利面條﹐其實任何技朮都有其適用范圍﹐只要心中有刀...
?
asp的<%=%>和<% %>很適于UI的制作﹐可能有些TX沒有接觸過asp﹐簡單講一下﹐在aspx文件中是可以直接寫代碼的﹐不要類﹐方法﹐就是順序執行﹐如
1<%2DateTime?now?=?DateTime.Now;
3%>
4你好﹐現在是<%=now.ToString("yyyy/MM/dd?HH:mm:ss")%>
這樣就完成了一個動態的頁面。將上面的代碼存成一個aspx﹐訪問一下就可以看
到效果了。
?
回過頭來﹐asp語法輸出一個DataSet的代碼如下(Source可以在aspx.cs中設置為一個屬性﹐然后從這里取)﹕
?2?<Worksheet?ss:Name="<%=SheetName%>">
?3??<Table>
?4???<%
?5???????if?(Source?!=?null?&&?Source.Tables.Count?>?0?&&?Source.Tables[0].Rows.Count?>?0)
?6???????{
?7???????????foreach?(DataRow?dr?in?Source.Tables[0].Rows)
?8???????????{
?9???????????????%>
10???????????????<Row>
11???????????????<%
12???????????????foreach?(object?data?in?dr.ItemArray)
13???????????????{
14???????????????????%>
15????????????????????<Cell><Data?ss:Type="String"><%=data.ToString()%></Data></Cell>
16???????????????????<%
17???????????????}//end?for?each?cell
18???????????????%>
19???????????????</Row>
20???????????????<%
21???????????}//end?for?each?row
22???????}//end?if?Source?is?null
23???????else
24???????{
25???????%>
26???????<Row><Cell><Data?ss:Type="String">sorry?no?data</Data></Cell></Row>
27???????<%???
28???????}
29???%>
30??</Table>
31?</Worksheet>
呵呵﹐千萬別把什么都放到<% %>來嘍﹐否則﹐那些罵asp的人可能又有戰場了。
只有與view有關的東西才到這里來,切記切記。
?
?
用這種方法﹐寫文字文件可謂..三.asp.net也要隆重上場了。
asp.net多了一個東西,ascx﹐這個東西除了它的"常規用法"外﹐也有一些"歪門邪道"﹐看招﹕
?
aspx:
?2CodeFile="ExcelExport.aspx.cs"?Inherits="ExcelExport"?%>
?3<%@?Register?Src="Sheet3.ascx"?TagName="Sheet3"?TagPrefix="uc2"?%>
?4<?xml?version="1.0"?>
?5<?mso-application?progid="Excel.Sheet"?>
?6<Workbook
?7?xmlns="urn:schemas-microsoft-com:office:spreadsheet"
?8?xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
?9<%
10for(int?i=0;i<3;i++){
11%>
12<uc2:Sheet3?ID="Sheet3_1"?SheetName="Sheet<%=(i+1)%>"?runat="server"?/>
13<%
14}
15%>
16</Workbook>
ascx:
1<Worksheet?ss:Name="<%=SheetName%>">2??<Table>
3???<Row>
4????<Cell><Data?ss:Type="String">簡單的sheet表頁</Data></Cell>
5???</Row>
6??</Table>
7?</Worksheet>
ascx.cs:
?2
?3????public?string?SheetName
?4????{
?5????????get
?6????????{
?7????????????return?_sheetName;
?8????????}
?9????????set
10????????{
11????????????_sheetName?=?value;
12????????}
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
注﹕我的是繁體﹐如果出錯﹐可以自己改一下
總結
以上是生活随笔為你收集整理的轉Excel的一種簡單方法的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 前端学习(3274):js中this的使
- 下一篇: Axure教程:淘宝商品图片放大效果
