无插件,无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>\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就完成了。
优点:

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

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

3、解决多sheet导出数据。

缺点:需要先做模板

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

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

 

 

 

 

转载于:https://www.cnblogs.com/tzy080112/p/3413938.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/421424.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux提示链接层次太多,嵌入式linuxmusic播放器

VLC music player流媒体客户端软件层次结构流媒体网络协议流视频协议是为了在客户端机和服务器之间进行通信而设计的标准化协议。根据它们的功能&#xff0c;网络上传输的流视频相关的协议分为三类。网络层协议&#xff1a;网络层协议提供了基本的网络服务支持。IP就是网络上流…

vc的UI编程PngTextButton控件的适用情况

控件继承自Cbutton。重写了其中的一些方法。适用ui类型&#xff1a;带图片和文字的类型的按钮&#xff0c;其中图片在前面&#xff0c;文字在后面。如下图 文件下载 转载于:https://www.cnblogs.com/songtzu/p/3415601.html

python在eclipse下中文乱码问题zz

首先要确保eclipse编辑器环境的编码为utf8&#xff0c;这个是大前提&#xff1b;其次如果py文件中含有中文字符的话&#xff0c;需要在py文件中对编码进行声明。1. 修改eclipse编辑器编码 a) window->preferences->general->editors->text editors->spelling-&g…

SecureCRT连接linux时主机名,secureCRT连接linux方法

jookfoon 于 2011-09-22 11:43:08发表:挺简单的zdq 于 2011-09-22 11:28:00发表:回复吧&#xff0c;又没钱下载了&#xff0c;怎么这样子咧sand302 于 2011-08-12 11:05:35发表:感谢分享&#xff0c;支持chongee 于 2011-08-12 10:55:11发表:收藏之前&#xff0c;先支持一下&am…

如何使用一个库中不存在的函数

Windows是一个不断发展的系统&#xff0c;很多新的 API 在操作系统更新时更新&#xff0c;而MASM32开发包一般在很长一段时间内都无法及时更新&#xff0c;如果需要在编程中使用新添加的API函数。就得自己动手来更手库文件&#xff0c;下面我就给大家介绍一下如何通过手动的方法…

linux使用root操作文件,以root用户登录Linux系统,当前目录是/root,要求完成如下操作和功...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼1、groupadd benetgrp2. useradd -g benetgrp benet3, mkdir -p /var/www/beneta, chown benet /var/www/benet ; chmod urwx /var/www/benetb, chown :benetgrp /var/www/benet或者chgrp benetgrp /var/www/benet; chmod grx /var…

清除浮动的7种方法

使用display&#xff1a;inline-block会出现的情况&#xff1a; 1.使块元素在一行显示 2.使内嵌支持宽高 3.换行被解析了 4.不设置的时候宽度由内容撑开 5.在IE6,7下步支持块标签 由于inline-block属性换行的时候被解析&#xff08;有间隙&#xff09;故解决方法使用浮动float:…

linux gst qt,【ARM-Linux开发】Gstreamer+QT+摄像头 编程总结

1,gstreamer开发手册&#xff0c;gstreamer官网(这些都不用说了吧)2&#xff0c;gst-launch的用法&#xff0c;这也不用说了吧。(白菜&#xff0c;鸡蛋&#xff0c;西红柿&#xff0c;砖头&#xff0c;鼠标……..)lqplayer--基于gstreamer和qt的Linux下的简单播放器。实现了基于…

背后的故事之 - 快乐的Lambda表达式(二)

快乐的Lambda表达式 上一篇 背后的故事之 - 快乐的Lambda表达式&#xff08;一&#xff09;我们由浅入深的分析了一下Lambda表达式。知道了它和委托以及普通方法的区别&#xff0c;并且通过测试对比他们之间的性能&#xff0c;然后我们通过IL代码深入了解了Lambda表达式&#x…

linux用vsc写c语言,vscode写c语言(windows)

用vscode学习c语言。记录vscode配置c语言编译环境。1.安装vscode(版本1.27)2.安装c/c扩展。配置环境变量&#xff0c;以WIN10为例 &#xff0c;此电脑-属性-高级系统设置-环境变量-系统变量-path-添加一条D:\Program Files\mingw-w64\i686-8.1.0-posix-dwarf-rt_v6-rev0\mingw3…

mouseevent tips

关于roll_over 和 mouse_over的区别&#xff0c;这篇文章说明的很清楚&#xff0c;http://zengrong.net/post/1105.htm 全文如下&#xff1a; 在MouseEvent中&#xff0c;ROLL_OVER和MOUSE_OVER、ROLL_OUT和MOUSE_OUT是两对比较相似的事件&#xff0c;它们有什么区别呢&#xf…

mt3 linux外网搭建,MT3 换皮梦幻 Linux端架设文字教程

1.安装宝塔yum install -y wget && wget -O install.shhttp://download.bt.cn/install/install.sh&& shinstall.sh获取宝塔地址 账号 密码开放端口10030 10011 10020 10003宝塔安装网站环境n1.14 mysql 5.6 php5.4关闭防火墙&#xff0c;我是7系统&…

一个有关数组的题

//在这里插入代码片import java.util.*; 1. (A rookie learning Java)写的一个有关数组的题 定义一个长度为10的整型数组&#xff0c; 循环输入10个整数然后判断这个数组中有几个偶数&#xff0c; 再定义一个正好能存放这几个偶数的数组&#xff0c; 将上一个数组中的所有偶数…

onCreateOptionsMenu

onCreateOptionsMenu----只在Activity创建时调用一次&#xff01;之后不会再被调用&#xff01;onPrepareOptionsMenu----每次display menu之前&#xff0c;都會调用该方法&#xff0c;  只要按一次menu按鍵&#xff0c;就會调用一次。  所以你會發現每次只要按一次menu按鍵…

linux识别UDF文件系统吗,Linux Kernel UDF文件系统本地缓冲区溢出漏洞

发布日期&#xff1a;2012-07-04更新日期&#xff1a;2012-07-05受影响系统&#xff1a;Linux kernel 3.3.x描述&#xff1a;--------------------------------------------------------------------------------BUGTRAQ ID: 54279Linux Kernel是Linux操作系统的内核。Linux K…

程序编译时书写Makefile注意事项一例

在进行程序编译时&#xff0c;可能需要指定一些库的库的路径、头文件的路径&#xff0c;分别使用的参数选项是-L和-I&#xff0c;需要注意的是&#xff1a;需要确保-L和-I后边的内容不为空&#xff0c;否则会出现意想不到的错误&#xff0c;而这种错误比较难以发现&#xff0c;…

把一个数组分为多个数组

/*int[]arr{1,2,5,213,75,42,64,48,21,44,22}; 分为3个数组 第一个数组满足全是偶数 第二个数组满足全是3的倍数 第三个数组满足其他*/ public class E{public static void main(String[]args){int[]arr{1,2,5,213,75,42,64,48,21,44,22};int b0,c0,d0;//遍历数组,得到每个数组…

window的war发布Linux失败,为什么war包在Windows的tomcat正常运行,在linux服务器报errorpage错误?...

最近项目完成后打包成war发布到服务器遇到访问应用404问题&#xff0c;用的是tomcat8.5&#xff0c;错误信息如下&#xff1a;o.s.b.w.servlet.support.ErrorPageFilter : Cannot forward to error page for request [/login] as the response has already been committed. As…

linux 命令行模式下,浏览网页方法

Ubuntu自带最新版的Gnome桌面&#xff0c;拥有大量的服务和桌面应用程序&#xff0c;让您仅通过一张安装光盘就可以体验到无比舒适的操作环境。下文介绍的在ubuntu下使用终端命令行上网的方法。 第一步&#xff0c;需要安装一个名为w3m的软件工具&#xff0c;打开终端&#xff…