• Excel导出的几种方式


    1、html

    前台html与js代码(文件:ExportExcelByHtml.aspx):

     1 <html xmlns="http://www.w3.org/1999/xhtml">
     2 <head runat="server">
     3     <title></title>
     4 </head>
     5 <body>
     6     <form id="form1" runat="server">
     7     <div>
     8         <asp:LinkButton runat="server" OnClientClick="return tiggerAlert();" OnClick="Button1_Click">Matt Cheng</asp:LinkButton>
     9         <br />
    10          <asp:HiddenField ID="ExportField" runat="server" />
    11     </div>
    12     </form>
    13 </body>
    14 </html>16 <script type="text/javascript">
    17     function tiggerAlert() {
    18         var html = "<html><head><style type="text/css">#tt{color:green;}</style></head><body>"
    19              + "<div>"
    20              + "<table>"
    21              + "<tr><th style='color:red;'>cheng</th><th>liu</th></tr>"
    22              + "<tr><td id='tt'>7845</td><td>666</td></tr>"
    23              + "</table>"
    24              + "</div>"
    25              + "</body><html>";
    26         document.getElementById("ExportField").value = escape(html);
    27 
    28         return true;
    29     }
    30 </script>

    注:注意控件LinkButton点击事件的用法,OnClientClick为前台事件(js),OnClick为后台事件(C#),当用户点击按钮,先响应OnClientClick,若OnClientClick的返回结果为true,则执行OnClick,否则不执行。

    后台C#代码(ExportExcelByHtml.aspx.cs)

     1   public partial class ClientClick : System.Web.UI.Page
     2   {
     3       protected void Page_Load(object sender, EventArgs e)
     4       {
     6       }
     7 
     8       protected void Button1_Click(object sender, EventArgs e)
     9       {
    10          string fileName = HttpUtility.UrlEncode("想你的夜") + DateTime.Now.ToString("yyyyMMdd") + ".xls";
    11          Response.AppendHeader("Content-Disposition", "attachment;filename=" + fileName);
    12          Response.ContentType = "application/vnd.ms-excel";
    13          System.IO.StringWriter oStringWriter = new System.IO.StringWriter();
    14          System.Web.UI.HtmlTextWriter oHtmlTextWriter = new System.Web.UI.HtmlTextWriter(oStringWriter);
    15          oHtmlTextWriter.Write(HttpUtility.UrlDecode(this.ExportField.Value));
    16          Response.Write(oStringWriter.ToString());
    17          //Response.Write(HttpUtility.UrlDecode(this.ExportField.Value));
    18          Response.End();
    19       }
    20   }

    注:13-16行的效果和17行相同。但通常采用前一种方式,原因未知。。。。

    html导出excel的特点:能够通过样式(内部样式表与内联样式)设置excel的格式。

     2、数据源

    前台html与js代码(文件:ExportExcelByOle.aspx):

     1 <html xmlns="http://www.w3.org/1999/xhtml">
     2 <head runat="server">
     3     <title></title>
     4     <script type="text/javascript">
     5         function exportExcel() {
     6             document.getElementById("iframe0").src = "ttttt.aspx?timeTick=" + ((new Date()) - (new Date(1, 1, 1)));
     7         }
     8     </script>
     9 </head>
    10 <body>
    11     <form id="form1" runat="server">
    12     <div>
    13     <input type="button" value="button" onclick="exportExcel()" />
    14     <iframe id="iframe0" style="display:none;" src="" />
    15     </div>
    16     </form>
    17 </body>
    18 </html>

    注:将js代码(即<script>标签)放到html后,在onclick中的exportExcel未定义(undefined),原因未知。。。。

    web.config配置:

    <httpHandlers>
       <add path="ttttt.aspx" verb="*" type="ExcelExportTest.ExcelExportHandler"/>
    </httpHandlers>

    注:iis对http请求的响应方式详见Http Handler介绍

    后台C#代码(ExcelExportHandler.cs):

      1 public class ExcelExportHandler : IHttpHandler
      2     {
      3         private HttpContext context;
      4 
      5         public bool IsReusable { get { return true; } }
      6 
      7         public void ProcessRequest(HttpContext context)
      8         {
      9             this.context = context;
     10 
     11             DataRow row;
     12             DataSet ds = new DataSet();
     13             DataTable dt = new DataTable();
     14             dt.TableName = "table";
     15             dt.Columns.Add("cheng");
     16             dt.Columns.Add("liu");
     17             dt.Columns.Add("");
     18             row = dt.NewRow();
     19             row["cheng"] = "789";
     20             row["liu"] = "tttt";
     21             row[""] = " 面包";
     22             dt.Rows.Add(row);
     23             row = dt.NewRow();
     24             row["cheng"] = "tt";
     25             row["liu"] = "ttpppptt";
     26             row[""] = "可乐";
     27             dt.Rows.Add(row);
     28             ds.Tables.Add(dt);
     29 
     30             string rootPath = AppDomain.CurrentDomain.BaseDirectory + "files\";
     31             if (!Directory.Exists(rootPath))
     32                 Directory.CreateDirectory(rootPath);
     33             string filePath = rootPath + DateTime.Now.Ticks.ToString() + ".xls";
     34             //File.Create(filePath);
     35             DataSetToExcel(ds, filePath);
     36             WriteExcelFile(filePath, "成功");
     37             if (File.Exists(filePath))
     38             {
     39                 FileInfo fInfo = new FileInfo(filePath);
     40                 fInfo.Attributes = FileAttributes.Normal;
     41                 File.Delete(filePath);
     42             }
     43         }
     44 
     45         private void DataSetToExcel(DataSet ds, string filePath)
     46         {
     47             using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended Properties="Excel 8.0;HDR=yes;IMEX=0";"))
     48             {
     49                 if (conn.State != ConnectionState.Open)
     50                     conn.Open();
     51 
     52                 foreach (DataTable dt in ds.Tables)
     53                 {
     54                     OleDbCommand cmdCreateTable = new OleDbCommand("create table [table] ([cheng] varchar, [liu] varchar, [杨] varchar)", conn);
     55                     OleDbCommand cmdInsertRow = new OleDbCommand("insert into [table] ([cheng], [liu], [杨]) values(?, ?, ?)", conn);
     56                     cmdCreateTable.ExecuteNonQuery();
     57 
     58                     foreach (DataColumn dc in dt.Columns)
     59                     {
     60                         cmdInsertRow.Parameters.Add(new OleDbParameter(dc.ColumnName, ""));
     61                     }
     62                     foreach (DataRow dr in dt.Rows)
     63                     {
     64                         foreach (DataColumn dc in dt.Columns)
     65                         {
     66                             cmdInsertRow.Parameters[dc.ColumnName].Value = dr[dc.ColumnName];
     67                         }
     68                         cmdInsertRow.ExecuteNonQuery();
     69                     }
     70                 }
     71             }
     72         }
     73 
     74         private void WriteExcelFile(string filePath, string fileName)
     75         {
     76             if (File.Exists(filePath))
     77             {
     78                 FileStream fStream = new FileStream(filePath, FileMode.Open);
     79                 try
     80                 {
     81                     context.Response.Clear();
     82                     context.Response.ContentType = "application/vnd.ms-excel";
     83                     context.Response.AppendHeader("Content-Disposition", "attachment;filename=" + context.Server.UrlEncode(fileName) + ".xls");
     84                     long len = fStream.Length;
     85                     long lCount = 0;
     86                     int bLen = 10000;
     87                     byte[] buffer = new byte[bLen];
     88                     while (lCount < len)
     89                     {
     90                         lCount += fStream.Read(buffer, 0, bLen);
     91                         context.Response.BinaryWrite(buffer);
     92                         context.Response.Flush();
     93                     }
     94                 }
     95                 finally
     96                 {
     97                     fStream.Close();
     98                 }
     99             }
    100         }
    101     }

    注:OleDbConnection 连接数据源时自动创建文件,写数据的cmd语句和SQL相同。

    数据源导出excel特点:可以在一个excel文件中写多个表格(sheet),但格式目前没有找到控制方法

    3、Xml

    xml的导出的调用方式与数据源导出类似,通过HttpHandler方式实现。

    后台代码(ExcelExportByXml.cs):

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.IO;
    using System.Text;
    using System.Xml;
    
    namespace FileExport
    {
        public class ExcelExportByXml
        {
            private const string excelTemplate = "excelTable.xml";
            private HttpContext context;
    
            public ExcelExportByXml(HttpContext httpContext)
            {
                this.context = httpContext;
            }
    
            public void ExportExcel(object data)
            {
                List<DataEntity> list = data as List<DataEntity>;
                string moduleFile = GetExcelModule();
    
                StringBuilder tableString = new StringBuilder("<Column ss:Width="90"/>");
                tableString.Append("<Column ss:Width="90"/>");
                tableString.Append("<Column ss:Width="90"/>");
    
                string[] headers = { "Data1", "Data2", "Data3" };
                SetTableHeader(tableString, headers);
    
                foreach (DataEntity info in list)
                {
                    tableString.Append("<Row>");
                    tableString.Append("<Cell ss:StyleID="s65"><Data ss:Type="String">" + info.Data1 + "</Data></Cell>");
                    tableString.Append("<Cell ss:StyleID="s66"><Data ss:Type="String">" + info.Data2 + "</Data></Cell>");
                    tableString.Append("<Cell ss:StyleID="s65"><Data ss:Type="String">" + info.Data3 + "</Data></Cell>");
                    tableString.Append("</Row>");
                }
    
                moduleFile = String.Format(moduleFile, "", "爱你一万年", tableString.ToString());
                WriteExcelFile(moduleFile, DateTime.Now.Ticks.ToString());
            }
    
            private string GetExcelModule()
            {
                string res = "";
                string filePath = AppDomain.CurrentDomain.BaseDirectory + excelTemplate;
                using (StreamReader sr = new StreamReader(filePath))
                {
                    res = sr.ReadToEnd();
                    sr.Close();
                }
                return res;
            }
    
            private void SetTableHeader(StringBuilder tableString, string[] headers)
            {
                if (tableString != null && headers.Length > 0)
                {
                    tableString.Append("<Row ss:Index="2">");
                    foreach (string header in headers)
                    {
                        tableString.Append("<Cell ss:StyleID="s63"><Data ss:Type="String">");
                        tableString.Append(header);
                        tableString.Append("</Data></Cell>");
                    }
                    tableString.Append("</Row>");
                }
            }
    
            private void WriteExcelFile(string fileString, string fileName)
            {
                if (!String.IsNullOrEmpty(fileString))
                {
                    XmlDocument doc = new XmlDocument();
                    doc.LoadXml(fileString);
                    XmlWriterSettings xmlSettings = new XmlWriterSettings();
                    xmlSettings.Indent = true;
                    xmlSettings.Encoding = Encoding.UTF8;
                    xmlSettings.OmitXmlDeclaration = false;
                    MemoryStream ms = new MemoryStream();
                    using (XmlWriter xw = XmlWriter.Create(ms, xmlSettings))
                    {
                        doc.WriteTo(xw);
                        xw.Close();
                    }
                    WriteFile(ms, fileName);
                }
            }
    
            private void WriteFile(MemoryStream ms, string fileName)
            {
                try
                {
                    this.context.Response.ContentType = "application/vnd.ms-excel";
                    this.context.Response.AppendHeader("Content-Disposition", "attachment;filename=" + this.context.Server.UrlEncode(fileName) + ".xls;charset=utf8");
                    ms.Position = 0;
                    int size = 10*1024; // 10K
                    byte[] buffer = new byte[size];
                    while (ms.Read(buffer, 0, size) > 0)
                    {
                        this.context.Response.BinaryWrite(buffer);
                        this.context.Response.OutputStream.Flush();
                    }
                    
                }
                catch (Exception ex)
                {
                }
                finally
                {
                    ms.Close();
                }
            }
        }
    
        class DataEntity
        {
            public string Data1 { set; get; }
            public string Data2 { set; get; }
            public string Data3 { set; get; }
        }
    }

    模板(excelTable.xml)

    <?xml version="1.0" encoding="utf-8" ?>
    <?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">
        <Title>{0}</Title>
        <LastAuthor>Wind</LastAuthor>
        <Created>2013-11-22T06:50:15Z</Created>
        <LastSaved>2013-11-22T06:50:15Z</LastSaved>
        <Version>12.00</Version>
      </DocumentProperties>
      <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
        <WindowHeight>10005</WindowHeight>
        <WindowWidth>10005</WindowWidth>
        <WindowTopX>120</WindowTopX>
        <WindowTopY>135</WindowTopY>
        <ProtectStructure>False</ProtectStructure>
        <ProtectWindows>False</ProtectWindows>
      </ExcelWorkbook>
      <Styles>
        <Style ss:ID="s63">
          <Alignment ss:Horizontal="Center" ss:Vertical="Center" ss:WrapText="1"/>
          <Borders>
            <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"
             ss:Color="#000000"/>
            <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"
             ss:Color="#000000"/>
            <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"
             ss:Color="#000000"/>
            <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"
             ss:Color="#000000"/>
          </Borders>
          <Font ss:FontName="宋体" x:CharSet="134" ss:Color="#000000" ss:Bold="1"/>
        </Style>
        <Style ss:ID="s64">
          <Alignment ss:Horizontal="Right" ss:Vertical="Center" ss:WrapText="1"/>
          <Borders>
            <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"
             ss:Color="#000000"/>
            <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"
             ss:Color="#000000"/>
            <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"
             ss:Color="#000000"/>
            <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"
             ss:Color="#000000"/>
          </Borders>
          <Font ss:FontName="宋体" x:CharSet="134" ss:Color="#000000"/>
        </Style>
        <Style ss:ID="s65">
          <Alignment ss:Horizontal="Center" ss:Vertical="Center" ss:WrapText="1"/>
          <Borders>
            <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"
             ss:Color="#000000"/>
            <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"
             ss:Color="#000000"/>
            <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"
             ss:Color="#000000"/>
            <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"
             ss:Color="#000000"/>
          </Borders>
          <Font ss:FontName="宋体" x:CharSet="134" ss:Color="#000000"/>
        </Style>
        <Style ss:ID="s66">
          <Alignment ss:Horizontal="Left" ss:Vertical="Center" ss:WrapText="1"/>
          <Borders>
            <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"
             ss:Color="#000000"/>
            <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"
             ss:Color="#000000"/>
            <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"
             ss:Color="#000000"/>
            <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"
             ss:Color="#000000"/>
          </Borders>
          <Font ss:FontName="宋体" x:CharSet="134" ss:Color="#000000"/>
        </Style>
      </Styles>
      <Worksheet ss:Name="{1}">
        <Table x:FullColumns="1"
         x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="13.5">{2}</Table>
        <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
          <Print>
            <ValidPrinterInfo/>
            <VerticalResolution>0</VerticalResolution>
          </Print>
          <Selected/>
          <Panes>
            <Pane>
              <Number>3</Number>
              <RangeSelection>R1C1:R1C10</RangeSelection>
            </Pane>
          </Panes>
          <ProtectObjects>False</ProtectObjects>
          <ProtectScenarios>False</ProtectScenarios>
        </WorksheetOptions>
      </Worksheet>
    </Workbook>

    调用方法(在HttpHandler中):

    List<DataEntity> list = new List<DataEntity>();
    DataEntity de1 = new DataEntity { Data1 = "pp", Data2 = "rrr", Data3 = "123" };
    DataEntity de2 = new DataEntity { Data1 = "pp", Data2 = "rrr", Data3 = "123" };
    list.Add(de1);
    list.Add(de2);
    ExcelExportByXml excelExport = new ExcelExportByXml(this.context);
    excelExport.ExportExcel(list);

    该方法的优点:可以充分控制excel中表格的样式。

    注:该方法使用Office Open XML技术,目前没有找到较好的参考文档,为了查找要达到的效果对应的标签,可以新建excel文档,编辑相应的效果,之后再另存为xml格式的文本,查看对应的标签即可。

    4、GridView

    该方法同样使用HttpHandler,代码结构与数据源相同。

        // 使用GridView
        if (ds.Tables[0].Rows.Count > 0)
        {
            //当前对话 
            System.Web.HttpContext curContext = System.Web.HttpContext.Current;
            //IO用于导出并返回excel文件 
            System.IO.StringWriter strWriter = null;
            System.Web.UI.HtmlTextWriter htmlWriter = null;
    
            //设置编码和附件格式 
            //System.Web.HttpUtility.UrlEncode(FileName, System.Text.Encoding.UTF8)作用是方式中文文件名乱码 
            curContext.Response.AddHeader("content-disposition", "attachment;filename=" + System.Web.HttpUtility.UrlEncode("定投排行榜", System.Text.Encoding.UTF8) + ".xls");
            curContext.Response.ContentType = "application nd.ms-excel";
            curContext.Response.ContentEncoding = System.Text.Encoding.UTF8;
            curContext.Response.Charset = "GB2312";
    
            //导出Excel文件 
            strWriter = new System.IO.StringWriter();
            htmlWriter = new System.Web.UI.HtmlTextWriter(strWriter);
    
            //为了解决dgData中可能进行了分页的情况,需要重新定义一个无分页的GridView 
            GridView gvExport = new GridView();
            gvExport.DataSource = ds.Tables[0].DefaultView;
            gvExport.AllowPaging = false;
            gvExport.DataBind();
    
            //下载到客户端 
            gvExport.RenderControl(htmlWriter);
            curContext.Response.Write(strWriter.ToString());
            curContext.Response.End();
        }

    该方法的本质与html相同,即生成html代码并输出到前台。

    优点:html代码通过控件自动生成,使用简单。

    读取excel的一种简单方式:

    using System;
    using System.Data;
    using System.Data.OleDb;
    
    namespace ExcelReading
    {
        class Program
        {
            static void Main(string[] args)
            {
                DataSet ds = GetDateSet(@"C:Usersjcheng.mattDesktop	est.xlsx");
                DataTable dt = ds.Tables[0];
            }
    
            public static DataSet GetDateSet(string filePath)
            {
                string fileType = System.IO.Path.GetExtension(filePath);
                if (string.IsNullOrEmpty(fileType))
                {
                    return null;
                }
    
                string connStr = string.Empty;
                if (fileType == ".xls")
                    connStr = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + filePath + ";" + ";Extended Properties="Excel 8.0;HDR=YES;IMEX=1"";
                else
                    connStr = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + filePath + ";" + ";Extended Properties="Excel 12.0;HDR=YES;IMEX=1"";
    
                OleDbConnection conn = null;
                OleDbDataAdapter adapter = new OleDbDataAdapter();
                DataSet ds = new DataSet();
                try
                {
                    // 初始化连接,并打开
                    conn = new OleDbConnection(connStr);
                    conn.Open();
    
                    // 获取数据源的表定义元数据                        
                    DataTable dtSheetName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
    
                    string sheetName = string.Empty;
                    string sql = "Select * FROM [{0}]";
                    for (int i = 0; i < dtSheetName.Rows.Count; i++)
                    {
                        sheetName = (string)dtSheetName.Rows[i]["TABLE_NAME"];
                        adapter.SelectCommand = new OleDbCommand(String.Format(sql, sheetName), conn);
                        DataSet dsItem = new DataSet();
                        adapter.Fill(dsItem, sheetName);
                        ds.Tables.Add(dsItem.Tables[0].Copy());
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
                finally
                {
                    // 关闭连接
                    if (conn.State == ConnectionState.Open)
                    {
                        conn.Close();
                        adapter.Dispose();
                        conn.Dispose();
                    }
                }
                return ds;
            }
        }
    }
    View Code
  • 相关阅读:
    go基础第六篇:依赖管理
    go基础第五篇:并发
    go基础第四篇:error、panic、recover
    go基础第三篇:结构体、函数、方法、接口
    docker第二篇:docker compose
    docker第一篇:docker概念及基础命令
    编辑距离
    常见安全漏洞
    go基础第二篇:类型
    go基础第一篇:基本语法
  • 原文地址:https://www.cnblogs.com/MattCheng/p/4311039.html
Copyright © 2020-2023  润新知