在Asp.Net中将数据从数据库附加到Excel

时间:2014-09-11 08:24:11

标签: c# asp.net excel

我开发了一个应用程序,我必须将数据从数据库插入Excel,插入数据的大小是预定义的。

假设任何城市有20条记录。现在一开始我只需要插入5条记录,然后在向用户查看一些消息之后,接着将5个数据附加到同一个Excel文件中,依此类推。

以下是我将数据插入Excel的代码,其大小在Web.Config文件中定义。

Web.Config代码:

<appSettings>
  <add key="UserRecord" value="6"/>
</appSettings>

代码:

public void InsertRecordToExcel()
    {
        DAL ObjDal = new DAL();
        string record = ConfigurationManager.AppSettings["UserRecord"];
        try
        {
            int n = Convert.ToInt32(record);
            string filename = Server.MapPath("UserDataSheet");
            string City = TxtCityName.Text;
            DataTable dt = new DataTable();
            dt = ObjDal.GetData(City);
            while(dt.Rows.Count>0)
            {
                StringWriter writer = new StringWriter();
                HtmlTextWriter htmlWriter = new HtmlTextWriter(writer);
                GridView gridView = new GridView();
                DataTable dtn = new DataTable();
                gridView.DataSource = dt.AsEnumerable().Take(n).CopyToDataTable();
                gridView.AutoGenerateColumns = true;
                gridView.DataBind();
                gridView.RenderControl(htmlWriter);
                htmlWriter.Close();
                Response.Clear();
                Response.AddHeader("content-disposition", "attachment;filename=" + filename + ".xls");
                Response.Charset = "";
                Response.Write(writer.ToString());
                Response.End();
                LblMessage.Text = n + " " + "Record Added Successfully";
            }                
        }

        catch (Exception ex)
        {
            throw ex;
        }
    }

将数据附加到Excel文件的步骤是什么?

2 个答案:

答案 0 :(得分:1)

您可以使用xmlwriter创建excel文件。或者更舒适的方式是使用库。 (Create Excel (.XLS and .XLSX) file from C#

与图书馆:

    void export_Click(object sender, EventArgs e){
        byte[] data = File.ReadAllBytes("export.xls"); //The created excel file with the library, if the library supports getting the excel as a stream you can use the method below to stream it.
        string filename = "export.xls"; 

        Response.Clear();
        Response.ClearHeaders();
        Response.ClearContent();
        Response.AddHeader("content-disposition", "attachment; filename="+filename);
        Response.AddHeader("Content-Type", "application/Excel");
        Response.ContentType = "application/vnd.xls";
        Response.AddHeader("Content-Length", bytesInStream.Length.ToString());
        Response.BinaryWrite(data);
        Response.End();       
    }

使用xml的方法:

     void export_Click(object sender, EventArgs e){
        MemoryStream ms = ExportDataTableToWorksheet(ds, ds2, true);
        byte[] bytesInStream = ms.ToArray(); 

        string filename = "export.xls";

        Response.Clear();
        Response.ClearHeaders();
        Response.ClearContent();
        Response.AddHeader("content-disposition", "attachment; filename="+filename);
        Response.AddHeader("Content-Type", "application/Excel");
        Response.ContentType = "application/vnd.xls";
        Response.AddHeader("Content-Length", bytesInStream.Length.ToString());
        Response.BinaryWrite(bytesInStream);
        Response.End();       
    }

    public static MemoryStream ExportDataTableToWorksheet(DataSet ds)
    {
        MemoryStream ms = new MemoryStream();
        XmlTextWriter writer = new XmlTextWriter(ms, Encoding.UTF8);

        writer.Formatting = Formatting.Indented;

        // <?xml version="1.0"?>
        writer.WriteStartDocument();

        // <?mso-application progid="Excel.Sheet"?>
        writer.WriteProcessingInstruction("mso-application", "progid=\"Excel.Sheet\"");

        // <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet >"
        writer.WriteStartElement("Workbook", "urn:schemas-microsoft-com:office:spreadsheet");

        // Namespace definitions
        writer.WriteAttributeString("xmlns", "o", null, "urn:schemas-microsoft-com:office:office");
        writer.WriteAttributeString("xmlns", "x", null, "urn:schemas-microsoft-com:office:excel");
        writer.WriteAttributeString("xmlns", "ss", null, "urn:schemas-microsoft-com:office:spreadsheet");
        writer.WriteAttributeString("xmlns", "html", null, "http://www.w3.org/TR/REC-html40");

        // <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
        writer.WriteStartElement("DocumentProperties", "urn:schemas-microsoft-com:office:office");

        // Documentattributes Author, Date, Company
        writer.WriteElementString("Author", Environment.UserName);
        writer.WriteElementString("LastAuthor", Environment.UserName);
        writer.WriteElementString("Created", DateTime.Now.ToString("u") + "Z");
        writer.WriteElementString("Company", "Unknown");
        writer.WriteElementString("Version", "11.8122");

        // </DocumentProperties>
        writer.WriteEndElement();

        // <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
        writer.WriteStartElement("ExcelWorkbook", "urn:schemas-microsoft-com:office:excel");

        // Workbook-Preferences
        writer.WriteElementString("WindowHeight", "13170");
        writer.WriteElementString("WindowWidth", "17580");
        writer.WriteElementString("WindowTopX", "120");
        writer.WriteElementString("WindowTopY", "60");
        writer.WriteElementString("ProtectStructure", "False");
        writer.WriteElementString("ProtectWindows", "False");

        // </ExcelWorkbook>
        writer.WriteEndElement();

        // <Styles>
        writer.WriteStartElement("Styles");

        // <Style ss:ID="Default" ss:Name="Normal">
        writer.WriteStartElement("Style");
        writer.WriteAttributeString("ss", "ID", null, "Default");
        writer.WriteAttributeString("ss", "Name", null, "Normal");

        // <Alignment ss:Vertical="Bottom"/>
        writer.WriteStartElement("Alignment");
        writer.WriteAttributeString("ss", "Vertical", null, "Bottom");
        writer.WriteEndElement();

        // Verbleibende Sytle-Eigenschaften leer schreiben
        writer.WriteElementString("Borders", null);
        writer.WriteElementString("Font", null);
        writer.WriteElementString("Interior", null);
        writer.WriteElementString("NumberFormat", null);
        writer.WriteElementString("Protection", null);

        // </Style>
        writer.WriteEndElement();

        // </Styles>
        writer.WriteEndElement();

        // <Worksheet ss:Name="xxx">
        writer.WriteStartElement("Worksheet");
        writer.WriteAttributeString("ss", "Name", null, "export");

        // <Table ss:ExpandedColumnCount="2" ss:ExpandedRowCount="3" x:FullColumns="1" x:FullRows="1" ss:DefaultColumnWidth="60">
        writer.WriteStartElement("Table");

        // setting the column count
        writer.WriteAttributeString("ss", "ExpandedColumnCount", null, "1");
        else writer.WriteAttributeString("ss", "ExpandedRowCount", null, (ds.Tables[0].Rows.Count).ToString());
        writer.WriteAttributeString("x", "FullColumns", null, "1");
        writer.WriteAttributeString("x", "FullRows", null, "1");
        writer.WriteAttributeString("ss", "DefaultColumnWidth", null, "100");

        foreach (DataRow row in ds.Tables[0].Rows)
        {
            // <Row>
            writer.WriteStartElement("Row");

            // Alle Zellen der aktuellen Zeile durchlaufen

            writeCell(writer, (string)row["name"]);

            // </Row>
            writer.WriteEndElement();
        }
        // </Table>
        writer.WriteEndElement();

        // <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
        writer.WriteStartElement("WorksheetOptions", "urn:schemas-microsoft-com:office:excel");

        // pagesetup
        writer.WriteStartElement("PageSetup");
        writer.WriteStartElement("Header");
        writer.WriteAttributeString("x", "Margin", null, "0.4921259845");
        writer.WriteEndElement();
        writer.WriteStartElement("Footer");
        writer.WriteAttributeString("x", "Margin", null, "0.4921259845");
        writer.WriteEndElement();
        writer.WriteStartElement("PageMargins");
        writer.WriteAttributeString("x", "Bottom", null, "0.984251969");
        writer.WriteAttributeString("x", "Left", null, "0.78740157499999996");
        writer.WriteAttributeString("x", "Right", null, "0.78740157499999996");
        writer.WriteAttributeString("x", "Top", null, "0.984251969");
        writer.WriteEndElement();
        writer.WriteEndElement();

        // <Selected/>
        writer.WriteElementString("Selected", null);

        // <Panes>
        writer.WriteStartElement("Panes");

        // <Pane>
        writer.WriteStartElement("Pane");

        //
        writer.WriteElementString("Number", "1");
        writer.WriteElementString("ActiveRow", "1");
        writer.WriteElementString("ActiveCol", "1");

        // </Pane>
        writer.WriteEndElement();

        // </Panes>
        writer.WriteEndElement();

        // <ProtectObjects>False</ProtectObjects>
        writer.WriteElementString("ProtectObjects", "False");

        // <ProtectScenarios>False</ProtectScenarios>
        writer.WriteElementString("ProtectScenarios", "False");

        // </WorksheetOptions>
        writer.WriteEndElement();

        // </Worksheet>
        writer.WriteEndElement();

        // </Workbook>
        writer.WriteEndElement();

        writer.Flush();
        writer.Close();
        return ms;
    }

    /// <summary>
    /// Removes control characters and other non-UTF-8 characters
    /// </summary>
    /// <param name="inString">The string to process</param>
    /// <returns>A string with no control characters or entities above 0x00FD</returns>
    public static string RemoveTroublesomeCharacters(string input)
    {
        var isValid = new Predicate<char>(value =>
    (value >= 0x0020 && value <= 0xD7FF) ||
    (value >= 0xE000 && value <= 0xFFFD) ||
    value == 0x0009 ||
    value == 0x000A ||
    value == 0x000D);

        return new string(Array.FindAll(input.ToCharArray(), isValid));

    }

    static void writeCell(XmlTextWriter writer, string value)
    {
        // <Cell>
        writer.WriteStartElement("Cell");

        // <Data ss:Type="String">xxx</Data>
        writer.WriteStartElement("Data");
        writer.WriteAttributeString("ss", "Type", null, "String");

        // Zelleninhakt schreiben
        writer.WriteValue(value);

        // </Data>
        writer.WriteEndElement();

        // </Cell>
        writer.WriteEndElement();
    }

答案 1 :(得分:0)

&#34;在向用户查看一些消息后#34; - 这是什么信息,你在哪里展示这个? 假设此消息在Web /桌面上,只需将前5条记录插入excel,维护excel工作簿实例,显示消息,将下一组数据插入活动工作簿。

还有一个想法是使用数据表,只有当用户下载excel时你才能填写excel

如果您能解释显示消息的重要性,将会很有帮助