轉Excel的一種簡單方法

寫了這么久的程序﹐越來越喜歡那種簡單的解決方法﹐這段時間在做一個報表系統﹐其中有需要轉Excel﹐而且要求兼容openoffice﹐遂利用asp語法,asp.net的控件封裝特性以及excel 2003xml試算清格式做了一個看起來比較"清爽"excel轉檔方案。

?

.開始

?

原理很簡單﹐excel2003增加了一種xml電子表格的格式﹐如下﹕

?1None.gif<?xml?version="1.0"?>
?2None.gif<?mso-application?progid="Excel.Sheet"?>
?3None.gif<Workbook
?4None.gif?xmlns="urn:schemas-microsoft-com:office:spreadsheet"
?5None.gif?xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
?6None.gif?<Worksheet?ss:Name="Sheet1">
?7None.gif??<Table>
?8None.gif???<Row>
?9None.gif?????<Cell?ss:MergeAcross="1"><Data?ss:Type="String">Excel?xml</Data></Cell>
10None.gif???</Row>
11None.gif???<Row>
12None.gif????<Cell><Data?ss:Type="String">A2</Data></Cell>
13None.gif????<Cell><Data?ss:Type="Number">0.112</Data></Cell>
14None.gif???</Row>
15None.gif??</Table>
16None.gif?</Worksheet>
17None.gif</Workbook>

將這段代碼存成xmlxls的后綴﹐excel都能正確打開﹐當然openoffice則只能存成xml的后綴。

?

因此我們只要輸出一個這樣的文字文件就行。

?

但是如果要I/O操作﹐寫一個這樣的文字文件出來﹐還是比較煩瑣的﹐因此直接利用aspx的特性:

?

aspx.cs中寫到﹕

1None.gif??protected?void?Page_Load(object?sender,?EventArgs?e)
2ExpandedBlockStart.gifContractedBlock.gif????dot.gif{
3InBlock.gif?????????Response.Clear();
4InBlock.gif????????Response.ContentType?=?"application/vnd.ms-excel";
5InBlock.gif????????string?excelname?=?"ExcelReport";?????
6InBlock.gif????????Response.AddHeader("content-disposition",?"attachment;?filename="?+?System.Web.HttpUtility.UrlEncode(excelname,?System.Text.Encoding.UTF8)?+?".xml");
7ExpandedBlockEnd.gif????}

8None.gif

?

而在aspx中則只要填入上上面那段代碼﹐當然<%@ Page Language="C#"

AutoEventWireup="true" CodeFile="ExcelExport.aspx.cs" Inherits="ExcelExport" %>不要忘嘍﹐這樣在直接訪問aspx時﹐就能夠下載一個excel檔案了。

.模板語言

盡管asp<%語法被很多人詬病﹐說是意大利面條﹐其實任何技朮都有其適用范圍﹐只要心中有刀...

?

asp<%=%><% %>很適于UI的制作﹐可能有些TX沒有接觸過asp﹐簡單講一下﹐在aspx文件中是可以直接寫代碼的﹐不要類﹐方法﹐就是順序執行﹐如

1ExpandedBlockStart.gifContractedBlock.gif<%dot.gif
2ExpandedBlockEnd.gifDateTime?now?=?DateTime.Now;
3None.gif
%>
4None.gif你好﹐現在是<%=now.ToString("yyyy/MM/dd?HH:mm:ss")%>



這樣就完成了一個動態的頁面。將上面的代碼存成一個aspx﹐訪問一下就可以看

到效果了。

?

回過頭來﹐asp語法輸出一個DataSet的代碼如下(Source可以在aspx.cs中設置為一個屬性﹐然后從這里取)

?1ExpandedBlockStart.gifContractedBlock.gif<%dot.gif@?Import?Namespace="System.Data"?%>
?2None.gif?<Worksheet?ss:Name="<%=SheetName%>">
?3None.gif??<Table>
?4ExpandedBlockStart.gifContractedBlock.gif???<%dot.gif
?5InBlock.gif???????if?(Source?!=?null?&&?Source.Tables.Count?>?0?&&?Source.Tables[0].Rows.Count?>?0)
?6InBlock.gif???????{
?7InBlock.gif???????????foreach?(DataRow?dr?in?Source.Tables[0].Rows)
?8InBlock.gif???????????{
?9ExpandedBlockEnd.gif???????????????
%>
10None.gif???????????????<Row>
11ExpandedBlockStart.gifContractedBlock.gif???????????????<%dot.gif
12InBlock.gif???????????????foreach?(object?data?in?dr.ItemArray)
13InBlock.gif???????????????{
14ExpandedBlockEnd.gif???????????????????
%>
15None.gif????????????????????<Cell><Data?ss:Type="String"><%=data.ToString()%></Data></Cell>
16ExpandedBlockStart.gifContractedBlock.gif???????????????????<%dot.gif
17InBlock.gif???????????????}//end?for?each?cell
18ExpandedBlockEnd.gif???????????????
%>
19None.gif???????????????</Row>
20ExpandedBlockStart.gifContractedBlock.gif???????????????<%dot.gif
21InBlock.gif???????????}//end?for?each?row
22InBlock.gif???????}//end?if?Source?is?null
23InBlock.gif???????else
24InBlock.gif???????{
25ExpandedBlockEnd.gif???????
%>
26None.gif???????<Row><Cell><Data?ss:Type="String">sorry?no?datadot.gif</Data></Cell></Row>
27ExpandedBlockStart.gifContractedBlock.gif???????<%dot.gif???
28InBlock.gif???????}
29ExpandedBlockEnd.gif???
%>
30None.gif??</Table>
31None.gif?</Worksheet>

呵呵﹐千萬別把什么都放到<% %>來嘍﹐否則﹐那些罵asp的人可能又有戰場了。

只有與view有關的東西才到這里來,切記切記。

?

?

用這種方法﹐寫文字文件可謂..

.asp.net也要隆重上場了。

asp.net多了一個東西,ascx﹐這個東西除了它的"常規用法"外﹐也有一些"歪門邪"﹐看招﹕

?

aspx:

?1ExpandedBlockStart.gifContractedBlock.gif<%dot.gif@?Page?Language="C#"?AutoEventWireup="true"??
?2ExpandedBlockEnd.gifCodeFile="ExcelExport.aspx.cs"?Inherits="ExcelExport"?
%>
?3ExpandedBlockStart.gifContractedBlock.gif<%dot.gif@?Register?Src="Sheet3.ascx"?TagName="Sheet3"?TagPrefix="uc2"?%>
?4None.gif<?xml?version="1.0"?>
?5None.gif<?mso-application?progid="Excel.Sheet"?>
?6None.gif<Workbook
?7None.gif?xmlns="urn:schemas-microsoft-com:office:spreadsheet"
?8None.gif?xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
?9ExpandedBlockStart.gifContractedBlock.gif<%dot.gif
10ExpandedBlockEnd.giffor(int?i=0;i<3;i++){
11None.gif
%>
12None.gif<uc2:Sheet3?ID="Sheet3_1"?SheetName="Sheet<%=(i+1)%>"?runat="server"?/>
13ExpandedBlockStart.gifContractedBlock.gif<%dot.gif
14ExpandedBlockEnd.gif}
15None.gif
%>
16None.gif</Workbook>

ascx:

1None.gif<Worksheet?ss:Name="<%=SheetName%>">
2None.gif??<Table>
3None.gif???<Row>
4None.gif????<Cell><Data?ss:Type="String">簡單的sheet表頁</Data></Cell>
5None.gif???</Row>
6None.gif??</Table>
7None.gif?</Worksheet>



ascx.cs:

?1None.gifstring?_sheetName?=?"default";
?2None.gif
?3None.gif????public?string?SheetName
?4ExpandedBlockStart.gifContractedBlock.gif????dot.gif{
?5InBlock.gif????????get
?6ExpandedSubBlockStart.gifContractedSubBlock.gif????????dot.gif{
?7InBlock.gif????????????return?_sheetName;
?8ExpandedSubBlockEnd.gif????????}

?9InBlock.gif????????set
10ExpandedSubBlockStart.gifContractedSubBlock.gif????????dot.gif{
11InBlock.gif????????????_sheetName?=?value;
12ExpandedSubBlockEnd.gif????????}

13ExpandedBlockEnd.gif????}

出來就是三個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

注﹕我的是繁體﹐如果出錯﹐可以自己改一下

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/276177.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/276177.shtml
英文地址,請注明出處:http://en.pswp.cn/news/276177.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

詳解MySQL中EXPLAIN解釋命令

轉載鏈接&#xff1a;http://database.51cto.com/art/200912/168453.htm explain顯示了mysql如何使用索引來處理select語句以及連接表。可以幫助選擇更好的索引和寫出更優化的查詢語句。 使用方法&#xff0c;在select語句前加上explain就可以了&#xff1a; 如&#xff1a;…

Shell編程基礎

我們可以使用任意一種文字編輯器&#xff0c;比如gedit、kedit、emacs、vi等來編寫shell腳本&#xff0c;它必須以如下行開始&#xff08;必須放在文件的第一行&#xff09;&#xff1a; # !/bin/sh ...注意&#xff1a;最好使用“!/bin/bash”而不是“!/bin/sh”&#xff0c;…

總結:自學前端的高效學習路線

提到前端&#xff0c;大多數人都會想到薪資高。也正因為如此&#xff0c;很多人想要從事前端開發這個崗位&#xff0c;也由此衍生出來一個問題&#xff1a;為什么前端工程師供不應求&#xff0c;但還是有很多學前端的人找不到工作&#xff1f;其實行業不是缺前端工程師&#xf…

機器人出魔切還是三相_英雄聯盟:輔助也要去上單,機器人布里茨玩法介紹

英雄聯盟&#xff1a;輔助也要去上單&#xff0c;機器人布里茨玩法介紹出裝方面我們都知道他的被動是可以將法力值化為機的護盾的&#xff0c;而這樣的話裝備就可以選擇魔切&#xff0c;然后再出一個鞋子&#xff0c;為什么不先出三項呢&#xff1f;三項的性價比是比較高的&…

vmware創建虛擬機不識別網卡

今天在給虛擬機添加網卡的時候&#xff0c;出現了虛擬機不識別新加的網卡&#xff0c;很納悶&#xff0c;連的一樣的端口組&#xff0c;為什么新加的網卡識別不了呢 然后查看pci設備&#xff0c;發現網卡的驅動為 AMD 79C970 PCnet32- LANCE 然后都vc上查看&#xff0c;果真驅動…

轉:26個Jquery使用小技巧(jQuery tips, tricks solutions)

26個Jquery使用小技巧(jQuery tips, tricks & solutions) 前段時間發布了Jquery類庫1.4版本&#xff0c;使用者也越來越多&#xff0c;為了方便大家對Jquery的使用&#xff0c;下面列出了一些Jquery使用技巧。比如有禁止右鍵點擊、隱藏搜索文本框文字、在新窗口中打開鏈接…

周末包郵送書和小紅包中獎名單公布

大家好&#xff0c;我是若川。周末送福利&#xff0c;給大家送紅包、包郵送新書&#xff01;這篇文章中&#xff0c;準備了3本自選前端新書&#xff0c;10個2元小紅包&#xff0c;在看抽10人每人5元紅包&#xff0c;2月28日晚8點開獎。現將名單公布如下&#xff1a;在看抽獎&am…

Ubuntu 命令行修改網絡配置方法

轉載鏈接&#xff1a;http://www.jb51.net/article/15807.htm Ubuntu 命令行修改網絡配置方法 /etc/network/interfaces 打開后里面可設置DHCP或手動設置靜態ip。前面auto eth0&#xff0c;讓網卡開機自動掛載. 1. 以DHCP方式配置網卡 編輯文件/etc/network/interfaces: sudo v…

python treeview底部加個按鈕_Python爬取京東商品信息(GUI版本)

前言本文的文字及圖片來源于網絡,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯系我們以作處理。作者&#xff1a;DYblog轉載&#xff1a;https://www.cnblogs.com/dy8888/p/13257918.htmlPS&#xff1a;如有需要Python學習資料的小伙伴可以加點擊…

Linux下編譯安裝Mysql簡單步驟

常規方式編譯安裝MySQL時&#xff0c;適合用第一條最正宗的MySQL產品線5.2及以前版本&#xff1a;所謂常規方式編譯安裝MySQL就是延續早期MySQL的3部曲安裝方式&#xff0c;即./configure;make;make install&#xff0c;下面是老男孩在早期的企業生產場景下操作過的具體命令及參…

Vue.js 3.0 響應式 API 比 2.x 好在哪兒?

Hello&#xff0c;各位小伙伴&#xff0c;接下來的一段時間里&#xff0c;我會把我的課程《Vue.js 3.0 核心源碼解析》中問題的答案陸續在我的公眾號發布&#xff0c;由于課程的問題大多數都是開放性的問題&#xff0c;所以我的答案也不一定是標準的&#xff0c;僅供你參考喔。…

招聘.NET程序員

人才難找啊&#xff0c;順便發個招聘啟事。 西安瀚博科技有限公司招聘.NET程序員&#xff0c;有工作經驗者優先 如有意向&#xff0c;請發郵件到 slzhanghiweb.cn 轉載于:https://www.cnblogs.com/shengli/archive/2010/03/08/1680861.html

xml解析類

轉載鏈接&#xff1a;http://zyan.cc/post/253 今天在PHP4環境下重新寫一個接口程序&#xff0c;需要大量分析解析XML&#xff0c;PHP的xml_parse_into_struct()函數不能直接生成便于使用的數組&#xff0c;而SimpleXML擴展在PHP5中才支持&#xff0c;于是逛逛搜索引擎&#x…

jmeter學習指南之聚合報告

jmeter視頻地址&#xff1a;https://edu.51cto.com/course/14305.html 上一篇文章中我們講了Jmeter結果分析最常用的一個Listener查看結果樹&#xff0c;今天接著講另一個最常用的listener--聚合報告Aggregate Report。我們先來看看聚合報告中的主要名稱的含意&#xff1a;Labe…

敏捷開發概述

敏捷方法強調適應性而非預見性。 目前列入敏捷方法的有&#xff1a; 軟件開發節奏&#xff0c;Software Development Rhythms 敏捷數據庫技術&#xff0c;AD/Agile Database Techniques 敏捷建模&#xff0c;AM/Agile Modeling 自適應軟件開發&#xff0c;ASD/Adaptive Softwar…

2021 整理的最全學習資源,送給每一個努力著的人

時間來到了 2021 年&#xff0c;新的一年有新的期待&#xff0c;而我亦有新的祝福如果說在過去的一年&#xff0c;經歷太多&#xff0c;心酸、迷茫、焦慮、幸福、喜悅那么在 2021 年&#xff0c;希望你可以去過一種遇見自己的生活&#xff0c;恬淡、熱情&#xff0c;喜歡自己而…

ubuntu+php環境下的Memcached 安裝方法

轉載鏈接&#xff1a;http://www.jb51.net/article/28887.htm Memcached是一套分散式的高速緩存系統&#xff0c;當初是Danga Interactive為了LiveJournal所發展。 目前被很多系統所使用&#xff0c;例如Flick、Twitter等。這是一套開放源代碼軟件&#xff0c;以BSD license授…

php移動簽批源碼_PHP讓網站移動訪問更加友好方法

PHP都是在服務器上處理的&#xff0c;所以當代碼到達用戶時&#xff0c;它只是HTML。基本上&#xff0c;用戶從你的服務器請求你網站的一個頁面&#xff0c;然后你的服務器運行所有的PHP并向用戶發送PHP的結果。設備實際上從未看到或必須使用實際的PHP代碼。這使得使用PHP完成的…

Chrome OS 設備或將允許用戶自行選擇 Linux 發行版

百度智能云 云生態狂歡季 熱門云產品1折起>>> 谷歌去年宣布在 Chrome OS 上支持運行 Linux 應用&#xff0c;前不久又有消息稱其將為運行這些 Linux 應用提供 GPU 加速支持&#xff0c;而現在&#xff0c;Chrome OS 似乎將在 Linux 的方向上更進一步&#xff0c;讓 …

博文視點 OpenParty第11期:世界黑客大會那些事

博文視點 OpenParty第11期&#xff1a;世界黑客大會那些事 親愛的讀者朋友&#xff1a; 您好&#xff01; 2009年&#xff0c;博文視點Open Party共舉辦8場&#xff0c;累計到場2000人次&#xff0c;影響力輻射近5000人次&#xff0c;真正實現了博文視點Open Party的初…