JAVA不使用POI,用PageOffice动态导出Word文档
java如何生成word文档_使用Java生成word文档(附源码)
java如何生成word文档_使用Java生成word文档(附源码)当我们使用Java生成word文档时,通常首先会想到iText和POI,这是因为我们习惯了使用这两种方法操作Excel,自然而然的也想使用这种生成word文档。
但是当我们需要动态生成word时,通常不仅要能够显示word中的内容,还要能够很好的保持word中的复杂样式。
这时如果再使用IText和POI去操作,就好比程序员去搬砖一样痛苦。
这时候,我们应该考虑使用FreeMarker的模板技术快速实现这个复杂的功能,让程序员在喝咖啡的过程中就把问题解决。
实现思路是这样的:先创建一个word文档,按照需求在word中填好一个模板,然后把对应的数据换成变量${},然后将文档保存为xml文档格式,使用文档编辑器打开这个xml格式的文档,去掉多余的xml符号,使用Freemarker读取这个文档然后替换掉变量,输出word文档即可。
具体过程如下:1.创建带有格式的word文档,将该需要动态展示的数据使用变量符替换。
2.将刚刚创建的word文档另存为xml格式。
3.编辑这个XMl文档去掉多余的xml标记,如图中蓝色部分4.从官网最新的开发包,将freemarker.jar拷贝到自己的开发项目中。
5.新建DocUtil类,实现根据Doc模板生成word文件的方法package com.favccxx.secret.util;import java.io.BufferedWriter;import java.io.File;import java.io.FileOutputStream;import java.io.OutputStreamWriter;import java.io.Writer;import java.util.Map;import freemarker.template.Configuration;import freemarker.template.DefaultObjectWrapper;import freemarker.template.Template;import freemarker.template.TemplateExceptionHandler;public class DocUtil {privateConfiguration configure = null;publicDocUtil(){configure= new Configuration();configure.setDefaultEncoding("utf-8");}/*** 根据Doc模板生成word文件* @param dataMap Map 需要填入模板的数据* @param fileName 文件名称* @param savePath 保存路径*/publicvoid createDoc(Map dataMap, String downloadType, StringsavePath){try{//加载需要装填的模板Templatetemplate = null;//加载模板文件configure.setClassForTemplateLoading(this.getClass(),"/com /favccxx/secret/templates");//设置对象包装器configure.setObjectWrapper(newDefaultObjectWrapper());//设置异常处理器configure.setT emplateExceptionHandler(TemplateException Handler.IGNORE_HANDLER);//定义Template对象,注意模板类型名字与downloadType要一致template= configure.getTemplate(downloadType + ".xml");//输出文档FileoutFile = new File(savePath);Writerout = null;out= new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),"utf-8"));template.process(dataMap,out);outFile.delete();}catch (Exception e) {e.printStackTrace();}}}6.用户根据自己的需要,调用使用getDataMap获取需要传递的变量,然后调用createDoc方法生成所需要的文档。
用PageOffice实现批量转换导出Word文档
用PageOffice实现C# 批量转换导出Word文档在某些涉及到报表的项目开发中,可能经常会遇到需要批量的生成某些文档的操作,这些文档若是要点击一下,生成一个的话,就太浪费时间了。
但若用FileMakerCtrl控件来实现的话就简单容易的多了。
下面我就以批量转换10个Word文档为例来分享一下FileMakerCtrl控件的使用方法。
第一步:请先安装PageOffice的服务器端的安装程序,之后在你的网站或项目的根目录下添加pageoffice文件夹(在PageOffice官方网站的“下载中心”中可下载相应的压缩包,解压之后直接将PageOffice实例代码里的pageoffice文件夹拷贝到根目录下就可以了)。
第二步:在网站或项目中添加文件夹存放word模板文件,我习惯命名为“doc”,将要打开的文件拷贝到该文件夹下,我要转换的文件为“template.doc”,该文件中有一个书签,名称为“PO_company”。
第三步:在网站或项目中创建动态页面FileMaker.aspx。
在工具箱中拖动一个FileMakerCtrl控件到页面上(FileMakerCtrl控件位于工具箱最下方)。
在FileMaker.aspx.cs后台页面中,添加代码如下://设置服务器页面FileMakerCtrl1.ServerPage = "pageoffice/server.aspx";string id = Request.QueryString["id"];if (id != null&& id.Length > 0){PageOffice.WordWriter.WordDocument doc = newPageOffice.WordWriter.WordDocument();//禁用右击事件doc.DisableWindowRightClick = true;//给数据区域赋值,即把数据填充到模板中相应的位置doc.OpenDataRegion("PO_company").Value = "北京卓正志远软件有限公司" + id;//设置保存页面FileMakerCtrl1.SaveFilePage = "Savemaker.aspx?id=" + id;FileMakerCtrl1.SetWriter(doc);//设置转换完成后执行的JS函数FileMakerCtrl1.JsFunction_OnProgressComplete = "OnProgressComplete()";//打开文档FileMakerCtrl1.FillDocument(Server.MapPath("doc/template.doc"),PageOffice.DocumentOpenType.Word);}在前台添加JS函数OnProgressComplete()如下:function OnProgressComplete() {window.parent.myFunc(); //调用父页面(Default.aspx)的js函数}第四步:在网站或项目中创建动态页面SaveMaker.aspx,保存转换后的Word 文档到本地磁盘上,部分代码如下://定义FileSaver对象PageOffice.FileSaver fs = new PageOffice.FileSaver();string fileName = "maker" + id + fs.FileExtName;//将Word文档保存到本地磁盘上fs.SaveToFile(Server.MapPath("doc/") + fileName);fs.Close();第五步:在网站或项目中创建动态页面Default.aspx。
java导出之导出word文档
java导出之导出word⽂档Springboot之word导出1.简介导出word实现⽤的⼯具是poi-tl,主要是通过预先设置word模板格式,通过数据填充来实现数据动态录⼊。
⽀持动态表格以及图。
使⽤步骤主要分为准备冰箱,准备象,把象装进冰箱。
2.准备环境(冰箱)包括两种,导包和模板预设置com.deepoove poi-tl 1.9.1 注意:poi-tl版本对阿帕奇的poi版本依赖有条件,低版本会报错,Tomcat会默认依赖低版本的jar包。
准备模板,模板可以设置⾏⾼,位置,固定宽度和最⼩⾼度,可以保证内容显⽰完全3.准备数据(⼤象)######Controller 层,返回值和两个⼊参public ResponseEntity<byte[]> exportJbZwJlxx(HttpServletRequest request, HttpServletResponse response) {//任免表⾥,需要基本信息,职务信息,部门⼈员信息,简历信息以及个⼈经历信息if(jbZwJlxxScCxDto.getDxbz()==null || "".equals(jbZwJlxxScCxDto.getDxbz()) ){log.error("档案薪酬判断标志不能为空");throw new RuntimeException("dxbz不能为空,或者为空字符串");}try {return jbZwJlxxService.getParams(jbZwJlxxScCxDto);} catch (Exception e) {log.error("导出失败",e);}return null;}######Service层获取数据,格式如下,和模板上对应即可Map<String, Object> params = new HashMap<>(100);params.put("jljj",!jlxxBean.getJljj().equals(CmGbglConstants.SPACE)? jlxxBean.getJljj() : "⽆");######动态表格的数据封装,通过**对象的属性赋值**int length = 7;// 返回数据超过七条if (res.size() > length) {length = res.size();// 封装查询回来的⼤于7的对象for (int i = 0; i < length; i++) {QtxxDto qtxxDto = new QtxxDto();qtxxDto = res.get(i);Map<String,Object> detailMap = new HashMap<String, Object>(7);detailMap.put("cw", qtxxDto.getCw());detailMap.put("name", qtxxDto.getName());qtxxDto.setCsny(getAge(qtxxDto.getCsny())+"");detailMap.put("csny", qtxxDto.getCsny());detailMap.put("zzmmmc",qtxxDto.getZzmmmc());detailMap.put("gzdwjzw",qtxxDto.getGzdwjzw());detailList.add(detailMap);qtxxDtos.add(qtxxDto);}} else {// 数据集长度⼩于七条for (int i = 0; i < res.size(); i++) {QtxxDto qtxxDto = new QtxxDto();qtxxDto = res.get(i);qtxxDto.setCsny(getAge(qtxxDto.getCsny())+"");qtxxDtos.add(qtxxDto);}for (int j = 0; j < (length - res.size()); j++) {QtxxDto qtxxDto = new QtxxDto();qtxxDtos.add(qtxxDto);}}}params.put("detailList", qtxxDtos);4.和模板建⽴关系try{//获得模板⽂件的输⼊流,这个是放在启动器的那个项⽬的resource下InputStream in = this.getClass().getResourceAsStream("/word/rmb.docx");//表格⾏循环插件HackLoopTableRenderPolicy policy = new HackLoopTableRenderPolicy();//绑定detailListConfigure config = Configure.builder().bind("detailList", policy).build();XWPFTemplate template = pile(in , config).render(params);String fileName = new String("rmb.docx".getBytes("UTF-8"), "iso-8859-1");ByteArrayOutputStream outputStream = new ByteArrayOutputStream();template.write(outputStream);template.close();HttpHeaders httpHeaders = new HttpHeaders();httpHeaders.add("content-disposition", "attachment;filename=" + fileName);httpHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);ResponseEntity<byte[]> filebyte = new ResponseEntity<byte[]>(outputStream.toByteArray(), httpHeaders,HttpStatus.CREATED);outputStream.close();return filebyte;} catch (Exception e) {log.error("导出失败", e);throw e;}注意:模板放置的位置可以放在resource下,在本地编译的时候可以使⽤类加载器获取,但是打包到正式环境后就会找不到模板。
JAVA导出WORD与EXCEL
package ais.mytest.web;/*** 功能:主要实现数据导出Excel和Word功能* 日期:2008-2-28*/import ais.basic.service.BasicUtil;import mons.file.service.FileService; import ais.framework.web.BaseAction;import ais.mytest.model.Employeer;import ais.mytest.service.IemployeerService;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.text.DecimalFormat;import jxl.write.NumberFormat;import java.util.List;import javax.servlet.ServletOutputStream; import jxl.Cell;import jxl.Workbook;import jxl.format.Alignment;import jxl.format.UnderlineStyle;import jxl.format.VerticalAlignment;import jxl.format.Border;import jxl.format.BorderLineStyle;import jxl.format.BoldStyle;import jxl.format.Colour;import jxl.write.Blank;import jxl.write.DateFormat;import jxl.write.DateTime;import bel;import jxl.write.WritableCellFormat;import jxl.write.WritableFont;import jxl.write.WritableImage;import jxl.write.WritableSheet;import jxl.write.WritableWorkbook;//import com.ibm.icu.text.SimpleDateFormat;//import com.lowagie.text.Cell;import com.lowagie.text.Document;import com.lowagie.text.Font;import com.lowagie.text.Image;import com.lowagie.text.PageSize;import com.lowagie.text.Paragraph;import com.lowagie.text.Table;import com.lowagie.text.pdf.BaseFont;import com.lowagie.text.rtf.RtfWriter2;import java.awt.Color;import java.io.InputStream;import java.io.OutputStream;import org.apache.struts2.ServletActionContext;public class ExportAction extends BaseAction{/****/private static final long serialVersionUID = -3951404867065653031L;FileService fileService;BasicUtil basicUtil;IemployeerService iemployeerService;Employeer employeer;String filename=System.currentTimeMillis()+".doc";public ExportAction() {}/*** 功能:将数据库中的数据导出word* 日期:2008-2-29* @return*/// 复制一份新的RTF文件public String getNewFilePath() throws Exception {InputStream ins = ServletActionContext.getServletContext().getResourceAsStream("/empty.doc");byte[] b = new byte[ins.available()];ins.read(b);ins.close();String newFileName = ServletActionContext.getServletContext().getRealPath("")+ "/"+filename;OutputStream ous = new FileOutputStream(newFileName);ous.write(b);ous.close();return newFileName;}// 将二进制流写到客户端public void writeNewFile(String newFilePath, String downloadFileName)throws Exception {File f = new File(newFilePath);InputStream ins = new FileInputStream(f);byte[] b = new byte[ins.available()];ins.read(b);ins.close();/* <option value="image/bmp">BMP</option><option value="image/gif">GIF</option><option value="image/jpeg">JPEG</option><option value="image/tiff">TIFF</option><option value="image/x-dcx">DCX</option><option value="image/x-pcx">PCX</option><option value="text/html">HTML</option><option value="text/plain">TXT</option><option value="text/xml">XML</option><option value="application/afp">AFP</option><option value="application/pdf">PDF</option><option value="application/pdf">zip</option><option value="application/rtf">RTF</option><option value="application/msword">MSWORD</option><option value="application/vnd.ms-excel">MSEXCEL</option><option value="application/vnd.ms-powerpoint">MSPOWERPOINT</option><option value="application/wordperfect5.1">WORDPERFECT</option><option value="application/vnd.lotus-wordpro">WORDPRO</option><option value="application/vnd.visio">VISIO</option><option value="application/vnd.framemaker">FRAMEMAKER</option><option value="application/vnd.lotus-1-2-3">LOTUS123</option>*//*** 出现保存与打开对话框application/octet-stream,加上下面第二句是保存时能正确出现文件类型*///getResponse().setContentType("application/octet-stream");//getResponse().setHeader("Content-Disposition","attachment;filename=\""+ new String((downloadFileName).getBytes(),"ISO-8859-1") + "\";");/*** 直接打开word文档*/getResponse().setContentType("application/msword");ServletActionContext.getResponse().getOutputStream().write(b);//文件删除if (f != null) {f.delete();}}/*** @param em_name 姓名* @param em_sex 性别* @param em_age 年龄* @param em_duty 职务* @param em_pay 工资* @param em_polity 政治面貌* @param em_address 住址*/public void createWord(String eMname,String eMsex,int eMage,String eMduty, Double eMpay, String eMpolity,String eMaddress) throws Exception {// 创建word文档Document document = new Document(PageSize.A4);// 输入word文档String newFilePath = getNewFilePath();RtfWriter2.getInstance(document, new FileOutputStream(newFilePath));document.open();// 中文字体BaseFont bfChinese = BaseFont.createFont("STSongStd-Light","UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);Font fontChinese = new Font(bfChinese, 12, Font.BOLD);Table table = new Table(4, 4);Paragraph paragraph = new Paragraph("XX单位员工信息表", fontChinese);paragraph.setAlignment(Paragraph.ALIGN_CENTER);document.add(paragraph);table.setBorderWidth(2);table.setBorderColor(new Color(0, 0, 0));table.setPadding(5);table.setSpacing(0);table.setAutoFillEmptyCells(true);com.lowagie.text.Cell cell = new com.lowagie.text.Cell(new Paragraph("姓名", fontChinese));table.addCell(cell);cell = new com.lowagie.text.Cell(eMname);table.addCell(cell);cell = new com.lowagie.text.Cell(new Paragraph("性别", fontChinese));table.addCell(cell);cell = new com.lowagie.text.Cell(eMsex);table.addCell(cell);cell = new com.lowagie.text.Cell(new Paragraph("年龄", fontChinese));table.addCell(cell);cell = new com.lowagie.text.Cell(Integer.valueOf(eMage).toString());table.addCell(cell);cell = new com.lowagie.text.Cell(new Paragraph("政治面貌", fontChinese));table.addCell(cell);cell = new com.lowagie.text.Cell(eMpolity);table.addCell(cell);cell = new com.lowagie.text.Cell(new Paragraph("职务", fontChinese));table.addCell(cell);cell = new com.lowagie.text.Cell(eMduty);table.addCell(cell);cell = new com.lowagie.text.Cell(new Paragraph("工资", fontChinese));table.addCell(cell);cell = new com.lowagie.text.Cell(Double.valueOf(eMpay).toString());//cell.setColspan(5);table.addCell(cell);cell = new com.lowagie.text.Cell(new Paragraph("住址", fontChinese));table.addCell(cell);cell = new com.lowagie.text.Cell(eMaddress);cell.setColspan(3);table.addCell(cell);cell = new com.lowagie.text.Cell(new Paragraph("\n\n\n教育背景:\n\n\n", fontChinese));cell.setVerticalAlignment(com.lowagie.text.Cell.ALIGN_CENTER);cell.setHorizontalAlignment(com.lowagie.text.Cell.ALIGN_CENTER);table.addCell(cell);cell = new com.lowagie.text.Cell("");cell.setVerticalAlignment(com.lowagie.text.Cell.ALIGN_CENTER);cell.setHorizontalAlignment(com.lowagie.text.Cell.ALIGN_CENTER);cell.setColspan(3);table.addCell(cell);cell = new com.lowagie.text.Cell(new Paragraph("\n\n\n工作经历\n\n\n",fontChinese));cell.setVerticalAlignment(com.lowagie.text.Cell.ALIGN_CENTER);cell.setHorizontalAlignment(com.lowagie.text.Cell.ALIGN_CENTER);table.addCell(cell);cell = new com.lowagie.text.Cell( "");cell.setVerticalAlignment(com.lowagie.text.Cell.ALIGN_CENTER);cell.setHorizontalAlignment(com.lowagie.text.Cell.ALIGN_CENTER);cell.setColspan(3);table.addCell(cell);cell = new com.lowagie.text.Cell(new Paragraph("\n\n\n\n\t\t\t\t\t(盖章)年月日\n\n\n",fontChinese));cell.setVerticalAlignment(com.lowagie.text.Cell.ALIGN_CENTER);cell.setHorizontalAlignment(com.lowagie.text.Cell.ALIGN_CENTER);cell.setColspan(4);table.addCell(cell);document.add(table);// 在表格末尾添加图片Imagepng=Image.getInstance(ServletActionContext.getServletContext().getRealPath("")+"/png-0662.png");document.add(png);// 分页document.newPage();document.close();}public String exportword(){String eMname="李小明";String eMsex="男";int eMage=25;String eMduty="经理";Double eMpay=2580.78;String eMpolity="党员";String eMaddress="天津市清河县大柳营镇";try {String newFilePath1 = getNewFilePath();createWord(eMname,eMsex,eMage,eMduty,eMpay,eMpolity,eMaddress);writeNewFile(newFilePath1, filename);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}/*** 功能:将数据库中的数据导出excel* 日期:2008-3-28*/public String exportexcel(){getResponse().setContentType("application/vnd.ms-excel");File f1 = null;//得到服务器路径String path = getRequest().getSession().getServletContext().getRealPath("")+File.separator;//文件名生成String filename="temp";filename=System.currentTimeMillis()+".xls";File f = new File(path+"Book2.xlt");// 定义一个模板,放在服务器相应路径下.Workbook workbook = null;WritableWorkbook writableWorkbook = null;String workwheet="工作表名";try {/*** 使用文件输入输出流读取Excel模板,重新写入新文件,就是为了读到其EXCEL格式.* 所以在服务器相应文件,必须有一个空Excel文件,如:Book1.xls*/FileInputStream fis = new FileInputStream(f);byte[] b = new byte[fis.available()];fis.read(b);fis.close();f1 = new File(path+filename);FileOutputStream fos = new FileOutputStream(f1);fos.write(b);fos.close();workbook = Workbook.getWorkbook(f1);ServletOutputStream os = getResponse().getOutputStream();//.createWorkbook(os, workbook);writableWorkbook = Workbook.createWorkbook(f1);WritableSheet ws = writableWorkbook.getSheet(0);//添加第四个工作表WritableSheet sheet = writableWorkbook.createSheet(workwheet,4);//定义样式:包括字体样式WritableFont wf1 = new WritableFont(WritableFont.TIMES,18,WritableFont.BOLD,false,UnderlineStyle.NO_UNDERLINE,Co lour.RED);WritableCellFormat wcf1 = new WritableCellFormat(wf1);//背景样式wcf1.setBackground(Colour.YELLOW2);//对齐方式wcf1.setAlignment(Alignment.CENTRE);wcf1.setVerticalAlignment(VerticalAlignment.CENTRE);WritableFont wf2 = new WritableFont(WritableFont.TIMES,11,WritableFont.NO_BOLD);;WritableCellFormat wcf2 = new WritableCellFormat(wf2);wcf2.setAlignment(Alignment.CENTRE);//边框线设置wcf2.setBorder(Border.ALL,BorderLineStyle.THIN);WritableFont wf3 = new WritableFont(WritableFont.TIMES,12,WritableFont.BOLD);WritableCellFormat wcf3 = new WritableCellFormat(wf3);wcf3.setAlignment(Alignment.CENTRE);wcf3.setBorder(Border.ALL,BorderLineStyle.THIN);//显示数字形式NumberFormat wf5=new NumberFormat("#0.00");WritableCellFormat wcf5 = new WritableCellFormat(wf5);wcf5.setAlignment(Alignment.CENTRE);wcf5.setBorder(Border.ALL,BorderLineStyle.THIN);//添加带有formatting的DateFormat对象DateFormat df = new DateFormat("yyyy-MM-dd hh:mm:ss");WritableCellFormat wcfdf = new WritableCellFormat(df);wcfdf.setAlignment(Alignment.CENTRE);wcfdf.setBorder(Border.ALL,BorderLineStyle.THIN);//数字格式显示两位小数DecimalFormat dfformat = new DecimalFormat("###,##0.00");//输出表头Label l = null;int k = 0;//ws.mergeCells(0,k,7,k); //合并单元格,表示合并第0行第0列到第0行第7列/*** 功能:下面5句实现在模板中任何单元格定义名称EM_name,通过findCellByName查找* 如果找到,则将获取标记单元格的位置,并将内容填入,找不到,不管.* 实现了程序充许可以任何定义有限范围的模板定义.* 日期:2008-2-28**/Cell cl=writableWorkbook.findCellByName("EM_name");if(cl!=null){//System.out.println(cl.getContents()+"找到了"+cl.getColumn()+"---"+cl.getRow());l = new Label(cl.getColumn(),cl.getRow(), "网通审计人员统计报表", wcf1); //将内容填入ws.addCell(l);ws.setRowView(k,700); //设置单元格宽度,k表示行,500表示高度}k++;ws.mergeCells(0,k,1,k);l = new Label(0,k, "填报单位:", wcf3);ws.addCell(l);ws.mergeCells(2,k,5,k);l = new Label(2,k, "审计部一处", wcf3);ws.addCell(l);l = new Label(6,k, "日期:", wcf3);ws.addCell(l);//l = new Label(7,k, "2008-03-15", wcfdf);DateTime lt = new DateTime(7,k,new java.util.Date(),wcfdf);ws.addCell(lt);k++;l = new Label(0,k, "序号", wcf3);ws.addCell(l);l = new Label(1,k, "姓名", wcf3);ws.addCell(l);l = new Label(2,k, "性别", wcf3);ws.addCell(l);l = new Label(3,k, "年龄", wcf3);ws.addCell(l);l = new Label(4,k, "职务", wcf3);ws.addCell(l);l = new Label(5,k, "工资", wcf3);ws.addCell(l);l = new Label(6,k, "政治面貌", wcf3);ws.addCell(l);l = new Label(7,k, "地址", wcf3);ws.addCell(l);ws.setColumnView(7,30); //设置单元格宽度,7表示列,30表示宽度//输出内容List<Employeer> emlist=iemployeerService.getEmployeerAll("from Employeer");for(int i=0;i<emlist.size();i++){k++;l = new Label(0,k, Integer.valueOf(emlist.get(i).getId()).toString(), wcf2);ws.addCell(l);l = new Label(1,k, emlist.get(i).getEm_name(), wcf2);ws.addCell(l);l = new Label(2,k, emlist.get(i).getEm_sex(), wcf2);ws.addCell(l);l = new Label(3,k, Integer.valueOf(emlist.get(i).getEm_age()).toString(), wcf2);ws.addCell(l);l = new Label(4,k, emlist.get(i).getEm_duty(), wcf2);ws.addCell(l);l = new Label(5,k, dfformat.format(emlist.get(i).getEm_pay()).toString(), wcf5);ws.addCell(l);l = new Label(6,k, emlist.get(i).getEm_polity(), wcf2);ws.addCell(l);l = new Label(7,k, emlist.get(i).getEm_address(), wcf2);ws.addCell(l);}//添加图片,只支持png格式,注意在服务器启动时,第一次将png图片放进去,读取时是不显示的.需得启服务器.ws.mergeCells(5, 5, 6, 10);WritableImage wbi=new WritableImage(5, 5, 6, 10, new File(path+"png-0662.png"));ws.addImage(wbi);writableWorkbook.write();//得到工作表行数int cnt = ws.getRows();System.out.println("表行数有:"+cnt);//工作表某一单元格内容Cell cell = ws.getCell(0,0);System.out.println("0行0列内容是:" + cell.getContents());} catch (Exception e) {e.printStackTrace();} finally {if (writableWorkbook != null)try {writableWorkbook.close();} catch (Exception e) {// Exception}if (f1.exists()) {f1.delete();System.out.println("文件已经删除!");} else {/*try {f1.createNewFile();} catch (IOException e) {e.printStackTrace();}System.out.println("文件已经创建!");*/}}return null;}public BasicUtil getBasicUtil() {return basicUtil;}public void setBasicUtil(BasicUtil basicUtil) {this.basicUtil = basicUtil;}public FileService getFileService() {return fileService;}public void setFileService(FileService fileService) {this.fileService = fileService;}public IemployeerService getIemployeerService() {return iemployeerService;}public void setIemployeerService(IemployeerService iemployeerService) { this.iemployeerService = iemployeerService;}public Employeer getEmployeer() {return employeer;}public void setEmployeer(Employeer employeer) {this.employeer = employeer;} }。
不用POI技术,JAVA给Word文档中的数据区域赋值
不用POI技术,JAVA给Word文档中的数据区域赋值在本地磁盘上打开一个Word文件,添加内容或插入图片是十分容易的,但是如何在线打开一个Word文件并修改Word文件内容或者插入图片呢,这时就需要通过PageOffice开发平台,给数据区域赋值,来实现这一目标了。
具体实现步骤如下:第一步:拷贝文件到WEB项目的“WEB-INF/lib”目录下。
拷贝PageOffice 示例中下的“WEB-INF/lib”路径中的pageoffice.cab和pageoffice.jar到新建项目的“WEB-INF/lib”目录下。
第二步:修改WEB项目的配置文件。
将如下代码添加到配置文件中:<!-- PageOffice Begin --><servlet><servlet-name>poserver</servlet-name><servlet-class>com.zhuozhengsoft .pageoffice.poserver.Server</servlet-class></servlet><servlet-mapping><servlet-name>poserver</servlet-name><url-pattern>/poserver.do</url-pattern></servlet-mapping><servlet-mapping><servlet-name>poserver</servlet-name><url-pattern>/pageoffice.cab</url-pattern></servlet-mapping><servlet-mapping><servlet-name>poserver</servlet-name><url-pattern>/popdf.cab</url-pattern></servlet-mapping><servlet-mapping><servlet-name>poserver</servlet-name><url-pattern>/sealsetup.exe</url-pattern></servlet-mapping><servlet><servlet-name>adminseal</servlet-name><servlet-class>com.zhuozhengsoft.pageoffice.poserver.AdminSeal </servlet-class></servlet><servlet-mapping><servlet-name>adminseal</servlet-name><url-pattern>/adminseal.do</url-pattern></servlet-mapping><servlet-mapping><servlet-name>adminseal</servlet-name><url-pattern>/loginseal.do</url-pattern></servlet-mapping><servlet-mapping><servlet-name>adminseal</servlet-name><url-pattern>/sealimage.do</url-pattern></servlet-mapping><mime-mapping><extension>mht</extension><mime-type>message/rfc822</mime-type></mime-mapping><context-param><param-name>adminseal-password</param-name><param-value>123456</param-value></context-param><!-- PageOffice End -->第三步:添加引用。
Java使用模板导出word文档
Java使⽤模板导出word⽂档Java使⽤模板导出word⽂档需要导⼊freemark的jar包1. 使⽤word模板,在需要填值的地⽅使⽤字符串代替,是因为word转换为xml⽂件时查找不到要填⼊内容的位置。
尽量不要在写字符串的时候就加上${},xml⽂件会让它和字符串分离。
⽐如:姓名| name2. 填充完之后,把word⽂件另存为xml⽂件,然后使⽤notepad 等编辑软件打开,打开之后代码很多,也很乱,根本看不懂,其实也不⽤看懂哈,搜索找到你要替换的位置的字符串,⽐如name,然后加上${},变成${name}这样,然后就可以保存了,之后把保存的⽂件名后缀替换为.ftl。
模板就ok了。
3. 有个注意事项,这⾥的值⼀定不可以为空,否则会报错,freemark有判断为空的语句,这⾥⽰例⼀个,根据个⼈需求,意思是判断name是否为空,trim之后的lenth是否⼤于0:<#if name?default("")?trim?length gt 0><w:t>${name}</w:t></#if>4. 如果在本地的话可以直接下载下来,但是想要在通过前端下载的话那就需要先将⽂件下载到本地,当作临时⽂件,然后在下载⽂件。
接下来上代码,⽰例:public void downloadCharge(String name, HttpServletRequest request, HttpServletResponse response) {Map<String, Object> map = new HashMap<>();map.put("name", name);Configuration configuration = new Configuration();configuration.setDefaultEncoding("utf-8");try { //模板存放位置InputStream inputStream = this.getClass().getResourceAsStream("/template/report/XXX.ftl");Template t = new Template(null, new InputStreamReader(inputStream));String filePath = "tempFile/";//导出⽂件名String fileName = "XXX.doc";//⽂件名和路径不分开写的话createNewFile()会报错File outFile = new File(filePath + fileName);if (!outFile.getParentFile().exists()) {outFile.getParentFile().mkdirs();}if (!outFile.exists()) {outFile.createNewFile();}Writer out = null;FileOutputStream fos = null;fos = new FileOutputStream(outFile);OutputStreamWriter oWriter = new OutputStreamWriter(fos, "UTF-8");//这个地⽅对流的编码不可或缺,使⽤main()单独调⽤时,应该可以,但是如果是web请求导出时导出后word⽂档就会打不开,并且包XML⽂件错误。
java导出word文件
java导出word⽂件test5.ftl⽂件⽣存⽅法,第⼀步:⽤word新建test5.doc,填写完整模板,将需导出数据⽤${}代替第⼆步:将test5.doc另存为test5.xml第三部:将test5.xml重命名为test5.ftl第四步:⽤记事本打开test5.ftl,在${}⼤括号之间填写相应的属性即可1.jsp中的js代码 //导表function exportExcel(){ window.location.href="<%=basePath%>student!myExportWord.action";}2、action中的代码(StudentAction.java)public void myExportWord(){Student student = new Student();student.setName("张国荣");student.setCode("123456789");student.setAge("45");student.setGrade("gradeOne");student.setTest("国际巨星");student.setXingbie("man");try {DocumentHandler dh = new DocumentHandler();String wordName = "学⽣信息表";dh.createDoc(student, "test5.ftl", getResponse(), wordName);} catch (IOException e) {e.printStackTrace();}}3、DocumentHandler⼯具类代码如下:import java.beans.BeanInfo;import java.beans.IntrospectionException;import java.beans.Introspector;import java.beans.PropertyDescriptor;import java.io.IOException;import java.io.Writer;import ng.reflect.InvocationTargetException;import ng.reflect.Method;import java.text.SimpleDateFormat;import java.util.Date;import java.util.HashMap;import java.util.List;import java.util.Map;import javax.servlet.http.HttpServletResponse;import wpunishment;import freemarker.template.Configuration;import freemarker.template.Template;import freemarker.template.TemplateException;public class DocumentHandler{private Configuration configuration = null;public DocumentHandler() {configuration = new Configuration();configuration.setDefaultEncoding("utf-8");}public void createDoc(Object bean,String url,HttpServletResponse response,String filepath) throws IOException { //把对象变成mapClass<? extends Object> type = bean.getClass();Map<String, Object> dataMap = new HashMap<String, Object>();try {BeanInfo beanInfo = Introspector.getBeanInfo(type);PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();for (PropertyDescriptor descriptor : propertyDescriptors) {String propertyName = descriptor.getName();if (!propertyName.equals("class")) {Method readMethod = descriptor.getReadMethod();Object result = readMethod.invoke(bean, new Object[0]);if(result !=null){dataMap.put(propertyName,result+"");}else{dataMap.put(propertyName,"");}}}} catch (IntrospectionException e) {throw new RuntimeException("分析类属性失败", e);} catch (IllegalAccessException e) {throw new RuntimeException("分析类属性失败", e);} catch (InvocationTargetException e) {throw new RuntimeException("分析类属性失败", e);}//要填⼊模本的数据⽂件System.out.println(dataMap.toString());configuration.setClassForTemplateLoading(this.getClass(), "/wordxml/");//表⽰src下的wordxml⽬录Template t=null;try {//test.ftl为要装载的模板t = configuration.getTemplate(url);} catch (IOException e) {e.printStackTrace();}//输出⽂档路径及名称response.setCharacterEncoding("UTF-8");filepath=.URLEncoder.encode(filepath+".doc", "UTF-8");response.setContentType("application/msword");response.setHeader("Content-disposition", "attachment; filename="+new String(filepath.getBytes("UTF-8"),"GBK")); Writer out = response.getWriter();try {t.process(dataMap, out);} catch (TemplateException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}。
Java模板动态生成word文件的方法步骤
Java模板动态⽣成word⽂件的⽅法步骤最近项⽬中需要根据模板⽣成word⽂档,模板⽂件也是word⽂档。
当时思考⼀下想⽤POI API来做,但是觉得⽤起来相对复杂。
后来⼜找了⼀种⽅式,使⽤freemarker模板⽣成word⽂件,经过尝试觉得还是相对简单易⾏的。
使⽤freemarker模板⽣成word⽂档主要有这么⼏个步骤1、创建word模板:因为我项⽬中⽤到的模板本⾝是word,所以我就直接编辑word⽂档转成freemarker(.ftl)格式的。
2、将改word⽂件另存为xml格式,注意使⽤另存为,不是直接修改扩展名。
3、将xml⽂件的扩展名改为ftl4、编写java代码完成导出使⽤到的jar:freemarker.jar (2.3.28) ,其中Configuration对象不推荐直接new Configuration(),仔细看Configuration.class⽂件会发现,推荐的是 Configuration(Version incompatibleImprovements) 这个构造⽅法,具体这个构造⽅法⾥⾯传的就是Version版本类,⽽且版本号不能低于2.3.0闲⾔碎语不再讲,直接上代码public static void exportDoc() {String picturePath = "D:/image.png";Map<String, Object> dataMap = new HashMap<String, Object>();dataMap.put("brand", "海尔");dataMap.put("store_name", "海尔天津");dataMap.put("user_name", "⼩明");//经过编码后的图⽚路径String image = getWatermarkImage(picturePath);dataMap.put("image", image);//Configuration⽤于读取ftl⽂件Configuration configuration = new Configuration(new Version("2.3.0"));configuration.setDefaultEncoding("utf-8");Writer out = null;try {//输出⽂档路径及名称File outFile = new File("D:/导出优惠证明.doc");out = new BufferedWriter(new OutputStreamWriter(newFileOutputStream(new File("outFile")), "utf-8"), 10240);} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (FileNotFoundException e) {e.printStackTrace();}// 加载⽂档模板Template template = null;try {//指定路径,例如C:/a.ftl 注意:此处指定ftl⽂件所在⽬录的路径,⽽不是ftl⽂件的路径configuration.setDirectoryForTemplateLoading(new File("C:/"));//以utf-8的编码格式读取⽂件template = configuration.getTemplate("导出优惠证明.ftl", "utf-8");} catch (IOException e) {e.printStackTrace();throw new RuntimeException("⽂件模板加载失败!", e);}// 填充数据try {template.process(dataMap, out);} catch (TemplateException e) {e.printStackTrace();throw new RuntimeException("模板数据填充异常!", e);} catch (IOException e) {e.printStackTrace();throw new RuntimeException("模板数据填充异常!", e);} finally {if (null != out) {try {out.close();} catch (IOException e) {e.printStackTrace();throw new RuntimeException("⽂件输出流关闭异常!", e);}}}}因为很多时候我们根据模板⽣成⽂件需要添加⽔印,也就是插⼊图⽚/**** 处理图⽚* @param watermarkPath 图⽚路径 D:/image.png* @return*/private String getWatermarkImage(String watermarkPath) {InputStream in = null;byte[] data = null;try {in = new FileInputStream(watermarkPath);data = new byte[in.available()];in.read(data);in.close();} catch (Exception e) {e.printStackTrace();}BASE64Encoder encoder = new BASE64Encoder();return encoder.encode(data);}注意点:插⼊图⽚后的word转化为ftl模板⽂件(ps:⽔印图⽚可以在word上调整到⾃⼰想要的⼤⼩,然后在执⾏下⾯的步骤)1、先另存为xml2、将xml扩展名改为ftl3、打开ftl⽂件, 搜索w:binData 或者 png可以快速定位图⽚的位置,图⽚已经编码成0-Z的字符串了, 如下:5、将上述0-Z的字符串全部删掉,写上${image}(变量名随便写,跟dataMap⾥的key保持⼀致)后保存6、也是创建⼀个Map, 将数据存到map中,只不过我们要把图⽚⽤代码进⾏编码,将其也编成0-Z的字符串,代码请看上边⾄此⼀个简单的按照模板⽣成word并插⼊图⽚(⽔印)功能基本完成。
Java导出Word文档案例
Java导出Word⽂档案例摘⾃:最近做的⼀个Flex项⽬中要把报表导出到Word⽂件中。
⽹上查了好多资料后最终在⽹友的帮助和⾃⼰的奋⽃下成功搞定。
现把代码贴出来供⼤家批评指正并⼀起学习。
package org.replace;import java.io.File;import java.io.FileInputStream;import java.io.FileWriter;import java.io.IOException;import java.io.InputStream;import java.io.PrintWriter;import java.util.Iterator;import java.util.Map;public class ReportWord {public String replaceStr(String content, String oldcontent,String newcontent) {String rc = encodeToUnicode(newcontent);String target = "";oldcontent = "$" + oldcontent + "$";target = content.replace(oldcontent, rc);return target;}public String encodeToUnicode(String str) {if (str == null)return "";StringBuilder sb = new StringBuilder(str.length() * 2);for (int i = 0; i < str.length(); i++) {sb.append(encodeToUnicode(str.charAt(i)));}return sb.toString();}public String encodeToUnicode(char character) {if (character > 255) {return "&#" + (character & 0xffff) + ";";} else {return String.valueOf(character);}}public void exportWordFile(String inputPath, String outPath,Map<String, String> data) {String sourname = inputPath;String sourcecontent = "";InputStream ins = null;try {ins = new FileInputStream(sourname);byte[] b = new byte[1638400];// 提⾼对⽂件的读取速度,特别是对于1M以上的⽂件if (!new File(sourname).isFile()) {System.out.println("源模板⽂件不存在");return;}int bytesRead = 0;while (true) {bytesRead = ins.read(b, 0, 1638400);if (bytesRead == -1) {System.out.println("读取模板⽂件结束");break;}sourcecontent += new String(b, 0, bytesRead);}} catch (Exception e) {e.printStackTrace();}String targetcontent = "";String oldText = "";Object newValue;try {Iterator<String> keys = data.keySet().iterator();int keysfirst = 0;while (keys.hasNext()) {oldText = (String) keys.next();newValue = data.get(oldText);String newText = (String) newValue;if (keysfirst == 0) {targetcontent = replaceStr(sourcecontent, oldText, newText); keysfirst = 1;} else {targetcontent = replaceStr(targetcontent, oldText, newText); keysfirst = 1;}}FileWriter fw = new FileWriter(outPath, true);PrintWriter out = new PrintWriter(fw);if (targetcontent.equals("") || targetcontent == "") {out.println(sourcecontent);} else {out.println(targetcontent);}out.close();fw.close();System.out.println(outPath + " ⽣成⽂件成功");} catch (IOException e) {e.printStackTrace();}}}测试代码为:package org.replace;import java.io.File;import java.util.HashMap;public class ExportFile {public static void main(String[] args) {ReportWord rw = new ReportWord();HashMap<String, String> map = new HashMap<String, String>(); map.put("1", "张三");map.put("2", "李四");map.put("3", "王五");map.put("4", "赵六");map.put("5", "彩笔");map.put("6", "张三");map.put("7", "李四");map.put("8", "王五");map.put("9", "赵六");map.put("10", "彩笔");map.put("11", "张三");map.put("12", "李四");map.put("13", "王五");map.put("14", "赵六");map.put("15", "彩笔");String inUrl = "D:" + File.separator + "itest.mht";String outUrl = "C:" + File.separator + "Users"+ File.separator + "Administrator" + File.separator + "Desktop"+ File.separator + "itest.doc";File fileOut = new File(outUrl);File fileIn = new File(inUrl);if(fileOut.exists()){fileOut.delete();System.out.println(inUrl + "⽂件已存在,已删除!"); }if(!fileIn.exists()){return;}rw.exportWordFile(inUrl, outUrl, map);}}使⽤的模板为.mht⽂件。
java导出word的6种方式(复制来的文章)
java导出word的6种⽅式(复制来的⽂章)来⾃:最近做的项⽬,需要将⼀些信息导出到word中。
在⽹上找了好多解决⽅案,现在将这⼏天的总结分享⼀下。
⽬前来看,java导出word⼤致有6种解决⽅案:1:Jacob是Java-COM Bridge的缩写,它在Java与微软的COM组件之间构建⼀座桥梁。
使⽤Jacob⾃带的DLL动态链接库,并通过JNI的⽅式实现了在Java平台上对COM程序的调⽤。
DLL动态链接库的⽣成需要windows平台的⽀持。
该⽅案只能在windows平台实现,是其局限性。
2:Apache POI包括⼀系列的API,它们可以操作基于MicroSoft OLE 2 Compound Document Format的各种格式⽂件,可以通过这些API在Java中读写Excel、Word等⽂件。
他的excel处理很强⼤,对于word还局限于读取,⽬前只能实现⼀些简单⽂件的操作,不能设置样式。
3:Java2word是⼀个在java程序中调⽤ MS Office Word ⽂档的组件(类库)。
该组件提供了⼀组简单的接⼝,以便java程序调⽤他的服务操作Word ⽂档。
这些服务包括:打开⽂档、新建⽂档、查找⽂字、替换⽂字,插⼊⽂字、插⼊图⽚、插⼊表格,在书签处插⼊⽂字、插⼊图⽚、插⼊表格等。
填充数据到表格中读取表格数据,1.1版增强的功能:指定⽂本样式,指定表格样式。
如此,则可动态排版word⽂档。
是⼀种不错的解决⽅案。
4:iText是著名的开放源码的站点sourceforge⼀个项⽬,是⽤于⽣成PDF⽂档的⼀个java类库。
通过iText不仅可以⽣成PDF或rtf的⽂档,⽽且可以将XML、Html⽂件转化为PDF⽂件。
功能强⼤。
5:JSP输出样式,该⽅案实现简单,但是处理样式有点缺陷,简单的导出可以使⽤。
6:⽤XML做就很简单了。
Word从2003开始⽀持XML格式,⼤致的思路是先⽤office2003或者2007编辑好word的样式,然后另存为xml,将xml翻译为FreeMarker模板,最后⽤java来解析FreeMarker模板并输出Doc。
利用java技术动态生成word文档之探索
对 Word 操作的示例代码:
1.3 利用 Java2word 技术 Java2word 本质是一个在组件(类库),利用
中。 Jacob 技术的优势是通过对微软 Office 的 COM
接口简单调用,能够生成格式规范的 word 文件。 Jacob 技术的缺陷是只能使用 windows 平台作为服 务器,对 unix 和 linux 不很支持,且 Microsoft Office 软件必须在服务器端安装。
其主要过程和核心代码: (1)初始化 com 线程
它可以在 java 程序中调用 MS Office Word 文档 Java2word 提供了一组简易的接口,可以使得 Java 程序方便调用接口服务操作 Word 文件。 提供操 作 Word 的主要服务功能有:打开、新建、查找和 替换、插入文本和图片、插入表格等。
需要提醒的是,在使用此技术时要安装 Java2Word1.1+Install.exe 应 用 程 序 , 并 将 java2word.jar 包放在 WEB_INFO 的 lib 文件夹下 面,将其中的文件名为 jacob.dll 的动态链接库文 件复制到 C 盘系统目录 system32 中。
第 21 卷第 6 期 2019 年 12 月
黄冈职业技术学院学报 Journal of Huanggang Polytechnic
Vol.21 No.6
Dec.2019
利用 Java 技术动态生成 Word 文档之探索
[转载]java调用PageOffice生成word
[转载]java调⽤PageOffice⽣成word⼀、在开发OA办公或与⽂档相关的Web系统中,难免会遇到动态⽣成word⽂档的需求,为了解决⼯作中遇到导出word⽂档的需求,前⼀段时间上⽹找了⼀些资料,在word导出这⽅⾯有很多⼯具可以使⽤,jacob、poi、java2word、itext。
jacob要求服务器必须是windows操作系统,服务器上还必须安装office软件,果断放弃!poi需要针对doc和docx两种格式写不同的代码,增加了程序的复杂度。
java2doc 是对jacob 的封装,同样放弃!最后选定了⽤itext来导出word,⽹上⼀些资料说itext导出word功能太简单,通过试⽤之后,封装⼯具类,使⽤起来确实挺⽅便,但是导出的word⽂档在细节⽅⾯很难达到要求,⽐如:字体、⾏距、字体间距、⾸⾏缩进等。
⼆、由于itext导出的word有各种各样的⼩问题,只能另找其他的解决⽅案,经过⼀个朋友推荐,可⽤PageOffice组件来导出word,其效果能与⽤户需求的word⽂档达到完美的⼀致,⽽且编程接⼝简单,调⽤很⽅便。
总的来说就是制作模板(⽤PO_开头的书签作为数据占位符),然后编程调⽤PageOffice接⼝⽤真实数据替换模板中的占位符,最后⽣成word。
下⾯看例⼦:1. 制作模板 打开word模板插⼊书签:PO_Dept、PO_Name、PO_Cause、PO_Num、PO_Date,如下图所⽰2. 编写代码 调⽤PageOffice接⼝,给word模板填充数据⽣成word⽂档:1 // 声明变量存储从数据库中读取的数据2 String docName = "", docDept = "", docCause = "", docNum = "", docDate = "";3 // 数据库数据读取操作(不同的数据库⽤不同的代码)4 ResultSet rs = stmt.executeQuery("select * from leaveRecord where ID = " + id);5 if (rs.next()) {6 docName = rs.getString("Name");7 docDept = rs.getString("Dept");8 docCause = rs.getString("Cause");9 docNum = rs.getString("Num");10 docDate = rs.getString("SubmitTime");11 }12 rs.close();13 //创建PageOffice的WordDocument对象,操作Word⽂件14 WordDocument doc = new WordDocument();15 doc.openDataRegion("PO_name").setValue(docName);16 doc.openDataRegion("PO_dept").setValue(docDept);17 doc.openDataRegion("PO_cause").setValue(docCause);18 doc.openDataRegion("PO_num").setValue(docNum);19 doc.openDataRegion("PO_date").setValue(docDate);20 //创建PageOfficeCtrl对象打开⽂件21 PageOfficeCtrl poCtrl1 = new PageOfficeCtrl(request);22 poCtrl1.setServerPage(request.getContextPath()+"/poserver.zz"); //此⾏必须23 //获取数据对象24 poCtrl1.setWriter(doc);25 // 打开⽂档26 poCtrl1.webOpen("doc/template.doc", OpenModeType.docReadOnly, "Tom");3. ⽣成效果图三、源码下载。
Java导出Word文档
Java导出Word⽂档js 请求后端function exportWord(opId){location.href=ctx+'/maintainPro/downloadWord?opId='+opId+"&type=0";} java后端代码⽰例@RequestMapping(value = "/downloadWord")@AdminToolControllerLog(description = "word⽂档下载")public void downloadTemplate(HttpServletRequest req, HttpServletResponse resp,Long opId,String type) throws Exception {JsonMsg msg = new JsonMsg();MaintainPro maintainPro = maintainproService.findMaintainPro(opId);String classpath = this.getClass().getResource("/").getPath();String docRoot = classpath.replaceAll("WEB-INF/classes/", "");String wordDirUrl = "static/resources/word/";// String docRoot = classpath.replaceAll("classes/", "");// String wordDirUrl = "RePlan/static/resources/word/";String fileName="项⽬申报书.docx"; //word模板名称String filePath =docRoot+wordDirUrl+fileName;Map<String, Object> ini = getIniMap(maintainPro); //获取固定字段信息List<Map<String, Object>> list1 = getTableList(maintainPro,1L); //获取列表数据List<Map<String, Object>> list2 = getTableList(maintainPro,2L);List<Map<String, Object>> list3 = getTableList(maintainPro,3L);WordReporter wordReporter = new WordReporter();wordReporter.setTempLocalPath(filePath);wordReporter.init(ini); //固定字段赋值wordReporter.replaceTableParams(ini, 0); //对应表格固定字段信息赋值(0指word模板中第⼀个表格,依次类推)wordReporter.replaceTableParams(ini, 1);wordReporter.replaceTableParams(ini, 2);wordReporter.replaceTableParams(ini, 3);wordReporter.replaceTableParams(ini, 4);wordReporter.replaceTableParams(ini, 5);//遍历(设备、产品软件、应⽤软件)表格wordReporter.export(list1,6,1,1); //需要遍历的列表赋值(6指word模板中第7个表格,表格从第1⾏开始,以第1⾏作为创建⾏)wordReporter.export(list2,7,1,1);wordReporter.export(list3,8,1,1);int index = fileName.indexOf(".");String prefix = fileName.substring(0,index);fileName = fileName.replace(prefix, maintainPro.getPiName()+"申报书"); //导出⽂件重新命名buildWordheader(req, resp, fileName);//刷新缓冲resp.flushBuffer();OutputStream ouputStream = resp.getOutputStream();wordReporter.getXwpfDocument().write(ouputStream);if (ouputStream != null) {ouputStream.close();}msg.setSuccess(true);}//将对象中所需字段转mappublic Map<String,Object> getIniMap(MaintainPro maintainPro){Map<String, Object> map = maintainproService.findIniMapById(maintainPro.getOpId());if(map!=null) {if(map.get("PI_NAME")!=null) {//项⽬名称map.put("piName", map.get("PI_NAME").toString());}}return map;}public void buildWordheader(HttpServletRequest req, HttpServletResponse resp,String filename) throws UnsupportedEncodingException { resp.reset();String fileNameURL = URLEncoder.encode(filename, "UTF-8");resp.setCharacterEncoding("UTF-8");//response.setHeader("Content-disposition", "attachment;filename=" + fileName);resp.setHeader("Content-disposition", "attachment;filename=" + fileNameURL + ";" + "filename*=utf-8''" + fileNameURL);resp.setContentType("application/octet-stream");}package mon.util;import ng.StringUtils;import ermodel.*;import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;import java.io.*;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.regex.Matcher;import java.util.regex.Pattern;/*** Created by lzx on 2018/8/12*/public class WordReporter {private String tempLocalPath;private XWPFDocument xwpfDocument = null;private FileInputStream inputStream = null;private OutputStream outputStream = null;public WordReporter(){}public WordReporter(String tempLocalPath){this.tempLocalPath = tempLocalPath;}/*** 设置模板路径* @param tempLocalPath*/public void setTempLocalPath(String tempLocalPath) {this.tempLocalPath = tempLocalPath;}/*** 初始化* @throws IOException*/public void init(Map<String,Object> params) throws IOException{inputStream = new FileInputStream(new File(this.tempLocalPath));xwpfDocument = new XWPFDocument(inputStream);replaceParams(xwpfDocument, params);}/*** 替换段落⾥⾯的变量** @param doc 要替换的⽂档* @param params 参数*/private static void replaceParams(XWPFDocument doc, Map<String, Object> params) {Iterator<XWPFParagraph> iterator = doc.getParagraphsIterator();XWPFParagraph paragraph;while (iterator.hasNext()) {paragraph = iterator.next();replaceParam(paragraph, params);}}/*** 替换段落⾥⾯的变量** @param paragraph 要替换的段落* @param params 参数*/private static void replaceParam(XWPFParagraph paragraph, Map<String, Object> params) {List<XWPFRun> runs;Matcher matcher;String runText = "";if (matcher(paragraph.getParagraphText()).find()) {runs = paragraph.getRuns();int j = runs.size();for (int i = 0; i < j; i++) {runText += runs.get(0).toString();//保留最后⼀个段落,在这段落中替换值,保留段落样式if (!((j - 1) == i)) {paragraph.removeRun(0);}}matcher = matcher(runText);if (matcher.find()) {while ((matcher = matcher(runText)).find()) {runText = matcher.replaceFirst(params.get(matcher.group(1))==null?"":params.get(matcher.group(1)).toString()); // runText = matcher.replaceFirst(String.valueOf(params.get(matcher.group(1))));}runs.get(0).setText(runText, 0);}}}/*** 正则匹配字符串** @param str* @return*/private static Matcher matcher(String str) {Pattern pattern = pile("\\$\\{(.+?)\\}", Pattern.CASE_INSENSITIVE);Matcher matcher = pattern.matcher(str);return matcher;}/*** @param doc docx解析对象* @param params 需要替换的信息集合* @param tableIndex 第⼏个表格* @param tableList 需要插⼊的表格信息集合*/public static void changeTable(XWPFDocument doc, Map<String, Object> params, int tableIndex, List<String[]> tableList) { //获取表格对象集合List<XWPFTable> tables = doc.getTables();//获取第⼀个表格根据实际模板情况决定去第⼏个word中的表格XWPFTable table = tables.get(tableIndex);//替换表格中的参数// replaceTableParams(params,0);//在表格中插⼊数据insertTable(table, tableList);}/*** 为表格插⼊⾏数,此处不处理表头,所以从第⼆⾏开始** @param table 需要插⼊数据的表格* @param tableList 插⼊数据集合*/private static void insertTable(XWPFTable table, List<String[]> tableList) {//创建与数据⼀致的⾏数for (int i = 0; i < tableList.size(); i++) {table.createRow();}int length = table.getRows().size();for (int i = 1; i < length; i++) {XWPFTableRow newRow = table.getRow(i);List<XWPFTableCell> cells = newRow.getTableCells();for (int j = 0; j < cells.size(); j++) {XWPFTableCell cell = cells.get(j);cell.setText(tableList.get(i - 1)[j]);}}}/*** 替换表格⾥⾯的变量** @param doc 要替换的⽂档* @param params 参数*/public void replaceTableParams( Map<String, Object> params,int tableIndex) {List<XWPFTable> tableList = xwpfDocument.getTables();XWPFTable table =tableList.get(tableIndex);;List<XWPFTableRow> rows;List<XWPFTableCell> cells;List<XWPFParagraph> paras;//判断表格是需要替换还是需要插⼊,判断逻辑有$为替换,表格⽆$为插⼊if (matcher(table.getText()).find()) {rows = table.getRows();for (XWPFTableRow row : rows) {cells = row.getTableCells();for (XWPFTableCell cell : cells) {paras = cell.getParagraphs();for (XWPFParagraph para : paras) {replaceParam(para, params);}}}}}/*** 导出⽅法* @param params* @param tableIndex word的表格索引* @param rownum 从第⼏⾏开始* @param createrowindex 以第⼏⾏作为创建⾏* @return* @throws Exception*/public boolean export(List<Map<String,Object>> params, int tableIndex,int rownum,int createrowindex) throws Exception{this.insertValueToTable(xwpfDocument,params,tableIndex,rownum,createrowindex);return true;}/*** 循环填充表格内容* @param xwpfDocument* @param params* @param tableIndex* @throws Exception*/private void insertValueToTable(XWPFDocument xwpfDocument, List<Map<String,Object>> params, int tableIndex,int rownum,int createrowindex) throws Exception { List<XWPFTable> tableList = xwpfDocument.getTables();if(tableList.size()<=tableIndex){throw new Exception("tableIndex对应的表格不存在");}XWPFTable table = tableList.get(tableIndex);List<XWPFTableRow> rows = table.getRows();if(rows.size()<2){throw new Exception("tableIndex对应表格应该为2⾏");}//模板的那⼀⾏XWPFTableRow tmpRow = rows.get(rownum);List<XWPFTableCell> tmpCells = null;List<XWPFTableCell> cells = null;XWPFTableCell tmpCell = null;tmpCells = tmpRow.getTableCells();table.getCTTbl();String cellText = null;String cellTextKey = null;Map<String,Object> totalMap = null;for (int i = 0, len = params.size(); i < len; i++) {Map<String,Object> map = params.get(i);// 创建新的⼀⾏// XWPFTableRow row = table.createRow();XWPFTableRow row = createRow(table.getCTTbl(),table,createrowindex);// 获取模板的⾏⾼设置为新⼀⾏的⾏⾼row.setHeight(tmpRow.getHeight());cells = row.getTableCells();for (int k = 0, klen = cells.size(); k < klen; k++) {tmpCell = tmpCells.get(k);XWPFTableCell cell = cells.get(k);cellText = tmpCell.getText();if (StringUtils.isNotBlank(cellText)) {//转换为mapkey对应的字段cellTextKey = cellText.replace("$", "").replace("{", "").replace("}", "").replaceAll("[^a-zA-Z0-9_\\u4E00-\\u9FA5]", "");if (map.containsKey(cellTextKey)) {// 填充内容并且复制模板⾏的属性setCellText(tmpCell,cell,map.get(cellTextKey)==null?"":map.get(cellTextKey).toString());}}}}// 删除模版⾏table.removeRow(rownum);}private XWPFTableRow createRow(CTTbl ctTbl,XWPFTable table,int i){int sizeCol = ctTbl.sizeOfTrArray() > 0 ? ctTbl.getTrArray(i).sizeOfTcArray() : 0;XWPFTableRow tabRow = new XWPFTableRow(ctTbl.addNewTr(), table);addColumn(tabRow, sizeCol);//tableRows.add(tabRow);return tabRow;}private void addColumn(XWPFTableRow tabRow, int sizeCol) {if (sizeCol > 0) {for (int i = 0; i < sizeCol; i++) {tabRow.createCell();}}}/*** 复制模板⾏的属性* @param tmpCell* @param cell* @param text* @throws Exception*/private void setCellText(XWPFTableCell tmpCell, XWPFTableCell cell,String text) throws Exception {CTTc cttc2 = tmpCell.getCTTc();CTTcPr ctPr2 = cttc2.getTcPr();CTTc cttc = cell.getCTTc();CTTcPr ctPr = cttc.addNewTcPr();if (ctPr2.getTcW() != null) {ctPr.addNewTcW().setW(ctPr2.getTcW().getW());}if (ctPr2.getVAlign() != null) {ctPr.addNewVAlign().setVal(ctPr2.getVAlign().getVal());}if (cttc2.getPList().size() > 0) {CTP ctp = cttc2.getPList().get(0);if (ctp.getPPr() != null) {if (ctp.getPPr().getJc() != null) {cttc.getPList().get(0).addNewPPr().addNewJc().setVal(ctp.getPPr().getJc().getVal());}}}if (ctPr2.getTcBorders() != null) {ctPr.setTcBorders(ctPr2.getTcBorders());}XWPFParagraph tmpP = tmpCell.getParagraphs().get(0);XWPFParagraph cellP = cell.getParagraphs().get(0);XWPFRun tmpR = null;if (tmpP.getRuns() != null && tmpP.getRuns().size() > 0) {tmpR = tmpP.getRuns().get(0);}XWPFRun cellR = cellP.createRun();cellR.setText(text);// 复制字体信息if (tmpR != null) {if(!cellR.isBold()){cellR.setBold(tmpR.isBold());}cellR.setItalic(tmpR.isItalic());cellR.setUnderline(tmpR.getUnderline());cellR.setColor(tmpR.getColor());cellR.setTextPosition(tmpR.getTextPosition());if (tmpR.getFontSize() != -1) {cellR.setFontSize(tmpR.getFontSize());}if (tmpR.getFontFamily() != null) {cellR.setFontFamily(tmpR.getFontFamily());}if (tmpR.getCTR() != null) {if (tmpR.getCTR().isSetRPr()) {CTRPr tmpRPr = tmpR.getCTR().getRPr();if (tmpRPr.isSetRFonts()) {CTFonts tmpFonts = tmpRPr.getRFonts();CTRPr cellRPr = cellR.getCTR().isSetRPr() ? cellR.getCTR().getRPr() : cellR.getCTR().addNewRPr();CTFonts cellFonts = cellRPr.isSetRFonts() ? cellRPr.getRFonts() : cellRPr.addNewRFonts();cellFonts.setAscii(tmpFonts.getAscii());cellFonts.setAsciiTheme(tmpFonts.getAsciiTheme());cellFonts.setCs(tmpFonts.getCs());cellFonts.setCstheme(tmpFonts.getCstheme());cellFonts.setEastAsia(tmpFonts.getEastAsia());cellFonts.setEastAsiaTheme(tmpFonts.getEastAsiaTheme());cellFonts.setHAnsi(tmpFonts.getHAnsi());cellFonts.setHAnsiTheme(tmpFonts.getHAnsiTheme());}}}}// 复制段落信息cellP.setAlignment(tmpP.getAlignment());cellP.setVerticalAlignment(tmpP.getVerticalAlignment());cellP.setBorderBetween(tmpP.getBorderBetween());cellP.setBorderBottom(tmpP.getBorderBottom());cellP.setBorderLeft(tmpP.getBorderLeft());cellP.setBorderRight(tmpP.getBorderRight());cellP.setBorderTop(tmpP.getBorderTop());cellP.setPageBreak(tmpP.isPageBreak());if (tmpP.getCTP() != null) {if (tmpP.getCTP().getPPr() != null) {CTPPr tmpPPr = tmpP.getCTP().getPPr();CTPPr cellPPr = cellP.getCTP().getPPr() != null ? cellP.getCTP().getPPr() : cellP.getCTP().addNewPPr();// 复制段落间距信息CTSpacing tmpSpacing = tmpPPr.getSpacing();if (tmpSpacing != null) {CTSpacing cellSpacing = cellPPr.getSpacing() != null ? cellPPr .getSpacing() : cellPPr.addNewSpacing();if (tmpSpacing.getAfter() != null) {cellSpacing.setAfter(tmpSpacing.getAfter());}if (tmpSpacing.getAfterAutospacing() != null) {cellSpacing.setAfterAutospacing(tmpSpacing.getAfterAutospacing());}if (tmpSpacing.getAfterLines() != null) {cellSpacing.setAfterLines(tmpSpacing.getAfterLines());}if (tmpSpacing.getBefore() != null) {cellSpacing.setBefore(tmpSpacing.getBefore());}if (tmpSpacing.getBeforeAutospacing() != null) {cellSpacing.setBeforeAutospacing(tmpSpacing.getBeforeAutospacing());}if (tmpSpacing.getBeforeLines() != null) {cellSpacing.setBeforeLines(tmpSpacing.getBeforeLines()); }if (tmpSpacing.getLine() != null) {cellSpacing.setLine(tmpSpacing.getLine());}if (tmpSpacing.getLineRule() != null) {cellSpacing.setLineRule(tmpSpacing.getLineRule());}}// 复制段落缩进信息CTInd tmpInd = tmpPPr.getInd();if (tmpInd != null) {CTInd cellInd = cellPPr.getInd() != null ? cellPPr.getInd(): cellPPr.addNewInd();if (tmpInd.getFirstLine() != null) {cellInd.setFirstLine(tmpInd.getFirstLine());}if (tmpInd.getFirstLineChars() != null) {cellInd.setFirstLineChars(tmpInd.getFirstLineChars());}if (tmpInd.getHanging() != null) {cellInd.setHanging(tmpInd.getHanging());}if (tmpInd.getHangingChars() != null) {cellInd.setHangingChars(tmpInd.getHangingChars());}if (tmpInd.getLeft() != null) {cellInd.setLeft(tmpInd.getLeft());}if (tmpInd.getLeftChars() != null) {cellInd.setLeftChars(tmpInd.getLeftChars());}if (tmpInd.getRight() != null) {cellInd.setRight(tmpInd.getRight());}if (tmpInd.getRightChars() != null) {cellInd.setRightChars(tmpInd.getRightChars());}}}}}/*** 收尾⽅法* @param outDocPath* @return* @throws IOException*/public boolean generate(String outDocPath) throws IOException{outputStream = new FileOutputStream(outDocPath);xwpfDocument.write(outputStream);this.close(outputStream);this.close(inputStream);return true;}/*** 关闭输⼊流* @param is*/private void close(InputStream is) {if (is != null) {try {is.close();} catch (IOException e) {e.printStackTrace();}}}/*** 关闭输出流* @param os*/private void close(OutputStream os) {if (os != null) {try {os.close();} catch (IOException e) {e.printStackTrace();}}}public XWPFDocument getXwpfDocument() {return xwpfDocument;}public OutputStream getOutputStream() {return outputStream;}}word模板⽰例:。
javapoi实现word导出(包括word模板的使用、复制表格、复制行、插入图片的使用)
/** * 功能描述:word下载 * * @param response * @param patientMap * @param list * @param itemList * @param file * @see [相关类/方法](可选) * @since [产品/模块版本](可选) */ public static final void DownloadWord(HttpServletResponse response, Map<String, Object> patientMap, List<Map<String, Object>> list, List<List<String>> itemList, String file) {
博客园 用户登录 代码改变世界 密码登录 短信登录 忘记登录用户名 忘记密码 记住我 登录 第三方登录/注册 没有账户, 立即注册
javapoi实现 word导出(包括 word模板的使用、复制表格、复制 行、插入图片的使用)
java poi实现数据的word导出(包括word模板的使用、复制表格、复制行、插入图片的使用) 1.实现的效果 实现病人基本信息、多条病历数据、多项检查项图片的动态插入(网络图片)
/** * 功能描述:复制段落,从source到target * * @param target * @param source * @param index * @see [相关类/方法](可选) * @since [产品/模块版本](可选) */ public static void copyParagraph(XWPFParagraph target, XWPFParagraph source, Integer index) { // 设置段落样式 target.getCTP().setPPr(source.getCTP().getPPr()); // 移除所有的run for (int pos = target.getRuns().size() - 1; pos >= 0; pos--) { target.removeRun(pos); } // copy 新的run for (XWPFRun s : source.getRuns()) { XWPFRun targetrun = target.createRun(); copyRun(targetrun, s, index); } }
java导出word格式的文件
java导出word格式的⽂件1. 使⽤POI技术⽣成word格式的⽉报,实现功能根据⽇期进⾏预览,导出。
2. 使⽤template.docx作为word模板,参数使⽤特殊符号标识,封装数据(Map<String,String>); 通过IO读取模板替换参数,从⽽动态获取数据。
3. 预览的实现,由于web页⾯展⽰通过html或pdf来进⾏。
将word转为pdf后基本都会出现样式的不兼容问题,所以放弃。
最终我根据word的模板⼜⼿写了⼀个html对应的模板,参数使⽤的jsp的el表达式动态替换参数,从⽽动态获取数据。
暂时没有考虑word模板过多的情况。
4. 由于我做的系统的前端是easyui的框架,预览时的翻页使⽤了panel插件功能,批量导出使⽤的ZipEntry。
相关代码1 package com.bocsh.base.util;23 import java.io.ByteArrayOutputStream;4 import java.io.FileInputStream;5 import java.io.IOException;6 import java.util.List;7 import java.util.Map;8 import java.util.Map.Entry;9 import java.util.Set;101112//import org.apache.poi.POIXMLDocument;13 import ermodel.*;1415/**16 * 通过word模板⽣成新的word⼯具类17 *18 * @author zhiheng19 *20 *21 * XWPFDocument代表⼀个docx⽂档,其可以⽤来读docx⽂档,也可以⽤来写docx⽂档22 * XWPFParagraph代表⽂档、表格、标题等种的段落,由多个XWPFRun组成23 * XWPFRun代表具有同样风格的⼀段⽂本24 * XWPFTable代表⼀个表格25 * XWPFTableRow代表表格的⼀⾏26 * XWPFTableCell代表表格的⼀个单元格27 * XWPFChar 表⽰.docx⽂件中的图表28 * XWPFHyperlink 表⽰超链接29 * XWPFPicture 代表图⽚30 *31 *32 *33*/34public class WorderToNewWordUtils {3536/**37 * 判断表格是需要替换还是需要插⼊,判断逻辑有$为替换,表格⽆$为插⼊38 * @param inputUrl 模板存放地址39 * @param textMap 需要替换的信息集合40 * @param excelDataBytes ⽣成了新的数据流 word格式,存放容器41 * @return 成功返回true,失败返回false42*/43public static boolean changWord(String inputUrl,44 Map<String, String> textMap, Map<String,byte[]> excelDataBytes) {4546//模板转换默认成功47 boolean changeFlag = true;48 ByteArrayOutputStream writeToBytes = null;49try {50//获取docx解析对象51 XWPFDocument document = new XWPFDocument(new FileInputStream(inputUrl));52//解析替换⽂本段落对象53 WorderToNewWordUtils.changeText(document, textMap);54//解析替换表格对象55 WorderToNewWordUtils.changeTable(document, textMap);5657//⽣成了新的数据流 word 格式58 writeToBytes = new ByteArrayOutputStream();59 document.write(writeToBytes);60 excelDataBytes.put(textMap.get("year") + textMap.get("month"), writeToBytes.toByteArray());6162 } catch (IOException e) {63 e.printStackTrace();64 changeFlag = false;65 }finally{66try {67if(writeToBytes!=null)68 writeToBytes.close();69 } catch (IOException e) {70 e.printStackTrace();71 }72 }7374return changeFlag;7576 }777879/**80 * 替换段落⽂本81 * @param document docx解析对象82 * @param textMap 需要替换的信息集合83*/84public static void changeText(XWPFDocument document, Map<String, String> textMap){ 85//获取段落集合86 List<XWPFParagraph> paragraphs = document.getParagraphs();8788for (XWPFParagraph paragraph : paragraphs) {89//判断此段落时候需要进⾏替换90 String text = paragraph.getText();91if(checkText(text)){92 List<XWPFRun> runs = paragraph.getRuns();93for (XWPFRun run : runs) {94//替换模板原来位置95 run.setText(changeValue(run.toString(), textMap),0);96 }97 }98 }99100 }101102/**103 * 替换表格对象⽅法104 * @param document docx解析对象105 * @param textMap 需要替换的信息集合106*/107private static void changeTable(XWPFDocument document, Map<String, String> textMap){ 108//获取表格对象集合109 List<XWPFTable> tables = document.getTables();110for (int i = 0; i < tables.size(); i++) {111//只处理⾏数⼤于等于2的表格,且不循环表头112 XWPFTable table = tables.get(i);113if(table.getRows().size()>1){114//判断表格是需要替换还是需要插⼊,判断逻辑有$为替换,表格⽆$为插⼊115if(checkText(table.getText())){116 List<XWPFTableRow> rows = table.getRows();117//遍历表格,并替换模板118 eachTable(rows, textMap);119 }120 }121 }122123124 }125126127/**128 * 遍历表格129 * @param rows 表格⾏对象130 * @param textMap 需要替换的信息集合131*/132private static void eachTable(List<XWPFTableRow> rows ,Map<String, String> textMap){ 133for (XWPFTableRow row : rows) {134 List<XWPFTableCell> cells = row.getTableCells();135for (XWPFTableCell cell : cells) {136//判断单元格是否需要替换137if(checkText(cell.getText())){138 List<XWPFParagraph> paragraphs = cell.getParagraphs();139for (XWPFParagraph paragraph : paragraphs) {140 List<XWPFRun> runs = paragraph.getRuns();141for (XWPFRun run : runs) {142 run.setText(changeValue(run.toString(), textMap),0);143 }144 }145 }146 }147 }148 }149150151/**152 * 判断⽂本中时候包含$153 * @param text ⽂本154 * @return 包含返回true,不包含返回false155*/156private static boolean checkText(String text){157 boolean check = false;158if(text.indexOf("$")!= -1){159 check = true;160 }161return check;162163 }164165/**166 * 匹配传⼊信息集合与模板167 * @param value 模板需要替换的区域168 * @param textMap 传⼊信息集合169 * @return 模板需要替换区域信息集合对应值170*/171private static String changeValue(String value, Map<String, String> textMap){172 Set<Entry<String, String>> textSets = textMap.entrySet();173for (Entry<String, String> textSet : textSets) {174//匹配模板与替换值格式${key}175 String key = "${"+textSet.getKey()+"}";176if(value.indexOf(key)!= -1){177 value = textSet.getValue();178 }179 }180//模板未匹配到区域替换为空181if(checkText(value)){182 value = "0";183 }184return value;185 }186187188 }注意:1. html模板和word模板共⽤的数据模型2. 写这个功能前翻阅了⼤量的关于java导出word的博客,有⼤量的将word转为ftl格式再去操作,感觉不是很⽅便和直观。
PageOffice动态生成WORD文件
PageOffice动态⽣成WORD⽂件从空⽩⽣成⽂件的代码:WordDocument doc = new WordDocument();//设置内容标题//创建DataRegion对象,PO_title为⾃动添加的书签名称,书签名称需以“PO_”为前缀,切书签名称不能重复//三个参数分别为要新插⼊书签的名称、新书签的插⼊位置、相关联的书签名称(“[home]”代表Word⽂档的页⾸)DataRegion title = doc.createDataRegion("PO_title", DataRegionInsertType.After, "[home]");//给DataRegion对象赋值title.setValue("JAVA中编程实例\n");//设置字体:粗细、⼤⼩、字体名称、是否是斜体title.getFont().setBold(true);title.getFont().setSize(20);title.getFont().setName("⿊体");title.getFont().setItalic(false);//定义段落对象ParagraphFormat titlePara = title.getParagraphFormat();//设置段落对齐⽅式titlePara.setAlignment(WdParagraphAlignment.wdAlignParagraphCenter);//设置段落⾏间距titlePara.setLineSpacingRule(WdLineSpacing.wdLineSpaceMultiple);//设置内容//第⼀段//创建DataRegion对象,PO_body为⾃动添加的书签名称DataRegion body = doc.createDataRegion("PO_body", DataRegionInsertType.After, "PO_title");//设置字体:粗细、是否是斜体、⼤⼩、字体名称、字体颜⾊body.getFont().setBold(true);body.getFont().setItalic(true);body.getFont().setSize(10);//设置中⽂字体名称body.getFont().setName("楷体");//设置英⽂字体名称body.getFont().setNameAscii("Times New Roman");body.getFont().setColor(Color.red);//给DataRegion对象赋值body.setValue("⾸先,我向⼤家介绍⼀下套接字的概念。
java使用poi动态导出的操作
java使⽤poi动态导出的操作实现⽤户想要那个字段的数据,就导出那个字段的数据,我使⽤#分割字段实现在传⼊字段的值时做⽂章创建⼀个excel导出⼯具类,package com.zy.util;import java.io.OutputStream;import ng.reflect.Method;import java.util.Collection;import java.util.Iterator;import javax.servlet.http.HttpServletResponse;import ermodel.HSSFCell;import ermodel.HSSFCellStyle;import ermodel.HSSFRow;import ermodel.HSSFSheet;import ermodel.HSSFWorkbook;import ermodel.Font;/*** *** @Title: ExportExcelUtil.java* @Package com.jarmsystem.web.util 类描述: 基于POI的javaee导出Excel⼯具类* @author 范保林* @date 2018年11⽉16⽇上午10:38:00* @version V1.0*/public class ExPortExcelUtil {/**** @param response* 请求* @param fileName* ⽂件名如:"⽤户表"* @param excelHeader* excel表头数组,存放"管理员#admin"格式字符串,"管理员"为excel标题⾏, "admin"为对象字段名* @param dataLis* 数据集合,需与表头数组中的字段名⼀致,并且符合javabean规范(驼峰命名法)* @return 返回⼀个HSSFWorkbook* @throws Exception*/public static <T> HSSFWorkbook export(HttpServletResponse response, String fileName, String[] excelHeader, Collection<T> dataLis) throws Exception {response.setContentType("application/x-download");response.setCharacterEncoding("utf-8");// 处理编码问题response.setHeader("Content-Disposition","attachment;filename=" + new String(fileName.getBytes("gbk"), "iso8859-1") + ".xls");// 表头编码问题// 创建⼀个⼯作薄HSSFWorkbook wb = new HSSFWorkbook();// 设置标题样式HSSFCellStyle titleStyle = wb.createCellStyle();// 设置单元格边框样式titleStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);// 上边框细边线titleStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);// 下边框细边线titleStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);// 左边框细边线titleStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);// 右边框细边线// 设置单元格对齐⽅式titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);// ⽔平居中titleStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直居中// 设置字体样式Font titleFont = wb.createFont();titleFont.setFontHeightInPoints((short) 15);// 字体⾼度titleFont.setFontName("⿊体");// 字体样式titleStyle.setFont(titleFont);// 在 workBook ⼯作簿中添加⼀个sheet(⼯作表) 对应excel⽂件中的sheetHSSFSheet sheet = wb.createSheet();// 标题数组String[] titleArray = new String[excelHeader.length];// 字段名数组String[] fieldArray = new String[excelHeader.length];for (int i = 0; i < excelHeader.length; i++) {String[] tempArray = excelHeader[i].split("#");titleArray[i] = tempArray[0];fieldArray[i] = tempArray[1];}// 在sheet中添加标题⾏HSSFRow row = sheet.createRow(0);// ⾏数从0开始// ⾃动设置宽度sheet.autoSizeColumn(0);// 设置表格默认列宽度sheet.setDefaultColumnWidth(20);// 为标题⾏赋值for (int i = 0; i < titleArray.length; i++) {// 需要序号就需要+1 因为0号位被序号占⽤HSSFCell titleCell = row.createCell(i);titleCell.setCellValue(titleArray[i]);titleCell.setCellStyle(titleStyle);sheet.autoSizeColumn(i + 1); // 0 号被序号占⽤}// 字段的数据样式标题和字段的数据样式不同,需分开设置HSSFCellStyle dataStyle = wb.createCellStyle();// 设置数据边框dataStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);dataStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);dataStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);dataStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);// 设置居中样式dataStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);// ⽔平居中dataStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直居中// 设置数据字体Font dataFont = wb.createFont();dataFont.setFontHeightInPoints((short) 12);// 字体⾼度dataFont.setFontName("宋体");// 字体dataStyle.setFont(dataFont);// 遍历数据⾏,产⽣数据⾏Iterator<T> it = dataLis.iterator();int index = 0;while (it.hasNext()) {index++; // ⽼话 0号位被占⽤row = sheet.createRow(index);T t = it.next();// 利⽤反射根据传过来的字段名数组,动态调⽤对应的getxxx()⽅法得到属性值for (int i = 0; i < fieldArray.length; i++) {// 需要序号就需要 i+1HSSFCell dataCell = row.createCell(i);dataCell.setCellStyle(dataStyle);sheet.autoSizeColumn(i);String fieldName = fieldArray[i];// 取得对应的getxxx()⽅法实体类命名⼀定要⽤驼峰才能分割成功String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); Class<? extends Object> tCls = t.getClass();// 泛型为Object以及所有Object的⼦类Method getMethod = tCls.getMethod(getMethodName, new Class[] {});// 通过⽅法名得到对应的⽅法 Object value = getMethod.invoke(t, new Object[] {});// 动态调⽤⽅法,得到属性值if (value != null) {dataCell.setCellValue(value.toString());// 为当前列赋值}}}OutputStream outputStream = response.getOutputStream();// 打开流wb.write(outputStream);// HSSFWorkbook写⼊流wb.close();// HSSFWorkbook关闭outputStream.flush();// 刷新流outputStream.close();// 关闭流// excel 各种样式// XSSFCellStyle.ALIGN_CENTER 居中对齐// XSSFCellStyle.ALIGN_LEFT 左对齐// XSSFCellStyle.ALIGN_RIGHT 右对齐// XSSFCellStyle.VERTICAL_TOP 上对齐// XSSFCellStyle.VERTICAL_CENTER 中对齐// XSSFCellStyle.VERTICAL_BOTTOM 下对齐// CellStyle.BORDER_DOUBLE 双边线// CellStyle.BORDER_THIN 细边线// CellStyle.BORDER_MEDIUM 中等边线// CellStyle.BORDER_DASHED 虚线边线// CellStyle.BORDER_HAIR ⼩圆点虚线边线// CellStyle.BORDER_THICK 粗边线return wb;}}controller 层调⽤/*** 动态导出 excel (想导什么字段就传固定格式的字段)** @param request* @param response* @param expor* @throws Exception*/@RequestMapping("/excelOut")public void ExcelOut(HttpServletRequest request, HttpServletResponse response, String export) {export = "管理员#admin,id#id"; // ,⼿机号码#adminPhone 只导出两个字段String[] excelHeader = export.split(",");List<Tb_User> projectList = new ArrayList<Tb_User>();Tb_User tb_User = new Tb_User();// 模拟从数据库查询数据查询所有tb_User.setAdmin("范保林");tb_User.setId("1111");tb_User.setAdminPhone("111");projectList.add(tb_User);try {ExPortExcelUtil.export(response, "⽤户表", excelHeader, projectList);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();System.out.println("导出失败!");}}三个字段的实体类导出所需要的两个字段数据补充知识:java使⽤poi导出excel的内容,同时可以利⽤反射进⾏动态获取信息⼀,Java-poi导出我们很多⼈都是希望我们可以写⼀个我们的Java导出的⼯具类,不需要⽤插件来实现,那下⾯就是我写的⼀个Java导出⼯具类,话不多说开始。
java实现的导出word文档
java实现的导出word⽂档之前没有做过类似的功能,所以第⼀次接触的时候费了我⼀天的时间来完成这个功能。
先说⼀下原理,其实就是通过修改后缀来完成的。
需要先⽤office2013做⼀个word模板,就是你想要⽣成的word的模板,保存为xml格式。
然后在线格式化⼀下,这样⽣成的代码⽐较规范,然后将后缀修改为ftl,内容为⼀下格式:、我使⽤的⽅法是通过Action跳转的⽅法来进⾏调⽤的,Action⽅法如下,[java] view plain copy print?1. public String exportProWorkOrder(){2.3. /** 取出参数**/4.5. /** 输出审批 **/6. Template t=null;7. PrintWriter wt = null;8.9. try {10. /** 查询数据 **/11. ProjectWorkOrder pwo = consultingProjectBo.findPWOMessage(18);12.13. Map<String,Object> dataMap=new HashMap<String,Object>();14.15. //getData(dataMap);16. /** 放置数据 **/17. consultingProjectBo.makeExportProWorkOrderData(pwo,dataMap);18. String fn = makeFileName(pwo);19.20. //FTL⽂件所存在的位置21. t = freeMarkerConfiguration.getTemplate("export_proworkorder.ftl"); //⽂件名22.23.24. //配置 Response 参数25. getResponse().setContentType(26. "application/msword; charset=UTF-8");27. getResponse().setHeader(28. "Content-Disposition",29. "Attachment;filename= "30. + new String(fn.toString().getBytes(31. //"UTF-8"),"UTF-8"));32. "gb2312"), "ISO8859_1"));//20151030 改为UTF-8 需要兼容性测试33. wt = getResponse().getWriter();34. t.process(dataMap, wt);34. t.process(dataMap, wt);35.36. } catch (IOException e) {37. e.printStackTrace();38. } catch (Exception e) {39. e.printStackTrace();40. } finally {41. if(wt!=null){42. wt.flush();43. wt.close();44. }45. }46. return null;47. }48.49. protected String makeFileName(ProjectWorkOrder pwo) {50. if(pwo==null){51. return "⽂件不存在";52. }53.54. String filename = "";55. if(pwo.getProjectTitle()!=null){56. filename = pwo.getProjectTitle() + "⼯程造价咨询项⽬⼯作交办单" + ".doc";57. }else{58. filename = "⼯程造价咨询项⽬⼯作交办单"+".doc";59. }60.61. return filename;62. }跳转进⼊⽅法中,期中放置数据的⽅法如下,[java] view plain copy print?1. public ProjectWorkOrder findPWOMessage(Integer projectId){2. SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" );3. Project project = null;4. List<ProjectDepartment> list = null;5. ProjectEngineering pe = null;6. project = projectBo.findFull(projectId);7. list = projectDepartmentBo.findPDByProjectId(projectId);8. pe = projectEngineeringBo.findPEByProjectId(projectId);9. ProjectWorkOrder pwo = new ProjectWorkOrder();10. if(projectId != null){11. pwo.setProjectId(projectId);12. }13. if(project.getProject_title() != null){14. pwo.setProjectTitle(project.getProject_title());15. }16. if(project.getBegin_date() != null){17. pwo.setBeginDate(sdf.format(project.getBegin_date()));18. }19. if(project.getEnd_date() != null){20. pwo.setEndDate(sdf.format(project.getEnd_date()));21. }22. if(project.getProject_target() != null){23. pwo.setProjecTarget(project.getProject_target());24. }24. }25. if(project.getMember_id() != null){26. Member member = memberBo.getCacheMember(project.getMember_id());27. pwo.setMemberId(member.getMember_name());28. }29. if(pe.getPlan_no() != null){30. pwo.setPlanNu(pe.getPlan_no());31. }32. if(pe.getIncrement() != null){33. pwo.setInvestment(pe.getIncrement());34. }35. if(pe.getDo_item() != null){36. pwo.setDoItem(pe.getDo_item());37. }38. if(pe.getKey_point() != null){39. pwo.setKeyPoint(pe.getKey_point());40. }41. if(list != null){42. pwo.setChild(addtypePlus(list));43. }44. return pwo;45. }46. /**47. *将⼯程造价咨询项⽬⼯作交办单导出为word48. */49. @Override50. public void makeExportProWorkOrderData(ProjectWorkOrder pwo, Map<String, Object> dataMap) {51. if(pwo==null){52. return;53. }54. if(pwo.getProjectTitle() != null){55. dataMap.put("ptitle",pwo.getProjectTitle());//项⽬名称56. }else{57. dataMap.put("ptitle","⽆");58. }59. if(pwo.getProjectId() != null){60. dataMap.put("pid", pwo.getProjectId());//⼯程id61. }else{62. dataMap.put("pid", "0");63. }64. if(pwo.getBeginDate() != null){65. dataMap.put("begindate", pwo.getBeginDate());//项⽬开始时间66. }else{67. dataMap.put("begindate", "⽆");68. }69. if(pwo.getEndDate() != null){70. dataMap.put("endate", pwo.getEndDate());//结束⽇期71. }else{72. dataMap.put("endate", "⽆");73. }74. if(pwo.getProjecTarget() != null){75. dataMap.put("ptarget", pwo.getProjecTarget());//⽬标76. }else{77. dataMap.put("ptarget", "⽆");78. }79. if(pwo.getMemberId() != null){80. dataMap.put("pmemberid", pwo.getMemberId());//负责⼈81. }else{81. }else{82. dataMap.put("pmemberid", "⽆");83. }84. if(pwo.getPlanNu() != null){85. dataMap.put("plano", pwo.getPlanNu());//计划编号86. }else{87. dataMap.put("plano", "⽆");88. }if(pwo.getInvestment() != null){89. dataMap.put("investment", pwo.getInvestment());//总投资90. }else{91. dataMap.put("investment", "⽆");92. }93. if(pwo.getDoItem() != null){94. dataMap.put("doitem", pwo.getDoItem());//事项95. }else{96. dataMap.put("doitem", "⽆");97. }98. if(pwo.getKeyPoint() != null){99. dataMap.put("keypoint", pwo.getKeyPoint());//重点100. }else{101. dataMap.put("keypoint", "⽆");102. }103. if(pwo.getChild() != null){104. dataMap.put("list", pwo.getChild());//联系⼈列表105. }else{106. dataMap.put("list", "⽆");107. }108. SimpleDateFormat tempDate = new SimpleDateFormat("yyyy年MM⽉dd⽇"); 109. String datetime = tempDate.format(DateTimeUtil.getCurrDate());110. dataMap.put("datetime", datetime);111. }112. /**113. * 将单位类型数字转换为对应的字符114. */115. private List<ProjectDepartment> addtypePlus(List<ProjectDepartment> list){116. for (ProjectDepartment projectDepartment : list) {117. if(projectDepartment.getType() == 1){projectDepartment.setTypePlus("委托单位");} 118. if(projectDepartment.getType() == 2){projectDepartment.setTypePlus("建设单位");} 119. if(projectDepartment.getType() == 3){projectDepartment.setTypePlus("施⼯单位");} 120. if(projectDepartment.getType() == 4){projectDepartment.setTypePlus("监理单位");} 121. if(projectDepartment.getType() == 5){projectDepartment.setTypePlus("设计单位");} 122. if(projectDepartment.getType() == 6){projectDepartment.setTypePlus("编制单位");} 123. }124. return list;125. }配置⽂件的信息这⾥就不在多说了,同时需要修改ftl中的参数,修改⽅法如下,[html] view plain copy print?1. <w:r wsp:rsidRPr="002C3578">2. <w:rPr>3. <w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:hint="fareast"/>4. <wx:font wx:val="宋体"/>5. <w:sz-cs w:val="21"/>6. </w:rPr>7. <w:t><![CDATA[${doitem}]]></w:t>7. <w:t><![CDATA[${doitem}]]></w:t>8. </w:r>与jsp中的⽅法基本⼀致,处理list,如果遇到循环的话,使⽤如下的⽅法,[html] view plain copy print?1. <#list list as bean><!-- Start 循环体 -->2. <w:tr wsp:rsidR="002C3578" wsp:rsidRPr="002C3578" wsp:rsidTr="002C3578">3. <w:trPr>4. <w:trHeight w:val="427"/>5. </w:trPr>6. <w:tc>7. <w:tcPr>8. <w:tcW w:w="534" w:type="dxa"/>9. <w:vmerge/>10. <w:shd w:val="clear" w:color="auto" w:fill="auto"/>11. </w:tcPr>12. <w:p wsp:rsidR="0068277C" wsp:rsidRPr="002C3578" wsp:rsidRDefault="0068277C" wsp:rsidP="002C3578">13. <w:pPr>14. <w:jc w:val="center"/>15. <w:rPr>16. <w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:hint="fareast"/>17. <wx:font wx:val="宋体"/>18. <w:sz-cs w:val="21"/>19. </w:rPr>20. </w:pPr>21. </w:p>22. </w:tc>23. <w:tc>24. <w:tcPr>25. <w:tcW w:w="1596" w:type="dxa"/>26. <w:shd w:val="clear" w:color="auto" w:fill="auto"/>27. </w:tcPr>28. <w:p wsp:rsidR="0068277C" wsp:rsidRPr="002C3578" wsp:rsidRDefault="0068277C" wsp:rsidP="002C3578">29. <w:pPr>30. <w:spacing w:line="360" w:line-rule="auto"/>31. <w:jc w:val="center"/>32. <w:rPr>33. <w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:hint="fareast"/>34. <wx:font wx:val="宋体"/>35. <w:sz-cs w:val="21"/>36. </w:rPr>37. </w:pPr>38. <w:r wsp:rsidRPr="002C3578">39. <w:rPr>40. <w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:hint="fareast"/>41. <wx:font wx:val="宋体"/>42. <w:sz-cs w:val="21"/>43. </w:rPr>44. <w:t><![CDATA[${bean.typePlus}]]></w:t>45. </w:r>46. </w:p>47. </w:tc>48. <w:tc>48. <w:tc>49. <w:tcPr>50. <w:tcW w:w="2130" w:type="dxa"/>51. <w:shd w:val="clear" w:color="auto" w:fill="auto"/>52. </w:tcPr>53. <w:p wsp:rsidR="0068277C" wsp:rsidRPr="002C3578" wsp:rsidRDefault="0068277C" wsp:rsidP="002C3578">54. <w:pPr>55. <w:spacing w:line="360" w:line-rule="auto"/>56. <w:jc w:val="center"/>57. <w:rPr>58. <w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:hint="fareast"/>59. <wx:font wx:val="宋体"/>60. <w:sz-cs w:val="21"/>61. </w:rPr>62. </w:pPr>63. <w:r wsp:rsidRPr="002C3578">64. <w:rPr>65. <w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:hint="fareast"/>66. <wx:font wx:val="宋体"/>67. <w:sz-cs w:val="21"/>68. </w:rPr>69. <w:t><![CDATA[${bean.department_name}]]></w:t>70. </w:r>71. </w:p>72. </w:tc>73. <w:tc>74. <w:tcPr>75. <w:tcW w:w="2131" w:type="dxa"/>76. <w:shd w:val="clear" w:color="auto" w:fill="auto"/>77. </w:tcPr>78. <w:p wsp:rsidR="0068277C" wsp:rsidRPr="002C3578" wsp:rsidRDefault="0068277C" wsp:rsidP="002C3578">79. <w:pPr>80. <w:spacing w:line="360" w:line-rule="auto"/>81. <w:jc w:val="center"/>82. <w:rPr>83. <w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:hint="fareast"/>84. <wx:font wx:val="宋体"/>85. <w:sz-cs w:val="21"/>86. </w:rPr>87. </w:pPr>88. <w:r wsp:rsidRPr="002C3578">89. <w:rPr>90. <w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:hint="fareast"/>91. <wx:font wx:val="宋体"/>92. <w:sz-cs w:val="21"/>93. </w:rPr>94. <w:t><![CDATA[${bean.linkman}]]></w:t>95. </w:r>96. </w:p>97. </w:tc>98. <w:tc>99. <w:tcPr>100. <w:tcW w:w="2131" w:type="dxa"/>101. <w:shd w:val="clear" w:color="auto" w:fill="auto"/>102. </w:tcPr>103. <w:p wsp:rsidR="0068277C" wsp:rsidRPr="002C3578" wsp:rsidRDefault="0068277C" wsp:rsidP="002C3578"> 104. <w:pPr>104. <w:pPr>105. <w:spacing w:line="360" w:line-rule="auto"/>106. <w:jc w:val="center"/>107. <w:rPr>108. <w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:hint="fareast"/>109. <wx:font wx:val="宋体"/>110. <w:sz-cs w:val="21"/>111. </w:rPr>112. </w:pPr>113. <w:r wsp:rsidRPr="002C3578">114. <w:rPr>115. <w:rFonts w:ascii="宋体" w:h-ansi="宋体"/>116. <wx:font wx:val="宋体"/>117. <w:sz-cs w:val="21"/>118. </w:rPr>119. <w:t><![CDATA[${bean.phone}]]></w:t>120. </w:r>121. </w:p>122. </w:tc>123. </w:tr>124. </#list><!-- End 循环体 -->这样就能导出想要的word⽂档,⼀定要记住,使⽤office2013,我试着⽤WPS,但是⽣成内容让我很懵逼,全是xml代码。
javaweb页面导出word
①我做了一个word模板,定义好了书签为listyd,书签是在一个表格中,在书签位置动态的生成表格,例子代码如下:var ole = new ActiveXObject("Word.Application");var url=c:\nsqktzs_fm.doc"var doc =ole.documents.open(url,false,false);ole.V isible = true;ole.selection.find.forward =true;var rg=ole.selection.goto(true,0,0,"listyd");var tab=doc.Tables.Add(rg, 2,2) ;for(var i=1;i<=2;i++){for(var j=1;j<=2;j++){var rgcell=tab.Cell(i,j).Range;rgcell.InsertAfter(i+j);}}生成的表格嵌套在以前的表格中,很难看,如何能让生成的表格和外边的表格看上去是一个整体。
rgcell.InsertAfter(i+j);可以用insertBefore么。
也可以考虑用java语言做word模板。
③.小弟最近在做JSP页面内容导出到Word,但遇到了很多困难,望各位大侠急救!!!需求:1.将JSP页面中的内容导出到Word文件中。
2.JSP页面中包含图片,图片的数据是从数据库中加载出来,实时生成的。
小弟在网上看过N个例子,也测试了,就是无法解决,问题如下:1.通过window.document.location.href='test.action'的链接方式,访问加一个JSP页面,文件头为:<%@ page contentType="application/msword;charset=gbk"%><meta http-equiv="Content-Type" content="application/msword;charset=gbk">当点击“导出”按钮时,可以生成Word文件,但是图片无法在Word中生成.2.直接在页面中加JS脚本:var oWD = new ActiveXObject("Word.Application");oWD.WindowState = 2;var oDC = oWD.Documents.Add("",0,1);var oRange =oDC.Range(0,1);var sel = document.body.createTextRange();sel.moveToElementText(PrintA);sel.select();sel.execCommand("Copy");oRange.Paste();oWD.Application.Visible = true;在我的电脑上可以导出Word(我的office版本是2007)文件,并且可以显示图片。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
JAVA不使用POI,用PageOffice动态导出Word文档很多情况下,软件开发者需要从数据库读取数据,然后将数据动态填充到手工预先准备好的Word模板文档里,这对于大批量生成拥有相同格式排版的正式文件非常有用,这个功能应用PageOffice的基本动态填充功能即可实现。
但若是用户想动态生成一个没有固定模版的公文时,换句话说,没有办法事先准备一个固定格式的模板时,就需要开发人员在后台用代码实现Word文档的从零到图文并茂的动态生成功能了。
这里的“零”指的是Word空白文档。
那如何实现Word文档的从无到有呢,下面我就把自己实现这一功能的过程介绍一下。
例如,我想打开一个Word文档,里面的内容为:标题(粗体、黑体、字体大小为20、居中显示)、第一段内容(内容(略)、字体倾斜、字体大小为10、中文“楷体”、英文“Times New Roman”、红色、最小行间距、左对齐、首行缩进)、第二段内容(内容(略)、字体大小为12、黑体、1.5倍行间距、左对齐、首行缩进、插入图片)、第三段内容(内容(略)、字体大小为14、华文彩云、2倍行间距、左对齐、首行缩进)第一步:请先安装PageOffice的服务器端的安装程序,之后在WEB项目下的“WebRoot/WEB-INF/lib”路径中添加pageoffice.cab和pageoffice.jar(在网站的“下载中心”中可下载相应的压缩包,解压之后直接将pageoffice.cab和pageoffice.jar文件拷贝到该目录下就可以了)文件。
第二步:修改WEB项目的配置文件,将如下代码添加到配置文件中:<!-- PageOffice Begin --><servlet><servlet-name>poserver</servlet-name><servlet-class>com.zhuozhengsoft .pageoffice.poserver.Server</servlet-class></servlet><servlet-mapping><servlet-name>poserver</servlet-name><url-pattern>/poserver.do</url-pattern></servlet-mapping><servlet-mapping><servlet-name>poserver</servlet-name><url-pattern>/pageoffice.cab</url-pattern></servlet-mapping><servlet-mapping><servlet-name>poserver</servlet-name><url-pattern>/popdf.cab</url-pattern></servlet-mapping><servlet-mapping><servlet-name>poserver</servlet-name><url-pattern>/sealsetup.exe</url-pattern></servlet-mapping><servlet><servlet-name>adminseal</servlet-name><servlet-class>com.zhuozhengsoft.pageoffice.poserver.AdminSeal </servlet-class></servlet><servlet-mapping><servlet-name>adminseal</servlet-name><url-pattern>/adminseal.do</url-pattern></servlet-mapping><servlet-mapping><servlet-name>adminseal</servlet-name><url-pattern>/loginseal.do</url-pattern></servlet-mapping><servlet-mapping><servlet-name>adminseal</servlet-name><url-pattern>/sealimage.do</url-pattern></servlet-mapping><mime-mapping><extension>mht</extension><mime-type>message/rfc822</mime-type></mime-mapping><context-param><param-name>adminseal-password</param-name><param-value>123456</param-value></context-param><!-- PageOffice End -->第三步:在WEB项目的WebRoot目录下添加文件夹存放word模板文件,在此命名为“doc”,将要打开的空白Word文件拷贝到该文件夹下,我要打开的Word文件为“test.doc”。
第四步:在WEB项目的WebRoot目录下添加动态页面word.jsp。
在该页面后台中添加自定义标签库:“<%@ taglib uri=""prefix="po"%>”,引入PageOffice类库:“<%@pageimport=”com.zhuozhengsoft.pageoffice.wordwriter.*,com.zhuozhengsoft.pageoffice .*%>””。
在前台HTML页面中添加PageOfficeCtrl控件:“<po:PageOfficeCtrlid="PageOfficeCtrl1"></po:PageOfficeCtrl>”,并设置控件所在层(<div></div>)的高和宽。
第五步:在word.jsp页面的后台编写代码对Word文档内容进行填充并排版,代码如下://************************PageOffice组件的使用************************ WordDocument doc = new WordDocument();//设置内容标题//创建DataRegion对象,PO_title为自动添加的书签名称,书签名称需以“PO_”为前缀,切书签名称不能重复//三个参数分别为要新插入书签的名称、新书签的插入位置、相关联的书签名称(“[home]”代表Word文档的第一个位置)DataRegion title = doc.createDataRegion("PO_title", DataRegionInsertType.After, "[home]");//给DataRegion对象赋值title.setValue("JAVA中编程实例\n");//设置字体:粗细、大小、字体名称、是否是斜体title.getFont().setBold(true);title.getFont().setSize(20);title.getFont().setName("黑体");title.getFont().setItalic(false);//定义段落对象ParagraphFormat titlePara = title.getParagraphFormat();//设置段落对齐方式titlePara.setAlignment(WdParagraphAlignment.wdAlignParagraphCenter); //设置段落行间距titlePara.setLineSpacingRule(WdLineSpacing.wdLineSpaceMultiple);//设置内容//第一段//创建DataRegion对象,PO_body为自动添加的书签名称DataRegion body = doc.createDataRegion("PO_body", DataRegionInsertType.After, "PO_title");//设置字体:粗细、是否是斜体、大小、字体名称、字体颜色body.getFont().setBold(true);body.getFont().setItalic(true);body.getFont().setSize(10);//设置中文字体名称body.getFont().setName("楷体");//设置英文字体名称body.getFont().setNameAscii("Times New Roman");body.getFont().setColor(Color.red);//给DataRegion对象赋值body.setValue("首先,我向大家介绍一下套接字的概念。
\n");//创建ParagraphFormat对象ParagraphFormat bodyPara = body.getParagraphFormat();//设置段落的行间距、对齐方式、首行缩进bodyPara.setLineSpacingRule(WdLineSpacing.wdLineSpaceAtLeast);bodyPara.setAlignment(WdParagraphAlignment.wdAlignParagraphLeft); bodyPara.setFirstLineIndent(21);//第二段DataRegion body2 = doc.createDataRegion("PO_body2", DataRegionInsertType.After, "PO_body");body2.getFont().setBold(false);body2.getFont().setSize(12);body2.getFont().setName("黑体");body2.setValue("套接字是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。