無插件,無com組件,利用EXCEL、WORD模板作數據導出(一)

  本次隨筆主要講述着工做中是如何解決數據導出的,對於數據導出到excel在平常工做中你們仍是比較經常使用的,那導出到word呢,改如何處理呢,簡單的頁面導出問題應該不大,可是若是是標準的公文導出呢,要保證其基本格式,如紅頭、擡頭、文號等等格式的限制咱們又該如何處理呢?app

主要原理:ui

一、利用excel、word作好模板,在模板中設置關鍵字spa

二、在程序中調用模板,替換關鍵字插件

三、將替換後的模板做爲導出文件輸出excel

1、導出到EXCEL,在此處先從簡單的入手,先描述如何利用excel作導出。步驟以下:code

一、用excel2007隨便建立一個excel文件,打開添加以下數據:xml

二、點擊另存,將excel文件另存爲xml格式文件,選擇2003xml格式,以下圖:blog

三、右鍵用記事本打開剛剛另存到xml文件,觀察xml內容會發現其妙之處,以下圖:圖片

  如上圖所示,注意觀察,每個WorkSheet都用了一段xml代碼來表示,方框部分爲咱們寫入的數據,圓圈部分爲咱們要處理的重要部分。內存

  小圓圈內的2表示當前數據2行,大圓圈表示咱們看到的三行三列數據,所以咱們要作的就是將咱們要導出到數據寫成圓圈中的格式就好了。

四、改進xml文件,建立關鍵字,以下圖:

  如上圖所示,咱們建立了兩個關鍵字,具體含義很少說。

  最後將建立好的xml文件,也就是你的excel模板能夠放入到項目中了,接下來要作的就是將數據生成並按照標準格式輸出,進行替換關鍵字便可。

五、數據生成並輸出,以下所示:

public byte[] GetData(string path, string tempName)
        {
            //實例化內存流
            MemoryStream fileStream = new MemoryStream();
            //寫文件流
            StreamWriter fileWriter = new StreamWriter(fileStream);
            //讀文件流
            StreamReader fileReader = new StreamReader(path, System.Text.Encoding.UTF8);
            //讀取整個文件的內容
            string tempStr = fileReader.ReadToEnd();
            //獲得要導出的信息
            DataTable dt = airport.GetDataView();
            //定義變量獲取表的數據行數
            int rows = 0;
            //定義StringBuilder變量來存儲字符串
            StringBuilder sb = new StringBuilder();
            //判斷表是否有數據
            if (dt != null && dt.Rows.Count > 0)
            {
                //給變量賦值
                rows = dt.Rows.Count;
                int num = rows + 1;//此處1表示模板中表頭的行數,且默認爲1,可自行增長表頭並定義
                if (tempStr.IndexOf("+#RowCount#+") > 0)
                {
                    tempStr = tempStr.Replace("+#RowCount#+", "" + num + "");
                }
                //開始循環生成標準字符串
                for (int i = 0; i < rows; i++)
                {
                    sb.Append("<Row>\n"
                        + "<Cell><Data ss:Type=\"String\">" + dt.Rows[i]["Name"] + "</Data></Cell>\n"
                        + "<Cell><Data ss:Type=\"String\">" + dt.Rows[i]["Sex"] + "</Data></Cell>\n"
                        + "<Cell><Data ss:Type=\"String\">" + dt.Rows[i]["Age"] + "</Data></Cell>\n"
                        + "</Row>\n");
                }
                if (tempStr.IndexOf("+%Data%+") > 0)
                {
                    tempStr = tempStr.Replace("+%Data%+", sb.ToString());
                }
            }
            fileWriter.WriteLine(tempStr);
            fileWriter.Flush();

            byte[] bytes = fileStream.ToArray();

            fileStream.Close();
            fileWriter.Close();
            fileReader.Close();

            return bytes;
        }

如上所示,建立獲取數據,並返回咱們要輸出的字符串,並轉成二進制流,具體操做因人而異。接下來調用此方法替換數據,並輸出excel新文件。

protected void btnExport_Click(object sender, EventArgs e)
        {
            byte[] bytes = GetData(Server.MapPath("xml模板的路徑"), "");

            //實現下載
            Response.AddHeader("Content-Type", "application/octet-stream");
            Response.Buffer = true;
            Response.ContentType = "*/*";
            Response.AddHeader("Content-Disposition", "attachment;filename=" + System.Web.HttpUtility.UrlEncode("導出的文件.xls", System.Text.Encoding.UTF8));
            Response.AddHeader("Content-Length", bytes.Length.ToString());
            Response.BinaryWrite(bytes);
            Response.End();

        }

總上所述,一個完成的數據導出到EXCEL就完成了。
優勢:

一、能夠導出任何你能夠在excel中能模擬出來的數據樣式,包括圖形嵌入。在後一篇會講解如何導出圖片到excel,word。

二、整個過程不復雜,不須要調用插件、office組件,BS或者CS模式的方式都適用,沒有複雜的邏輯過程。

三、解決多sheet導出數據。

缺點:須要先作模板

注意事項:模板中的關鍵字要根據數據內容而定,不要出現關鍵字衝突的狀況,關鍵字字符標準由開發者自行定奪。

下一篇介紹如何導出數據到word,這個導出就相對複雜一些,可是原理一致,重點是圖片導出到word中是什麼原理。

相關文章
相關標籤/搜索