- 浏览: 285660 次
- 性别:
- 来自: 哈尔滨
文章分类
最新评论
-
netfengxia:
这个是Mybatis哦. 是一个ORM框架, 这里展示的是My ...
mybatis merge 语句使用 -
MILLETS:
好像没有效果
jsp页面打印、预览、设置实现方案 -
evic520:
mysql有merge into的用法?是不是标题错了 楼主? ...
mybatis merge 语句使用 -
winner_king:
解决问题
pager-taglib分页中文乱码问题 -
Renee涟漪:
...
SVN搭建
最近项目相关功能中需要导出word文件,不过之前已经有同事完成了相关功能。他的实现方式如下:
<%@page contentType="application/msword; charset=UTF-8" %>。之后,使用系统数据替换jsp中对应的内容即可。
导出时,只需要将导出动作指向到该jsp页面,即可自动下载为word格式的文件。
经测试,通过以上方式导出word,打开文件后会提示某些文件丢失,导致word格式不完整,且打开后默认显示为html样式的问题。问题很诡异,因为之前同时做的时候没有发现这样的情况,而现在发现后也没有找到解决办法。-_-!!无奈就放弃了这个做法(项目时间原因。。。大家可以参考此方法,完全可行,就是不知道我们的问题出在哪。。。)。
word导出
下面是目前项目使用的导出方法,这个方法与上面的方法类似,是将wrod以xml格式进行处理,实现方式如下:
1.文本内容导出
将已准备好的word模板另存为xml格式(可选择2003xml格式,提高兼容性),然后将导出的xml格式化后直接拷贝到jsp,并在jsp开始位置加入
<%@page contentType="application/msword; charset=UTF-8" %>
,导出方式与html格式的一样。 xml格式的内容看起来更规范,也方便进行循环等数据操作。(关键是使用此方法后,word导出格式完全正常了^_^)
注:xml格式的word文件中首行内容
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
必须保证在jsp文件的第一行,否则导出的word将无法打开,提示格式错误。
2.图片导出到word
貌似这方面的资料比较少,查了很多资料才找到的-_-!!,实现方式如下:
将一个包含图片的word文件另存为xml格式,然后打开xml文件,可找到类似代码如下
- <w:pict>
- <v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">
- <v:stroke joinstyle="miter" />
- <v:formulas>
- <v:f eqn="if lineDrawn pixelLineWidth 0" />
- <v:f eqn="sum @0 1 0" />
- <v:f eqn="sum 0 0 @1" />
- <v:f eqn="prod @2 1 2" />
- <v:f eqn="prod @3 21600 pixelWidth" />
- <v:f eqn="prod @3 21600 pixelHeight" />
- <v:f eqn="sum @0 0 1" />
- <v:f eqn="prod @6 1 2" />
- <v:f eqn="prod @7 21600 pixelWidth" />
- <v:f eqn="sum @8 21600 0" />
- <v:f eqn="prod @7 21600 pixelHeight" />
- <v:f eqn="sum @10 21600 0" />
- </v:formulas>
- <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect" />
- <o:lock v:ext="edit" aspectratio="t" />
- </v:shapetype>
- <w:binData w:name="wordml://02000001.jpg" xml:space="preserve">
- /9j/4AAQSkZJRgABAgEAYABgAAD/7RguUGhvdG9zaG9wIDMuMAA4QklNA+0KUmVzb2x1dGlvbgAAAAAQAGAAAAABAAEAYAAAAAEAAThCSU0EDRhGWCBHbG9iYWwgTGlnaHRpbmcgQW5nbGUAAAAABAAA
- AHg4QklNBBkSRlggR2xvYmFsIEFsdGl0dWRlAAAAAAQAAAAeOEJJTQPzC1ByaW50IEZsYWdzAAAA
- CQAAAAAAAAAAAQA4QklNBAoOQ29weXJpZ2h0IEZsYWcAAAAAAQAAOEJJTScQFEphcGFuZXNlIFBy
- ...
- ...
- ...
- </w:binData>
- <v:shape id="_x0000_i1025" type="#_x0000_t75" <v:shape id="_x0000_i1025" type="#_x0000_t75"
- <v:imagedata src="wordml://02000001.jpg" o:title="Water lilies" />
- </v:shape>
- </w:pict>
<w:pict> <v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter" /> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0" /> <v:f eqn="sum @0 1 0" /> <v:f eqn="sum 0 0 @1" /> <v:f eqn="prod @2 1 2" /> <v:f eqn="prod @3 21600 pixelWidth" /> <v:f eqn="prod @3 21600 pixelHeight" /> <v:f eqn="sum @0 0 1" /> <v:f eqn="prod @6 1 2" /> <v:f eqn="prod @7 21600 pixelWidth" /> <v:f eqn="sum @8 21600 0" /> <v:f eqn="prod @7 21600 pixelHeight" /> <v:f eqn="sum @10 21600 0" /> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect" /> <o:lock v:ext="edit" aspectratio="t" /> </v:shapetype> <w:binData w:name="wordml://02000001.jpg" xml:space="preserve"> /9j/4AAQSkZJRgABAgEAYABgAAD/7RguUGhvdG9zaG9wIDMuMAA4QklNA+0KUmVzb2x1dGlvbgAAAAAQAGAAAAABAAEAYAAAAAEAAThCSU0EDRhGWCBHbG9iYWwgTGlnaHRpbmcgQW5nbGUAAAAABAAA AHg4QklNBBkSRlggR2xvYmFsIEFsdGl0dWRlAAAAAAQAAAAeOEJJTQPzC1ByaW50IEZsYWdzAAAA CQAAAAAAAAAAAQA4QklNBAoOQ29weXJpZ2h0IEZsYWcAAAAAAQAAOEJJTScQFEphcGFuZXNlIFBy ... ... ... </w:binData> <v:shape id="_x0000_i1025" type="#_x0000_t75" <v:shape id="_x0000_i1025" type="#_x0000_t75" <v:imagedata src="wordml://02000001.jpg" o:title="Water lilies" /> </v:shape> </w:pict>
注意
<w:binData w:name="wordml://02000001.jpg" xml:space="preserve"> ... ... </w:binData>
之间的内容,此标签所包含的内容便是我们要插入图片的Base64编码,我们需要做的就是将需要导出的图片转换为base64编码,然后将编码嵌入到对应的标签内即可。
实例代码(由于xml的内容太多,所以这里只给出主要内容,其他省略)
- <%@page contentType="application/msword; charset=UTF-8" %><?xml version="1.0" encoding="UTF-8" standalone="yes"?>
- <?mso-application progid="Word.Document"?>
- <w:wordDocument ... ... xml:space="preserve">
- ...
- ...
- ...
- <w:body>
- ...
- ...
- ...
- <%
- //將图片转换为Base64码
- String picBase64 = ToolKit.getImgBase64CodeStr(path);
- %>
- <w:tbl>
- <w:tblPr>
- <w:tblW w:w="0" w:type="auto" />
- <w:tblLook w:val="04A0" />
- </w:tblPr>
- <w:tblGrid>
- <w:gridCol w:w="4536" />
- </w:tblGrid>
- <w:tr wsp:rsidR="001023FB" wsp:rsidRPr="00E92BAD" wsp:rsidTr="003848F5">
- <w:tc>
- <w:tcPr>
- <w:tcW w:w="4536" w:type="dxa" />
- <w:vAlign w:val="center" />
- </w:tcPr>
- ...
- ...
- <w:pict>
- <v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" xath="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">
- <v:stroke joinstyle="miter" />
- <v:formulas>
- <v:f eqn="if lineDrawn pixelLineWidth 0" />
- <v:f eqn="sum @0 1 0" />
- <v:f eqn="sum 0 0 @1" />
- <v:f eqn="prod @2 1 2" />
- <v:f eqn="prod @3 21600 pixelWidth" />
- <v:f eqn="prod @3 21600 pixelHeight" />
- <v:f eqn="sum @0 0 1" />
- <v:f eqn="prod @6 1 2" />
- <v:f eqn="prod @7 21600 pixelWidth" />
- <v:f eqn="sum @8 21600 0" />
- <v:f eqn="prod @7 21600 pixelHeight" />
- <v:f eqn="sum @10 21600 0" />
- </v:formulas>
- <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect" />
- <o:lock v:ext="edit" aspectratio="t" />
- </v:shapetype>
- <w:binData w:name="wordml://02000001.jpg" xml:space="preserve"><%=picBase64%></w:binData>
- <v:shape id="_x0000_i1025" type="#_x0000_t75" <v:shape id="_x0000_i1025" type="#_x0000_t75"
- <v:imagedata src="wordml://02000001.jpg" o:title="Water lilies" />
- </v:shape>
- </w:pict>
- ...
- ...
- ...
- </w:body>
- </w:wordDocument>
<%@page contentType="application/msword; charset=UTF-8" %><?xml version="1.0" encoding="UTF-8" standalone="yes"?> <?mso-application progid="Word.Document"?> <w:wordDocument ... ... xml:space="preserve"> ... ... ... <w:body> ... ... ... <% //將图片转换为Base64码 String picBase64 = ToolKit.getImgBase64CodeStr(path); %> <w:tbl> <w:tblPr> <w:tblW w:w="0" w:type="auto" /> <w:tblLook w:val="04A0" /> </w:tblPr> <w:tblGrid> <w:gridCol w:w="4536" /> </w:tblGrid> <w:tr wsp:rsidR="001023FB" wsp:rsidRPr="00E92BAD" wsp:rsidTr="003848F5"> <w:tc> <w:tcPr> <w:tcW w:w="4536" w:type="dxa" /> <w:vAlign w:val="center" /> </w:tcPr> ... ... <w:pict> <v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" xath="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter" /> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0" /> <v:f eqn="sum @0 1 0" /> <v:f eqn="sum 0 0 @1" /> <v:f eqn="prod @2 1 2" /> <v:f eqn="prod @3 21600 pixelWidth" /> <v:f eqn="prod @3 21600 pixelHeight" /> <v:f eqn="sum @0 0 1" /> <v:f eqn="prod @6 1 2" /> <v:f eqn="prod @7 21600 pixelWidth" /> <v:f eqn="sum @8 21600 0" /> <v:f eqn="prod @7 21600 pixelHeight" /> <v:f eqn="sum @10 21600 0" /> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect" /> <o:lock v:ext="edit" aspectratio="t" /> </v:shapetype> <w:binData w:name="wordml://02000001.jpg" xml:space="preserve"><%=picBase64%></w:binData> <v:shape id="_x0000_i1025" type="#_x0000_t75" <v:shape id="_x0000_i1025" type="#_x0000_t75" <v:imagedata src="wordml://02000001.jpg" o:title="Water lilies" /> </v:shape> </w:pict> ... ... ... </w:body> </w:wordDocument>
- /**
- * 获取图片的Base64编码
- * @param imgFilePath 图片路径
- * @return
- */
- public static String getImgBase64CodeStr(String imgFilePath) {
- byte[] data = null;
- try {
- InputStream in = new FileInputStream(imgFilePath);
- data = new byte[in.available()];
- in.read(data);
- in.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- // 对字节数组Base64编码
- BASE64Encoder encoder = new BASE64Encoder();
- return encoder.encode(data);// 返回Base64编码后的字节字符串
- }
/** * 获取图片的Base64编码 * @param imgFilePath 图片路径 * @return */ public static String getImgBase64CodeStr(String imgFilePath) { byte[] data = null; try { InputStream in = new FileInputStream(imgFilePath); data = new byte[in.available()]; in.read(data); in.close(); } catch (IOException e) { e.printStackTrace(); } // 对字节数组Base64编码 BASE64Encoder encoder = new BASE64Encoder(); return encoder.encode(data);// 返回Base64编码后的字节字符串 }
如此便可将任意图片导出到word中。
3.导出中常见的问题及解决方法
(1)导出时抛出如下异常:
- org.apache.jasper.JasperException: Unable to compile class for JSP:
- An error occurred at line: 29 in the generated java file
- The code of method _jspService(HttpServletRequest, HttpServletResponse) is exceeding the 65535 bytes limit
- Stacktrace:
- at org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:92)
- at org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:330)
- ...
- ...
org.apache.jasper.JasperException: Unable to compile class for JSP: An error occurred at line: 29 in the generated java file The code of method _jspService(HttpServletRequest, HttpServletResponse) is exceeding the 65535 bytes limit Stacktrace: at org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:92) at org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:330) ... ...
此问题的主要原因是JAVA文件中对方法有一个大小限制,最大不超过64K,而我的JSP中编译成SERVLET代码的时候就变成了service方法,这个方法的大小不能超过64K,当JSP文件太大的时候编译成的serviece方法自然就超过了。(如果word模板的内容比较多或比较复杂,另存的xml文件就会非常大,当拷贝到jsp中进行编译的时候便会出现此问题)
解决方法就是将jsp文件通过<jsp:include>标签拆分为多个文件(这里不能使用<%@INCLUDE%>,具体原因请查看这两个标签的区别:http://lynn-hou.iteye.com/blog/689594)
(2)导出后提示无法打开文件,详细信息为: text/xml 声明只能出现在输入的开始位置
问题中已经说的很明白了,我在上面已经提示过了
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
必须放在jsp文件的第一行。如果此代码前还需要放其他内容,将所有内容放都放在第一行,不换行就可以了。例如
- <%@page contentType="application/msword; charset=UTF-8" %><?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<%@page contentType="application/msword; charset=UTF-8" %><?xml version="1.0" encoding="UTF-8" standalone="yes"?>
之后的内容可随意换行,一般不会出现什么问题。
(3)为导出的word文件命名
如果不为word命名,则导出的word文件会自动命名为你所访问的servlet的名称或其他名称。如果想自定义名称可在jsp中加入如下代码实现:
- response.setHeader("Content-disposition","attachment; filename="
- +new String("文件名称.doc".getBytes("gbk"),
- "ISO8859-1" ) +"");
response.setHeader("Content-disposition","attachment; filename=" +new String("文件名称.doc".getBytes("gbk"), "ISO8859-1" ) +"");
具体的编码可根据自己系统的编码进行修改,如果不转码名称中的中文一般都会出现乱码问题。
发表评论
-
java 实现指定日期添加天数(转)
2012-11-29 10:56 3556public static void main(String[ ... -
java根据文件路径获取文件名
2012-05-22 11:25 1354//获取文件名 String temp[] = use ... -
pager-taglib分页中文乱码问题
2012-02-13 11:32 3957问题:整个项目是struts2+spring,页面编码格式ut ... -
泛域名解析
2012-01-30 11:15 1198web.xml配置 <!-- webSite d ... -
java路径问题总结
2011-11-07 15:43 854平时写程序的时候,很多时候提示文件找不到,而抛出了异常,现在整 ... -
ParameterBlockJAI获取远端服务器图片尺寸
2011-11-07 14:03 1343public static String getPicSiz ... -
PlanarImage获取图片尺寸
2011-11-07 11:06 1109PlanarImage src = JAI.create(&q ... -
request获取页面checkbox(复选框)值
2011-04-01 11:35 2477String[] powerStr=request.ge ... -
读取txt、csv文件格式实例
2011-01-06 11:28 16131、TaoCanXinXiImportAction.java ... -
大数据量的excel读取poi实际应用
2011-01-06 11:21 33221、HxlsAbstract.java import ... -
(转)大数据量的excel文件读取——2003及之前版本(含代码及示例)
2010-12-24 11:38 2206现在的任务就是把客户数据迁移到数据库中,由于客户提供的数据都存 ... -
JFreeChart饼图、柱状图等
2010-12-21 10:25 849见附件文档 -
SimpleDateFormat使用
2010-12-02 11:18 1019import java.util.Date; import ... -
(转)java 常用工具包
2010-11-19 16:31 894java 常用工具包 -
(转)native2ascii转换中文properties文件
2010-11-18 14:41 1067问题描述: 在property文件中的中文,如果不经过enco ... -
java读取配置文件的几种方法(转载)
2010-11-09 16:04 896在现实工作中,我们常常需要保存一些系统配置信息,大家一般 ... -
系统定时任务--关于ant直接运行xxx.class
2010-11-04 14:59 25491、准备好你自己编写的java项目,已经生成class的。 ... -
file应用-按指定编码格式生成指定格式文件
2010-11-04 10:05 2514最近在开发一个,系统自动上传对账文件功能,由于里面用到一些fi ... -
数字转换字符串或者字符串不足长度补零
2010-11-03 15:16 1422package net.hlj.integralshop.ut ... -
java日期处理
2010-11-03 14:32 1241有关日期工具类(extends TimeUtil) Time ...
相关推荐
3. **导入与导出模板**:PDM系统通常有专门的模板管理模块,用户可以将本地创建的Word模板上传到系统,也可以将系统中的模板导出到本地。导出的过程可能涉及权限管理,只有具有相应权限的用户才能进行。 4. **使用...
java导出word使用freemarker模板map数据导出word带图片 可以循环map 中list。 调用的2种方法在博客 https://blog.csdn.net/yjflinchong/article/details/122614203
windows下,使用python 将Excel中数据批量导出到Word模板中生成新的文件
在给定的场景中,"asp.net 利用word模板导出word文件"涉及到的关键技术是OpenXML。 OpenXML是一种标准的文件格式,由Microsoft开发,用于存储Office文档,包括Word(.docx)、Excel(.xlsx)和PowerPoint(.pptx)...
本文将详细讲解如何使用.NET框架结合模板来导出Word文档,主要涉及的技术点包括C#编程语言、.NET Framework、以及Microsoft Office Interop库。 首先,`.NET导出word也包括按模板导出`是指利用.NET Framework提供的...
网络上的根据模板填充Word我都看过一些, 它们的功能在数据换行的时候用的是run对象的.addCarriageReturn()方法,或者是直接用\n实现换行。这些都不符合我的需求, 因为我要的是分段,而不是换行。换行的word导致另一...
在这个例子中,我们将探讨如何使用POI库来处理Word文档,特别是利用模板文件循环输出表格行并导出新的Word文档。这个过程在数据分析、报告生成或自动化文档制作等场景中非常有用。 首先,我们需要理解Word文档的...
在导出Word模板时,这些样式会被应用到相关的数据模型图表中,使得输出的文档具有统一且专业的视觉效果。 "word.rtp"文件则可能是PowerDesigner的报告模板文件。RTP(Report Template Profile)是PowerDesigner用来...
根据word模板导出word、...本资源中集成了 根据word模板导出word功能 、合并多个word功能 、word转换成pdf功能 、文件删除功能能。 其中坐标以$开头为一对一查询结果替换 $t为表格模板开头标识 $p为图片模板开头标识
总结,使用Java FreeMarker导出包含多张图片的Word文档,需要结合Apache POI库,创建合适的模板,处理图片数据,并通过FreeMarker将模板与数据合并。这个过程涉及到文件操作、模板引擎的理解以及对Word文档结构的...
标题 "pb数据窗口导出到word或者excle" 涉及的是在PowerBuilder(PB)环境中使用数据窗口(DataWindow)组件将数据导出到Microsoft Word或Excel文档的操作。PowerBuilder是一种流行的可视化开发工具,主要用于构建...
在模板导出Word的场景中,Aspose.Words的邮件合并功能特别有用,它能够方便地将数据库或其他数据源中的数据与Word模板结合,生成批量的个性化文档。 5. **数据绑定**:在模板导出Word的过程中,数据绑定是关键步骤...
"PDM导出通用模板wordTemplate"标题所指的,是利用PowerDesigner的特性,将数据模型(Physical Data Model,简称PDM)导出为Word文档,使用一个通用的模板来呈现,方便用户查看和交流。 这个通用模板,即"word...
5. **导出Word**:完成所有操作后,使用Easypoi的`write()`方法将Word文档写入到指定的文件路径,完成导出。 关于标签“echart”,需要注意的是,Echarts图表在Word中的插入并非直接嵌入JavaScript可交互的图表,...
使用C# NET Core技术,通过预设的html模板,导出Word文件,Html文件,Pdf,使用说明参考https://blog.csdn.net/qq_27337291/article/details/120676751?spm=1001.2014.3001.5501
首先,我们来理解“pb 把数据库中的数据导出word文档格式”的具体步骤: 1. 数据提取:在PB应用中,你需要连接到目标数据库,这可能包括SQL Server、Oracle、MySQL等。使用PB的数据窗口对象,你可以轻松地查询、...
在IT领域,尤其是在软件开发中,常常需要将用户界面(UI)中的数据导出到不同的文件格式,如Word和Excel,以实现数据的持久化存储和处理。在本例中,我们将关注如何使用Qt框架来实现这个功能,特别是将用户在Qt界面...
在将数据表导出为 Word 文档时,需要使用字段信息模板。该模板定义了字段的名称、描述、类型、长度、是否允许为空、默认值等信息。模板中可以调整列宽、行高、单元格字体、文字描述及页面设置等样式,以满足不同的...
Power Designer导出word模板下载,Power Designer导出数据结构模板下载
最近因项目开发的需要,整理了一份用JAVA导出WORD文档,其部署步骤如下: 1、将jacob-1.14.3-x86.dll放在服务器的系统盘(或运行本机的系统):\WINDOWS\system32目录下。 2、将jacob-1.14.3-x86.dll放在JDK 的 bin ...