无插件,无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

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

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

清除浮动的7种方法

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

背后的故事之 - 快乐的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…

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;//遍历数组,得到每个数组…

数组的增删

public class A {public static void main(String[] args) {int[] arr { 1, 2, 5, 23, 64, 9, 87, 99 };// 要求删除23int index -1;int num 23;for (int i 0; i < arr.length; i) {if (num arr[i]) {index i;}}for (int i index 1; i < arr.length; i) {arr[i -…

获取Android版本信息和电话信息

Android的版本信息可以通过android.os.Build获得&#xff0c;电话信息可以通过TelephonyManager获得&#xff0c;代码如下&#xff1a; private void get_infor(){sdk android.os.Build.VERSION.SDK;;release android.os.Build.VERSION.RELEASE;user android.os.Build.USER;…

简单的二维数组

/*找人,找到输出在第几楼第几号房间&#xff08;考虑没有找到的情况&#xff09;*/ /*{{"凤姐","蔡除坤","张洁"},{"姚鸣","芙蓉姐姐"},{"马尔克死","打仲马","肝塞特","高死你"}}…

用c语言程序编写一份试卷,C语言程序设计试题

C语言程序设计试题俗话说&#xff1a;“一份耕耘&#xff0c;一分收获。”耕耘就得付出一定的代价&#xff0c;没有那含辛如苦的“耕耘”&#xff0c;哪能领会到甜人心田的收获?以下是小编为大家搜索整理的C语言程序设计试题&#xff0c;希望能给大家带来帮助!更多精彩内容请及…

面向对象封装之无参无返,无参有返

public class E{public static void main(String[]args){EQ enew EQ();e.name"Mr.Deng";e.age29;e.weight50.5;e.hobby"Designing something that he like";e.jieShao();String be.sentPresence();//对象接受返回值System.out.println("Thats "b…

终端模拟器编译c语言,编写你自己的Terminal emulator

安装开发依赖环境在apt包管理器系中&#xff0c;使用以下命令安装apt install libvte-2.91-dev介绍VTE是一个使用GTK构建的一个终端模拟器库&#xff0c; 能够处理DPI的更改。很多终端模拟器软件都基于VTE库&#xff0c;包括GNOME Terminal&#xff0c; XFCE Terminal&#xff…

转:C#串口编程

本文用来简单介绍一下C#串口编程的知识&#xff0c;主要以实例为内容。 凡是串口设备和计算机交互的时候都用到串口&#xff0c;在C#中我们如何来操作串口呢&#xff1f; 大话串口工作原理 实际串口是用来和外部设备进行交换数据的&#xff0c;我抽象出下面一个图形&#xff0c…