zoukankan      html  css  js  c++  java
  • ASP.NET中将检索出的数据写入Exel形成Report的一种solution

    关键词:DataSet,DataTable, DataBase, Excel, Report
    正文:
        在基于web的MIS中,经常需要将从DataBase检索出的数据形成报表。而Exel报表在公司尤为常见。在.net Framework下,检索出的数据保存至DataSet或者DataTable是最常见的方法了。那么,如何将DataSet或DataTable中保存的内存数据写入Excel呢?
            可以采用一个比较愚蠢stupid的方法:将数据按照自定义的style,方便写入Excel。将Excel文件保存为spreadsheet XML格式即可。
        一般来说,数据写入到Excel文件分为3部分,Excel head file , Excel Data file, Excel footer file.将其3者合并在一起就形成了一个完整的Excel文件
    代码如下:

    using System;
    using System.Data;
    using System.Configuration;
    using System.Linq;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.HtmlControls;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Xml.Linq;
    using System.IO;
    //using System.

    /// <summary>
    /// Summary description for FileOperation
    /// </summary>
    /// 


    namespace Intern.File
    {
        
    /// <summary>
        
    /// this class is desgned to manipulate file, such as excel, text etc.
        
    /// designed by:He Ren Gang
        
    /// designed Date:2008/4/30
        
    /// </summary>


        
    ///Base Interface, for other concrete class to implement it, 
        
    ///such as excelClass,textClass

        public interface IFileOperation
        
    {
            
    string FileName get; }
            
    string FullPathName get; }
            
    void CreateFileHeader(string  byWho);
            
    void SaveData(DataTable dt);
            
    void CreateFooter();
        }

        
    public enum ExelSaveType
        
    {
            TYPE1,
            TYPE2,
            TYPE3
        }


        
    /// <summary>
        
    /// ExcelFileOperation Class, mainly Operates for  Excel file.
        
    /// </summary>

        public class ExcelFileOperation:IFileOperation
        
    {
         
            
    private StreamWriter sw;
            
    private string _fileName;
            
    private string _fullPathName;
            
            
    public string FileName
            
    {
                
    get
                
    {
                    _fileName 
    = DateTime.Now.Year.ToString() +
                                       DateTime.Now.Month.ToString() 
    +
                                       DateTime.Now.Day.ToString() 
    +
                                       DateTime.Now.Minute.ToString() 
    +
                                       DateTime.Now.Second.ToString();

                    _fileName 
    += ".xls";
                    
    return _fileName;
                }

            }


            
    public string FullPathName
            
    {
                
    get
                
    {
                    
    if (!Directory.Exists(HttpContext.Current.Server.MapPath("BugReports")))
                        Directory.CreateDirectory(HttpContext.Current.Server.MapPath(
    "BugReports"));

                    _fullPathName 
    = HttpContext.Current.Server.MapPath(@"BugReports\" + _fileName);
                    
    return _fullPathName;
                }


            }


            
    public ExcelFileOperation()
            
    {
                _fileName 
    = FileName;
                _fullPathName 
    = FullPathName;
            }



            
    /// <summary>
            
    /// functionality:
            
    /// write the XML spread sheet head information to specified filename , mainly includes the representation format,
            
    /// font, size, color, and column name etc.
            
    ///author:He ren gang
            
    ///completed time:2008/4/30
            
    /// </summary>
            
    /// <param name="filename"></param>
            
    /// <param name="byWho"></param>

            public void CreateFileHeader(string byWho)
            
    {
                FileInfo file 
    = new FileInfo(_fullPathName);
                sw 
    = new StreamWriter(_fullPathName);
                sw.WriteLine(
    @"<?xml version='1.0'?>
        <?mso-application progid='Excel.Sheet'?>
        <Workbook xmlns='urn:schemas-microsoft-com:office:spreadsheet'
        xmlns:o='urn:schemas-microsoft-com:office:office'
        xmlns:x='urn:schemas-microsoft-com:office:excel'
        xmlns:ss='urn:schemas-microsoft-com:office:spreadsheet'
        xmlns:html='http://www.w3.org/TR/REC-html40'>
        <DocumentProperties xmlns='urn:schemas-microsoft-com:office:office'>
        <Author>Renggang He</Author>
        <LastAuthor>Renggang He</LastAuthor>
        <Created>2008-04-30T04:46:02Z</Created>
        <Company>Microsoft</Company>
        <Version>12.00</Version>
        </DocumentProperties>
        <ExcelWorkbook xmlns='urn:schemas-microsoft-com:office:excel'>
        <WindowHeight>4695</WindowHeight>
        <WindowWidth>11280</WindowWidth>
        <WindowTopX>120</WindowTopX>
        <WindowTopY>75</WindowTopY>
        <ProtectStructure>False</ProtectStructure>
        <ProtectWindows>False</ProtectWindows>
        </ExcelWorkbook>
        <Styles>
        <Style ss:ID='Default' ss:Name='Normal'>
        <Alignment ss:Vertical='Bottom'/>
        <Borders/>
        <Font ss:FontName='Calibri' x:Family='Swiss' ss:Size='11' ss:Color='#000000'/>
        <Interior/>
        <NumberFormat/>
        <Protection/>
        </Style>
        <Style ss:ID='s63'>
       <Alignment ss:Vertical='Bottom'/>
       <Font ss:FontName='Arial Black' x:Family='Swiss' ss:Size='11' ss:Color='#000000'/>
        </Style>
        <Style ss:ID='s65'>
        <Alignment ss:Vertical='Bottom'/>
       <Font ss:FontName='Arial Black' x:Family='Swiss' ss:Size='10' ss:Color='#006699'/>
        </Style>
        <Style ss:ID='s66'>
       <Alignment ss:Horizontal='Center' ss:Vertical='Bottom'/>
       <Font ss:FontName='Arial' x:Family='Swiss' ss:Size='11' ss:Color='#000000'/>
       <NumberFormat/>
       </Style>
      <Style ss:ID='s67'>
       <Alignment ss:Horizontal='Center' ss:Vertical='Bottom'/>
      </Style>
      <Style ss:ID='s68'>
       <Alignment ss:Horizontal='Center' ss:Vertical='Bottom'/>
       <NumberFormat ss:Format='Short Date'/>
      </Style>
     <Style ss:ID='s69'>
       <Alignment ss:Horizontal='Center' ss:Vertical='Bottom'/>
       <Font ss:FontName='Calibri' x:Family='Swiss' ss:Size='11' ss:Color='#FF0000'/>
      </Style>
    <Style ss:ID='s70'>
       <Alignment ss:Horizontal='Center' ss:Vertical='Bottom'/>
       <Font ss:FontName='Calibri' x:Family='Swiss' ss:Size='11' ss:Color='#538ED5'/>
      </Style>
      </Styles>
     <Worksheet ss:Name='Sheet1'>
      <Table ss:ExpandedColumnCount='11'  x:FullColumns='1'
       x:FullRows='1' ss:DefaultRowHeight='15'>
       <Column ss:AutoFitWidth='0' ss:Width='29.25'/>
       <Column ss:AutoFitWidth='0' ss:Width='60'/>
       <Column ss:Index='4' ss:AutoFitWidth='0' ss:Width='57.75'/>
       <Column ss:AutoFitWidth='0' ss:Width='95.25'/>
       <Column ss:AutoFitWidth='0' ss:Width='78.75'/>
       <Column ss:Index='8' ss:AutoFitWidth='0' ss:Width='83.25'/>
       <Column ss:AutoFitWidth='0' ss:Width='57.75'/>
       <Column ss:AutoFitWidth='0' ss:Width='95.25'/>
       <Column ss:AutoFitWidth='0' ss:Width='91.5'/>
       <Row ss:AutoFitHeight='0' ss:Height='18.75'>
        <Cell ss:Index='4' ss:MergeAcross='1' ss:StyleID='s63'><Data ss:Type='String'>BUGS REPORTS</Data></Cell>
       </Row>
       <Row ss:AutoFitHeight='0'>
        <Cell ss:Index='5' ss:MergeAcross='1' ss:StyleID='s65'><Data ss:Type='String'>Generated Time:
    " + DateTime.Now.ToShortDateString()+@"</Data></Cell>
        <Cell ss:StyleID='s65'><Data ss:Type='String'>Reporter:
    " + byWho + @"</Data></Cell>
       </Row>
       <Row ss:AutoFitHeight='0'>
        <Cell ss:StyleID='s66'><Data ss:Type='String'>ID</Data></Cell>
        <Cell ss:StyleID='s66'><Data ss:Type='String'>Description</Data></Cell>
        <Cell ss:StyleID='s66'><Data ss:Type='String'>Project</Data></Cell>
        <Cell ss:StyleID='s66'><Data ss:Type='String'>Category</Data></Cell>
        <Cell ss:StyleID='s66'><Data ss:Type='String'>Reported By</Data></Cell>
        <Cell ss:StyleID='s66'><Data ss:Type='String'>Reported On</Data></Cell>
        <Cell ss:StyleID='s66'><Data ss:Type='String'>Priority</Data></Cell>
        <Cell ss:StyleID='s66'><Data ss:Type='String'>Assigned To</Data></Cell>
        <Cell ss:StyleID='s66'><Data ss:Type='String'>Status</Data></Cell>
        <Cell ss:StyleID='s66'><Data ss:Type='String'>Last Updated By</Data></Cell>
        <Cell ss:StyleID='s66'><Data ss:Type='String'>Last Updated On</Data></Cell>
       </Row>
    ");
            }


            
    /// <summary>
            
    /// functinality: save the data from DataTable to the spreedsheet XML file,
            
    ///                 which will be saved as EXCEl File suffixed with .xls;
            
    ///comments: the data format is defined by the spreedsheet head file that has written into relevant file prio.
            
    ///author:He RenGang
            
    ///completed time:2008/4/30
            
    /// </summary>
            
    /// <param name="dt"></param>

          public void SaveData(DataTable dt)
            
    {
              
                
    for (int i =  dt.Rows.Count-1; i >=0; i--)
                
    {
                    sw.WriteLine(
    @"<Row ss:AutoFitHeight='0'>");
                    
    for (int j = 0; j < dt.Columns.Count; j++)
                    
    {
                        
    string stype = GetStyleString(dt.Rows[i][8].ToString());
                        
                        sw.WriteLine(
    @"<Cell ss:StyleID='" + stype + "'><Data ss:Type='String'>" + dt.Rows[i][j].ToString() + "</Data></Cell>");
                                  
                    }
     
                    sw.WriteLine(
    @"</Row>");
                }
                
            }


           
            
    /// <summary>
            
    /// currrently: I define such Style .
            
    /// if type is New --> Red color :s79
            
    /// if type is ReOpen-->Blue color:s70
            
    /// others  -->default color
            
    /// </summary>
            
    /// <param name="BugType"></param>
            
    /// <returns></returns>

          private string GetStyleString(string BugType)
          
    {
              
    if (BugType.ToLower()== "new")
                  
    return "s69";
              
    else if (BugType == "re-opened")
                  
    return "s70";
              
    else
                  
    return "s67";

          }



            
    /// <summary>
            
    /// functionality:continue to write the spreedsheet footer into specified file that will be saved as Excel File.
            
    /// completed time:2008/4/30;
            
    /// author:He RenGang
            
    /// </summary>

            public void CreateFooter()
            
    {
                sw.WriteLine(
    @"</Table>
      <WorksheetOptions xmlns='urn:schemas-microsoft-com:office:excel'>
       <PageSetup>
        <Header x:Margin='0.3'/>
        <Footer x:Margin='0.3'/>
        <PageMargins x:Bottom='0.75' x:Left='0.7' x:Right='0.7' x:Top='0.75'/>
       </PageSetup>
       <Unsynced/>
       <Selected/>
       <LeftColumnVisible>1</LeftColumnVisible>
       <Panes>
        <Pane>
         <Number>3</Number>
         <ActiveRow>6</ActiveRow>
         <ActiveCol>5</ActiveCol>
        </Pane>
       </Panes>
       <ProtectObjects>False</ProtectObjects>
       <ProtectScenarios>False</ProtectScenarios>
      </WorksheetOptions>
     </Worksheet>
     <Worksheet ss:Name='Sheet2'>
      <Table ss:ExpandedColumnCount='1' ss:ExpandedRowCount='1' x:FullColumns='1'
       x:FullRows='1' ss:DefaultRowHeight='15'>
       <Row ss:AutoFitHeight='0'/>
      </Table>
      <WorksheetOptions xmlns='urn:schemas-microsoft-com:office:excel'>
       <PageSetup>
        <Header x:Margin='0.3'/>
        <Footer x:Margin='0.3'/>
        <PageMargins x:Bottom='0.75' x:Left='0.7' x:Right='0.7' x:Top='0.75'/>
       </PageSetup>
       <Unsynced/>
       <ProtectObjects>False</ProtectObjects>
       <ProtectScenarios>False</ProtectScenarios>
      </WorksheetOptions>
     </Worksheet>
     <Worksheet ss:Name='Sheet3'>
      <Table ss:ExpandedColumnCount='1' ss:ExpandedRowCount='1' x:FullColumns='1'
       x:FullRows='1' ss:DefaultRowHeight='15'>
       <Row ss:AutoFitHeight='0'/>
      </Table>
      <WorksheetOptions xmlns='urn:schemas-microsoft-com:office:excel'>
       <PageSetup>
        <Header x:Margin='0.3'/>
        <Footer x:Margin='0.3'/>
        <PageMargins x:Bottom='0.75' x:Left='0.7' x:Right='0.7' x:Top='0.75'/>
       </PageSetup>
       <Unsynced/>
       <ProtectObjects>False</ProtectObjects>
       <ProtectScenarios>False</ProtectScenarios>
      </WorksheetOptions>
     </Worksheet>
    </Workbook>
    ");

            }


            
    /// <summary>
            
    /// Functionality:
            
    /// Save Bugs from Datatable Object into SpreedSheet Excel File.
            
    /// the process includes:  
            
    ///                         1 CreateExcelFileHeader();
                
    ///                     2 SaveExcelData(dt);
                
    ///                     3 CreateExcelFooter();     
                
    ///                    
            
    ///Author:He RenGang
            
    ///completed Time: 2008/4/30;
            
    /// </summary>
            
    /// <param name="dt"></param>

            public void SaveFile(DataTable dt)
            
    {
                
    try
                
    {              
                    
    string byWho = HttpContext.Current.Session["loginuser"].ToString();
                    CreateFileHeader(byWho);
                    SaveData(dt);
                    CreateFooter();
                    sw.Close();
                    HttpContext.Current.Session[
    "bugreportfilename"= _fileName;
                    HttpContext.Current.Response.Write(
    "<script language=jscript>window.open('DownLoadBugReports.aspx?relativefilename=" + _fileName + "')</script>");
                    
    //HttpContext.Current.Response.Write("<script language=jscript>alert('The Bug report has been saved as " + relativefileName + "')</script>");
                }

                
    catch (Exception ex)
                
    {
                }

                
    return;
            }

        }


       
    }


    示例效果如下:

    如果有好方法,欢迎交流。

  • 相关阅读:
    归并排序
    快速排序
    UNION与UNION ALL的区别
    聚集索引和非聚集索引
    设计模式之抽象工厂模式
    list中map 的value值时间排序
    webmvc 拦截器 允许跨域 跨域问题 sessionid不一样
    redis 主从复制 和集群
    maven打包
    bcprov-jdk15on包用于创建CSR(证书请求)
  • 原文地址:https://www.cnblogs.com/Winston/p/1207792.html
Copyright © 2011-2022 走看看