zoukankan      html  css  js  c++  java
  • 无插件,无com组件,利用EXCEL、WORD模板做数据导出(一)

      本次随笔主要讲述着工作中是如何解决数据导出的,对于数据导出到excel在日常工作中大家还是比较常用的,那导出到word呢,改如何处理呢,简单的页面导出问题应该不大,但是如果是标准的公文导出呢,要保证其基本格式,如红头、抬头、文号等等格式的限制我们又该如何处理呢?

    主要原理:

    1、利用excel、word做好模板,在模板中设置关键字

    2、在程序中调用模板,替换关键字

    3、将替换后的模板作为导出文件输出

    一、导出到EXCEL,在此处先从简单的入手,先描述如何利用excel做导出。步骤如下:

    1、用excel2007随便创建一个excel文件,打开添加如下数据:

    2、点击另存,将excel文件另存为xml格式文件,选择2003xml格式,如下图:

    3、右键用记事本打开刚刚另存到xml文件,观察xml内容会发现其妙之处,如下图:

      如上图所示,注意观察,每一个WorkSheet都用了一段xml代码来表示,方框部分为我们写入的数据,圆圈部分为我们要处理的重要部分。

      小圆圈内的2表示当前数据2行,大圆圈表示我们看到的三行三列数据,因此我们要做的就是将我们要导出到数据写成圆圈中的格式就行了。

    4、改进xml文件,创建关键字,如下图:

      如上图所示,我们创建了两个关键字,具体含义不多说。

      最后将创建好的xml文件,也就是你的excel模板可以放入到项目中了,接下来要做的就是将数据生成并按照标准格式输出,进行替换关键字即可。

    5、数据生成并输出,如下所示:

    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>
    "
                            + "<Cell><Data ss:Type="String">" + dt.Rows[i]["Name"] + "</Data></Cell>
    "
                            + "<Cell><Data ss:Type="String">" + dt.Rows[i]["Sex"] + "</Data></Cell>
    "
                            + "<Cell><Data ss:Type="String">" + dt.Rows[i]["Age"] + "</Data></Cell>
    "
                            + "</Row>
    ");
                    }
                    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就完成了。
    优点:

    1、可以导出任何你可以在excel中能模拟出来的数据样式,包括图形嵌入。在后一篇会讲解如何导出图片到excel,word。

    2、整个过程不复杂,不需要调用插件、office组件,BS或者CS模式的方式都适用,没有复杂的逻辑过程。

    3、解决多sheet导出数据。

    缺点:需要先做模板

    注意事项:模板中的关键字要根据数据内容而定,不要出现关键字冲突的情况,关键字字符标准由开发者自行定夺。

    下一篇介绍如何导出数据到word,这个导出就相对复杂一些,但是原理一致,重点是图片导出到word中是什么原理。

  • 相关阅读:
    C++:智能指针TR1的shared_ptr和weak_ptr使用介绍
    makefile文件
    php中格式化输出函数vprintf printf sprintf sscanf
    SQLite轻量级数据库简介(转)
    非常有用的免费UI设计工具和资源
    IAR编译duplicate definitions for IAR报错解决办法
    ATMEL推出无需授权费用的ARM处理器的定制SoC MPCFII技术
    DM9000 寄存器的定义
    php 5.3.6 连接sqlite3
    Jquery 取值 发送ajax,并修改原网页的数据
  • 原文地址:https://www.cnblogs.com/tzy080112/p/3413938.html
Copyright © 2011-2022 走看看