无插件,无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中是什么原理。

相关文章
相关标签/搜索