xugang

记录一个.NET 程序员的成长

 

关于ASP.NET 将数据导出成Excel 的总结[下]

 

使用ExcelHelper 封装类,将DataSet 输出成Excel文件的多个Sheet 页。

 

使用代码如下:

public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            btn.Click += new EventHandler(btn_Click);
            Button1.Click += new EventHandler(Button1_Click);
        }

        void Button1_Click(object sender, EventArgs e)
        {
            var ds = new DataSet();
            var dt = new DataTable("TableName For Sheet1");
            dt.Columns.Add("col1");
            dt.Columns.Add("col2");
            dt.Rows.Add("Value1""Value2");

            var dt2 = new DataTable("TableName For Sheet2");
            dt2.Columns.Add("col1");
            dt2.Columns.Add("col2");
            dt2.Rows.Add("Value1""Value2");
            ds.Tables.Add(dt);
            ds.Tables.Add(dt2);
            ExcelHelper.ToExcel(ds, "test.xls", Page.Response);           
        }

        void btn_Click(object sender, EventArgs e)
        {
            var ds = new DataSet();
            DataTable dt = new DataTable();
            dt.Columns.Add("col");
            ds.Tables.Add(dt);
            ExcelHelper.ToExcel(ds, "test.xls", Page.Response);
        }      
    }


ExcelHelper.cs 封装类,源代码如下:
//ExcelHelper.cs

public class ExcelHelper
{
    //Row limits older Excel version per sheet
        const int rowLimit = 65000;

        private static string getWorkbookTemplate()
        {
            var sb = new StringBuilder();
            sb.Append("<xml version>\r\n<Workbook
        xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\"\r\n");
            sb.Append(" xmlns:o=\"urn:schemas-microsoft-com:office:office\"\r\n
        xmlns:x=\"urn:schemas- microsoft-com:office:excel\"\r\n
        xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\">\r\n");
            sb.Append(" <Styles>\r\n
        <Style ss:ID=\"Default\" ss:Name=\"Normal\">\r\n
        <Alignment ss:Vertical=\"Bottom\"/>\r\n <Borders/>");
            sb.Append("\r\n <Font/>\r\n <Interior/>\r\n <NumberFormat/>\r\n
        <Protection/>\r\n </Style>\r\n
        <Style ss:ID=\"BoldColumn\">\r\n <Font ");
            sb.Append("x:Family=\"Swiss\" ss:Bold=\"1\"/>\r\n </Style>\r\n
        <Style ss:ID=\"s62\">\r\n <NumberFormat");
            sb.Append(" ss:Format=\"@\"/>\r\n </Style>\r\n
        <Style ss:ID=\"Decimal\">\r\n
        <NumberFormat ss:Format=\"0.0000\"/>\r\n </Style>\r\n ");
            sb.Append("<Style ss:ID=\"Integer\">\r\n
        <NumberFormat ss:Format=\"0\"/>\r\n </Style>\r\n
        <Style ss:ID=\"DateLiteral\">\r\n <NumberFormat ");
            sb.Append("ss:Format=\"mm/dd/yyyy;@\"/>\r\n </Style>\r\n
        <Style ss:ID=\"s28\">\r\n");
            sb.Append("<Alignment ss:Horizontal=\"Left\" ss:Vertical=\"Top\"
        ss:ReadingOrder=\"LeftToRight\" ss:WrapText=\"1\"/>\r\n");
            sb.Append("<Font x:CharSet=\"1\" ss:Size=\"9\"
        ss:Color=\"#808080\" ss:Underline=\"Single\"/>\r\n");
            sb.Append("<Interior ss:Color=\"#FFFFFF\" ss:Pattern=\"Solid\"/>

        </Style>\r\n</Styles>\r\n {0}</Workbook>");
            return sb.ToString();
        }

        private static string replaceXmlChar(string input)
        {
            input = input.Replace("&""&");
            input = input.Replace("<""<");
            input = input.Replace(">"">");
            input = input.Replace("\""""");
            input = input.Replace("'""'");
            return input;
        }

        private static string getWorksheets(DataSet source)
        {
            var sw = new StringWriter();
            if (source == null || source.Tables.Count == 0)
            {
                sw.Write("<Worksheet ss:Name=\"Sheet1\"><Table><Row>

        <Cell  ss:StyleID=\"s62\"><Data ss:Type=\"String\"></Data>
        </Cell></Row></Table></Worksheet>");
                return sw.ToString();
            }
            foreach (DataTable dt in source.Tables)
            {
                if (dt.Rows.Count == 0)
                    sw.Write("<Worksheet ss:Name=\"" + replaceXmlChar(dt.TableName) +
            "\"><Table><Row><Cell  ss:StyleID=\"s62\">

            <Data ss:Type=\"String\"></Data></Cell></Row>
            </Table></Worksheet>");
                else
                {
                    //write each row data
                    var sheetCount = 0;
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        if ((i % rowLimit) == 0)
                        {
                            //add close tags for previous sheet of the same data table
                            if ((i / rowLimit) > sheetCount)
                            {
                                sw.Write("</Table></Worksheet>");
                                sheetCount = (i / rowLimit);
                            }
                            sw.Write("<Worksheet ss:Name=\"" +
                replaceXmlChar(dt.TableName) +
                                     (((i / rowLimit) == 0) ? "" :
                Convert.ToString(i / rowLimit)) + "\"><Table>");
                            //write column name row
                            sw.Write("<Row>");
                            foreach (DataColumn dc in dt.Columns)
                                sw.Write(
                                    string.Format(
                                        "<Cell ss:StyleID=\"BoldColumn\">

                <Data ss:Type=\"String\">{0}</Data></Cell>",
                                        replaceXmlChar(dc.ColumnName)));
                            sw.Write("</Row>\r\n");
                        }
                        sw.Write("<Row>\r\n");
                        foreach (DataColumn dc in dt.Columns)
                            sw.Write(
                                string.Format(
                                    "<Cell ss:StyleID=\"s62\"><Data ss:Type=\"String\">

                    {0}</Data></Cell>",
                                            replaceXmlChar
                    (dt.Rows[i][dc.ColumnName].ToString())));
                        sw.Write("</Row>\r\n");
                    }
                    sw.Write("</Table></Worksheet>");
                }
            }

            return sw.ToString();
        }
        public static string GetExcelXml(DataTable dtInput, string filename)
        {
            var excelTemplate = getWorkbookTemplate();
            var ds = new DataSet();
            ds.Tables.Add(dtInput.Copy());
            var worksheets = getWorksheets(ds);
            var excelXml = string.Format(excelTemplate, worksheets);
            return excelXml;
        }

        public static string GetExcelXml(DataSet dsInput, string filename)
        {
            var excelTemplate = getWorkbookTemplate();
            var worksheets = getWorksheets(dsInput);
            var excelXml = string.Format(excelTemplate, worksheets);
            return excelXml;
        }

        public static void ToExcel
        (DataSet dsInput, string filename, HttpResponse response)
        {
            var excelXml = GetExcelXml(dsInput, filename);
            response.Clear();
            response.AppendHeader("Content-Type""application/vnd.ms-excel");
            response.AppendHeader
        ("Content-disposition""attachment; filename=" + filename);
            response.Write(excelXml);
            response.Flush();
            response.End();
        }

        public static void ToExcel
        (DataTable dtInput, string filename, HttpResponse response)
        {
            var ds = new DataSet();
            ds.Tables.Add(dtInput.Copy());
            ToExcel(ds, filename, response);
        }
    }
来源:http://www.codeproject.com/KB/office/ExportDataSetToExcel.aspx

Demo下载
作者: XuGang   网名:钢钢
出处: http://xugang.cnblogs.com
声明: 本文版权归作者和博客园共有!转载时必须保留此段声明,且在文章页面明显位置给出原文连接。

posted on 2011-09-26 14:35 钢钢 阅读(175) 评论(1) 编辑 收藏

评论

#1楼[楼主] 2011-09-29 10:47 钢钢      

《保存或导出 XML 数据》


除了将文件保存为 XML 电子表格格式,其他的 XML 功能只能在 Microsoft Office Professional Edition 2003 和 Microsoft Office Excel 2003 中使用。

有多种可用于将工作表内容保存或导出到 XML 数据文件的方法。请选择合适的方法。

=================================================================================================

将映射区域中的内容“保存”到 XML 数据文件。

1> 在“文件”菜单上,单击“保存”。
(另存为 XML 数据文件时,此步骤可确保不会丢失对工作簿所做的任何更改。)
2> 在“文件”菜单上,单击“另存为”。
3> 在“文件名”框中,键入 XML 数据文件的名称。
4> 在“保存类型”列表中,单击“XML 数据”。
5> 单击“保存”。
6> 当收到警告说明将文件保存为“XML 数据”可能导致功能丢失时,单击“继续”。
7> 如果显示“导出 XML”对话框,请单击要使用的 XML 映射,再单击“确定”。

只有在为工作簿添加了多个 XML 映射时才会显示“导出 XML”对话框。

注释:现在,活动工作簿已被保存为 XML 数据文件。如果希望继续处理原始工作簿,则需要关闭 XML 数据文件,并重新打开原始工作簿。

=================================================================================================

将映射区域中的内容“导出”到 XML 数据文件。

1> 在“列表”工具栏上,单击“导出”按钮图像 。
2> 如果显示“导出 XML”对话框,请单击要使用的 XML 映射,再单击“确定”。
(只有在为工作簿添加了多个 XML 映射时才会显示“导出 XML”对话框。)
3> 在“文件名”框中,键入 XML 数据文件的名称。
4> 单击“导出”。

=================================================================================================

以“XML 电子表格”文件格式“保存”工作表中的内容。

1> 在“文件”菜单上,单击“另存为”。
2> 在“文件名”框中,键入文件名称。
3> 在“保存类型”列表中,单击“XML 表格”。
4> 单击“保存”。


 回复 引用 查看   

导航

统计

公告



穷则独善其身
达则兼济天下


新闻

昵称:钢钢
园龄:4年7个月
荣誉:推荐博客
粉丝:172
关注:54

搜索

 
 

常用链接

我的标签

随笔分类(311)

随笔档案(288)

文章分类(26)

Blog

Tool

Total

Website

积分与排名

最新评论

阅读排行榜

评论排行榜

推荐排行榜