java导出word
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下,在本地编译的时候可以使⽤类加载器获取,但是打包到正式环境后就会找不到模板。
javaPOIHTML转Word两种方式
javaPOIHTML转Word两种⽅式说明,不论使⽤哪种⽅式,都不能引⽤CSS来渲染样式,⽽是使⽤style,或者将样式放在当前页⾯的<style></style>中⽅法⼀、1、引⽤的jar包<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.0</version></dependency>2、核⼼代码String html = "<div>测试内容</div";POIFSFileSystem poifs = null;FileOutputStream ostream = null;ByteArrayInputStream bais = null;String uuid = "测试.doc";File file = null;try { //HTML内容必须被<html><body></body></html>包装 fileParam.setcContent("<html><body>" + html + "</body></html>"); byte[] b = fileParam.getcContent().getBytes(); bais = new ByteArrayInputStream(b); poifs = new POIFSFileSystem(); DirectoryEntry directory = poifs.getRoot(); //WordDocument名称不允许修改 directory.createDocument("WordDocument", bais); ostream = new FileOutputStream(uuid); poifs.writeFilesystem(ostream);//当前⽬录下就⽣成了⼀个测试.doc的⽂档} catch (Exception e) { logger.error("exception is {}", e);} finally { IOUtils.closeQuietly(poifs); IOUtils.closeQuietly(ostream); IOUtils.closeQuietly(bais); try { FileUtils.forceDelete(file); } catch (Exception e2) { }}⽅法⼆/*** word格式html的标签头*/public static final String HTML_TAG_BGN = "<html xmlns=\"/TR/REC-html40\" xmlns:v=\"urn:schemas-microsoft-com:vml\" xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:w=\"urn:schemas-microsoft-com:office public filePath downloadWordReport(String htmlForPrint) {try {String wordString = htmlForPrint.replaceAll("<head>", "").replaceAll("<html>", HTML_TAG_BGN );String fileName = new String("测试⽂件.doc".getBytes(), "UTF-8");//上传⽂件⽅法return this.upload(new ByteArrayInputStream(wordString.getBytes()), fileName);} catch (Exception e) {return null;}}。
java实现pdf转word(文字)
java实现pdf转word(⽂字)1:添加依赖<?xml version="1.0" encoding="UTF-8"?><project xmlns="/POM/4.0.0"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>pdfToWord</groupId><artifactId>pdfToWord</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency><dependency><groupId>org.apache.pdfbox</groupId><artifactId>fontbox</artifactId><version>2.0.11</version></dependency><dependency><groupId>com.levigo.jbig2</groupId><artifactId>levigo-jbig2-imageio</artifactId><version>2.0</version></dependency><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox-tools</artifactId><version>2.0.11</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version></dependency></dependencies></project>2:编写转换的⽅法import org.apache.pdfbox.pdmodel.PDDocument;import org.apache.pdfbox.text.PDFTextStripper;import java.io.*;/*** 把pdf转换为word格式** @author Angin* @date 2019/3/18 0018.*/public class PdfToWord {/*** 转换*/public void convertText(String pdfPath) {PDDocument doc = null;OutputStream fos = null;Writer writer = null;PDFTextStripper stripper = null;try {doc = PDDocument.load(new File(pdfPath));fos = new FileOutputStream(pdfPath.substring(0, pdfPath.indexOf(".")) + ".doc");writer = new OutputStreamWriter(fos, "UTF-8");stripper = new PDFTextStripper();int pageNumber = doc.getNumberOfPages();stripper.setSortByPosition(true);stripper.setStartPage(1);stripper.setEndPage(pageNumber);stripper.writeText(doc, writer);writer.close();doc.close();} catch (IOException e) {e.printStackTrace();}System.out.println("end..");}}3:main⽅法中进⾏测试/*** main⽅法测试* @author Angin* @date 2019/3/18 0018.*/public class MainClass {public static void main(String[] args) {PdfToWord convert=new PdfToWord();convert.convertText("E:\\pdfToWord.pdf");}}此⽅法只适合⽂档型的pdf转换,如果图⽚的话,转换后⽆法读取。
java导出数据为word文档(保持模板格式)
java导出数据为word⽂档(保持模板格式)导出数据到具体的word⽂档⾥⾯,word有⼀定的格式,需要保持不变这⾥使⽤freemarker来实现:①:设计好word⽂档格式,需要⽤数据填充的地⽅⽤便于识别的长字符串替换如 aaaaaaaaaaaaaaaa②:将word⽂档另存为 2003 xml格式③:找到需要替换的地⽅,如将 aaaaaaaaaaaa 修改为 ${userName}如果是list展⽰,注意按照如下⽅式修改:<#list list1 as list1Item>XXXXXXXXXXXXXXXXXX 原有格式代码如⼀⾏数据或者⼀个单元格</#list>④:替换完成后,将xml⽂件后缀修改为ftljava代码如下:package com.xiao;import java.io.UnsupportedEncodingException;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;public class Main {public static void main(String[] args) throws UnsupportedEncodingException {Map<String, Object> dataMap = new HashMap<String, Object>();dataMap.put("name", "肖昌伟");dataMap.put("depart", "云平台");dataMap.put("date", "2016年"); //列表数据封装List<String> list1 = new ArrayList<String>();list1.add("itema");list1.add("itemb");list1.add("itemc");dataMap.put("list1", list1);DocumentHandler mdoc = new DocumentHandler();mdoc.createDoc(dataMap, "E:/outFile2.doc");}}package com.xiao;import java.io.BufferedWriter;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStreamWriter;import java.io.UnsupportedEncodingException;import java.io.Writer;import java.util.Map;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(Map<String, Object> dataMap, String fileName) throws UnsupportedEncodingException {//需要导出模板的包路径configuration.setClassForTemplateLoading(this.getClass(), "/com/xiao");Template t = null;try {t = configuration.getTemplate("template.ftl");} catch (IOException e) {e.printStackTrace();}File outFile = new File(fileName);Writer out = null;FileOutputStream fos = null;try {fos = new FileOutputStream(outFile);OutputStreamWriter oWriter = new OutputStreamWriter(fos, "UTF-8");out = new BufferedWriter(oWriter);} catch (FileNotFoundException e1) {e1.printStackTrace();}try {t.process(dataMap, out);out.close();fos.close();} catch (TemplateException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}System.out.println("⽂档导出完成");}}这样就可以看到填充好了数据的word⽂档,格式和模板设置的保持⼀致。
Java使用Poi-tlword模板导出word
Java使⽤Poi-tlword模板导出word 1.导⼊依赖<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.7.3</version></dependency>2.新建⼀个word,制作导出模板模板放⼊ resource/static/word/template⽂件夹下3.编写⼯具类⼯具类--WordExportServer.javapublic class WordExportServer {/*** 导出word**/public static void export(WordExportData wordExportData) throws IOException {HttpServletResponse response=wordExportData.getResponse();OutputStream out = response.getOutputStream();;XWPFTemplate template =null;try{ClassPathResource classPathResource = new ClassPathResource(wordExportData.getTemplateDocPath());String resource = classPathResource.getURL().getPath();resource= PdfUtil1.handleFontPath(resource);//渲染表格HackLoopTableRenderPolicy policy = new HackLoopTableRenderPolicy();Configure config = Configure.newBuilder().bind(wordExportData.getTableDataField(), policy).build();template = pile(resource, config).render(wordExportData.getWordData());String fileName=getFileName(wordExportData);/** ===============⽣成word到设置浏览默认下载地址=============== **/// 设置强制下载不打开response.setContentType("application/force-download");// 设置⽂件名response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);template.write(out);}catch (Exception e){e.printStackTrace();}finally {out.flush();out.close();template.close();}}/*** 获取导出下载的word名称* @param wordExportData* @return ng.String**/public static String getFileName(WordExportData wordExportData){if(null !=wordExportData.getFileName()){return wordExportData.getFileName()+".docx";}return System.currentTimeMillis()+".docx";}}word数据包装类--WordExportData .java@Datapublic class WordExportData {/*** word模板路径(static/wordTemplate/dealerListDocTemplate.docx)**/private String templateDocPath;/*** word填充数据(key值与模板中的key值要保持⼀致)**/private Map<String,Object> wordData;/*** word表格数据key值**/private String tableDataField;/*** word导出后的⽂件名(不填则⽤当前时间代替)**/private String fileName;private HttpServletResponse response;}4.controller层调⽤@RequestMapping("/printWord")public void printWord(HttpServletRequest request, HttpServletResponse response) throws IOException{String[] ids=request.getParameter("ids").split(";");List<DealerDto> goodsDataList=goodsService.getDealerListByIds(ids);Map<String,Object> docData=new HashMap<>(3);docData.put("detailList",goodsDataList);docData.put("title",标题);docData.put("subTitle",副标题);WordExportData wordExportData=new WordExportData();wordExportData.setResponse(response);wordExportData.setTableDataField("detailList");wordExportData.setTemplateDocPath(DEALER_DOC_TEMPLATE_PATH);//副本存放路径wordExportData.setWordData(docData);WordExportServer.export(wordExportData);}5.前端调⽤var ids = [];for (var index in checkData) {ids.push(checkData[index].id);}var batchIds = ids.join(";");layer.confirm('确定下载选中的数据吗?', function (index) {layer.close(index);window.location.href ='/goods/printWord?ids=' + batchIds;});6.总结优点:使⽤⽅法很简单,使⽤⼯具类的⽅法,⽅便复⽤于其他模块。
java利用xml导出word(占位符替换)
package cn.action;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.util.ArrayList;import java.util.Date;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Set;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerFactory;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.NodeList;import sun.misc.BASE64Encoder;public class XmlWord {private Map<String,String> dataMap = new HashMap<String,String>();public Map<String, String> getDataMap() {return dataMap;}public void setDataMap(Map<String, String> dataMap) {this.dataMap = dataMap;}/*** 设置标识值* @param tagList 标识* @param dataList 数据* @param dataMap*/public void setData(List<String> tagList,List<String> dataList){Iterator<String> it1 = tagList.iterator();Iterator<String> it2 = dataList.iterator();while(it1.hasNext()){this.dataMap.put(it1.next(), it2.next());}}/*** 载入一个xml文档* @param filename 文件路径* @return 成功返回Document对象,失败返回null*/public Document LoadXml(String filename){Document doc = null;try {DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();doc = (Document) builder.parse(new File(filename));System.out.println(doc);} catch (Exception e) {System.out.println("载入xml文件时出错");e.printStackTrace();}return doc;}/*** 图片转码* @return 返回图片base64字符串* @throws Exception*/public String getImageStr(String imgFile){InputStream in = null;BASE64Encoder encoder = null;byte[] data = null;try {in = new FileInputStream(imgFile);} catch (FileNotFoundException e) {System.out.println("文件没找到!");e.printStackTrace();}try {data = new byte[in.available()];in.read(data);in.close();} catch (IOException e) {e.printStackTrace();}encoder = new BASE64Encoder();return encoder.encode(data);}/*** doc2XmlFile* 将Document对象保存为一个xml文件* @return true:保存成功flase:失败* @param filename 保存的文件名* @param document 需要保存的document对象*/public boolean doc2XmlFile(Document document,String filename){boolean flag = true;try{TransformerFactory transFactory = TransformerFactory.newInstance();Transformer transformer = transFactory.newTransformer();DOMSource source=new DOMSource();source.setNode(document);StreamResult result=new StreamResult();FileOutputStream fileOutputStream = new FileOutputStream(filename);result.setOutputStream(fileOutputStream);transformer.transform(source, result);fileOutputStream.close();}catch(Exception ex){flag = false;ex.printStackTrace();}return flag;}/*** 替换标识内容:单个文本标记* @param element 要替换内容的节点* @param tag 标识名称* @param data 替换参数* @return 返回替换后的节点* @throws Exception*/public Element replaceTagContext(Object element,String tag,String data){Element xElement = null;xElement = (Element) element;NodeList tElements = xElement.getElementsByTagName("w:t");//w:t标签组for(int i=0; i<tElements.getLength(); i++){Element tElement = (Element)tElements.item(i);if(tElement.getTextContent().equals(tag)){tElement.setTextContent(data);}}return xElement;}/*** 替换标识内容:多个文本标记* @param element 要替换内容的节点* @return 返回替换后的节点* @throws Exception*/public Element replaceTagContext(Element element){Element xElement = element;NodeList tElements = xElement.getElementsByTagName("w:t");//w:t标签组Set<String> dataSet = this.dataMap.keySet();Iterator<String> it = dataSet.iterator();while(it.hasNext()){String tag = it.next();String data = dataMap.get(tag);for(int i=0; i<tElements.getLength(); i++){Element tElement = (Element)tElements.item(i);if(tElement.getTextContent().equals(tag)){tElement.setTextContent(data);}}}return xElement;}/*** 添加图片* @param element 需要替换内容的节点* @param tag 标识名称* @param imgName 图片名称,若word中有多张图,图片名必须唯一* @param imgStr 图片转码后的base64字符串* @return 返回替换后的节点*/public Element replacePic(Element element,String tag,String imgName,String imgFile){ Element xElement = element;NodeList tElements = xElement.getElementsByTagName("w:binData");//w:t标签组pkg:binaryDataString wName = "wordml://"+imgName;for(int i=0; i<tElements.getLength(); i++){Element picElement = (Element)tElements.item(i);if(picElement.getTextContent().equals(tag)){picElement.setTextContent(this.getImageStr(imgFile));/*图片编码*/picElement.setAttribute("w:name",wName);//设置名字Element imagedataElement = (Element) xElement.getElementsByTagName("v:imagedata").item(i);imagedataElement.setAttribute("src",wName);}}return xElement;}/*** 插入图片* @param parentElement 图片添加至何处* @param imgFile 图片路径* @param isnewLine 是否换行* @return 返回添加图片节点后的节点*/public Element addPic(Element parentElement,String imgFile,boolean isnewLine){ Document parent = parentElement.getOwnerDocument();Element p = null;Element pict = null;Element binData = null;Element shape = null;Element imagedata = null;String src = "wordml://" + new Date().getTime();if(isnewLine){p = parent.createElement("w:p");}pict = parent.createElement("w:pict");binData = parent.createElement("w:binData");binData.setAttribute("w:name", src);binData.setAttribute("xml:space", "preserve");binData.setTextContent(this.getImageStr(imgFile));shape = parent.createElement("v:shape");imagedata = parent.createElement("v:imagedata");imagedata.setAttribute("src", src);//构造图片节点shape.appendChild(imagedata);pict.appendChild(binData);pict.appendChild(shape);if(isnewLine){p.appendChild(pict);parentElement.appendChild(p);}else{parentElement.appendChild(pict);}return parentElement;}/*** 插入段落* @param parentElement 待添加段落的节点* @param data 待插入数据* @return*/public Element addParagraph(Element parentElement,String data){ Document parent = parentElement.getOwnerDocument();Element p = null;Element r = null;Element t = null;p = parent.createElement("w:p");r = parent.createElement("w:r");t = parent.createElement("w:t");t.setTextContent(data);//构造图片节点r.appendChild(t);p.appendChild(r);parentElement.appendChild(p);return parentElement;}}。
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不使用POI,用PageOffice动态导出Word文档
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”。
Freemarker+xml实现Java导出word
Freemarker+xml实现Java导出word前⾔最近做了⼀个调查问卷导出的功能,需求是将维护的题⽬,答案,导出成word,参考了⼏种⽅案之后,选择功能强⼤的freemarker+固定格式之后的wordxml实现导出功能。
导出word的代码是可以直接复⽤的,于是在此贴出,并进⾏总结,⽅便⼤家拿⾛。
实现过程概览先在word上,调整好⾃⼰想要的样⼦。
然后存为xml⽂件。
保存为freemarker模板,以ftl后缀结尾。
将需要替换的变量使⽤freemarker的语法进⾏替换。
最终将数据准备好,和模板进⾏渲染,⽣成⽂件并返回给浏览器流。
详细的实现过程准备好word的样式我们新建⼀个word,我们应该使⽤Microsoft office,如果使⽤wps可能会造成样式有些不兼容。
在新建的office中,设置好我们的表格样式。
我们的调查问卷涉及到四种类型,单选,多选,填空,简答。
我们做出四种类型的⽰例。
样式没有问题后,我们选择另存为word xml 2003版本。
将会⽣成⼀个xml⽂件。
格式化xml,并⽤freemarker语法替换xml我们可以先下载⼀个⼯具 firstobject xml editor,这个可以帮助我们查看xml,同时⽅便我们定位我们需要改的位置。
复制过去之后,按f8可以将其进⾏格式化,左侧是标签,右侧是内容,我们只需要关注w:body即可。
像右侧的调查问卷这个就是个标题,我们实际渲染的时候应该将其进⾏替换,⽐如我们的程序数据map中,有title属性,我们想要这⾥展⽰,我们就使⽤语法${title}即可。
freemarker的具体语法,可以参考freemarker的问题,在这⾥我给出⼏个简单的例⼦。
⽐如我们将所有的数据放置在dataList中,所以我们需要判断,dataList是不是空,是空,我们不应该进⾏下⾯的逻辑,不是空,我们应该先循环题⽬是必须的,答案是需要根据类型进⾏再次循环的。
javafreemarker导出word时添加或勾选复选框
javafreemarker导出word时添加或勾选复选框最近项⽬导出word碰到⼀个需求,要求根据数据动态的决定word⾥的复选框是否勾选,公司导出word⽤的是freemarker,相⽐较其他技术,freemarker可以很容易的控制输出样式,在word⾥编辑好模板,将要输出的数据⽤${变量名}代替,然后java代码⾥给变量塞了值就可以输出了.⾸先我们要知道在word⾥打钩和不打勾的复选框究竟是什么,新建⼀个word⽂档,在⾥⾯分别输⼊打钩和不打勾的复选框,然后右键另存为.xml ⽂件,因为freemarker导出就是在这样的xml⽂件的基础上的之所以在后⾯加了两个字,是为了之后能在n多的xml节点中找到两种框的表现是什么这个时候我们查看xml⽂件只有⼏⾏,有⼀⾏还特别长,是很⾮⼈类的,我们可以把它拷贝到eclipse等第三⽅⼯具中,然后格式化⼀下,看到的就是格式化都的xml,我们搜索⼀下清算两个字,然后可以清晰的看到在xml中两种框的表现如下:这个时候要实现功能就要⽤到freemarker中的if else标签了,⾸先我们在java代码中添加变量值,⽐如map.put("check","true");然后修改模板,使⽤标签判断,模板修改成类似这样:其实输出的勾选复选框主要的核⼼就是<w:sym w:font="Wingdings 2" w:char="F052" />这句话,把之前的<w:r>标签去掉也⾏,最简单的写法可以直接这样:<#if check=="true"><w:sym w:font="Wingdings 2" w:char="F052" /><#else><w:t>□</w:t></#if>但是这样的输出时有问题,会发现⼤⼩不是你想要的,很容易理解,因为没有了那么多节点的样式控制,输出的⾃然按word默认表现来了所以实际使⽤还是在⾃⼰模板中设置两个框,然后存成xml⽂件看两个框的表现,这样最后输出的框⼤⼩表现和你的word⽂档字体⼤⼩等是⼀样的.最后将xml⽂件后缀名修改成.ftl,就可以导出了,随着代码中check变量的值不同,会导出不同的选择框,效果如下:其实freemarker⾥除了if标签,还有很多其他的标签,灵活使⽤这些标签可以很⽅便的完成我们的需求,感觉有点类似jsp,可以让我们灵活输出结果。
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将html转为word导出(富文本内容导出word)
java将html转为word导出(富⽂本内容导出word)业务:将富⽂本内容取出⽣成本地word⽂件参考百度的⽅法word本⾝是可以识别html标签,所以通过poi写⼊html内容即可import com.util.WordUtil;import org.springframework.web.bind.annotation.PostMapping;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class SysAnnouncementController {@PostMapping(value = "/exportAccidentExampleWord")public void exportAccidentExampleWord(HttpServletRequest request, HttpServletResponse response) throws Exception {String s = "<p><strong>第⼀⾏要加粗</strong></p>\n" +"<p><em><strong>第⼆⾏要倾斜</strong></em></p>\n" +"<p style=\"text-align: center;\"><em><strong>第三⾏要居中</strong></em></p>";StringBuffer sbf = new StringBuffer();sbf.append("<html " +"xmlns:v=\"urn:schemas-microsoft-com:vml\" xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:w=\"urn:schemas-microsoft-com:office:word\" xmlns:m=\"/office/2004/12/omml\" xmlns=\"http://w ">");//缺失的⾸标签sbf.append("<head>" +"<!--[if gte mso 9]><xml><w:WordDocument><w:View>Print</w:View><w:TrackMoves>false</w:TrackMoves><w:TrackFormatting/><w:ValidateAgainstSchemas/><w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid><w:IgnoreMixedCo "</head>");//将版式从web版式改成页⾯试图sbf.append("<body>");//缺失的⾸标签sbf.append(s);//富⽂本内容sbf.append("</body></html>");//缺失的尾标签try{WordUtil.exportWord(request,response,sbf.toString(),"wordName");}catch (Exception e){System.out.println(e.getMessage());}}}⼯具类import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.ByteArrayInputStream;import java.io.OutputStream;public class WordUtil {public static void exportWord(HttpServletRequest request, HttpServletResponse response, String content, String fileName) throws Exception {byte[] b = content.getBytes("GBK"); //这⾥是必须要设置编码的,不然导出中⽂就会乱码。
Java使用IText(VM模版)导出PDF,IText导出word(二)
Java使⽤IText(VM模版)导出PDF,IText导出word(⼆)===============action===========================//退款导出wordpublic void exportWordTk() throws IOException{Long userId=(Long)ServletActionContext.getContext().getSession().get(Constant.SESSION_USER_ID);//获取⽣成Pdf需要的⼀些路径String tmPath=ServletActionContext.getServletContext().getRealPath("download/template");//vm 模板路径String wordPath=ServletActionContext.getServletContext().getRealPath("download/file");//⽣成word路径//wordPath+"/"+userId+"_"+fk+".doc"//数据Map map=new HashMap();//velocity模板中的变量map.put("date1",this.fk);map.put("date",new SimpleDateFormat("yyyy-MM-dd HH:mm").format(new Date()));String newFile=wordPath+"/tk_word_"+userId+".doc";File file=new File(newFile);if(!file.exists()){//设置字体,⽀持中⽂显⽰new PdfUtil().addFontAbsolutePath(ServletActionContext.getServletContext().getRealPath("dzz/pdfFont/simsun.ttf"));//这个字体需要⾃⼰去下载PdfUtil.createByVelocityPdf(tmPath,"tk_word.vm", wordPath+"/tk_word_"+userId+".pdf", map);//导出PDFPdfUtil.createByVelocityDoc(tmPath,"tk_word.vm",newFile, map);//导出word}sendMsgAjax("dzz/download/file/tk_word_"+userId+".doc");}=================vm ⽂件模板(tk_word.vm)=====================<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title></title><style type="text/css">body, button, input, select, textarea {color: color:rgb(0,0,0);font: 14px/1.5 tahoma,arial,宋体,sans-serif;}p{margin:0;padding:0;}.title{border-bottom:1px solid rgb(0,0,0);margin:0;padding:0;width:85%;height:25px;}li{list-style:none;}.li_left li{text-align:left;line-height:47px;font-size:14pt;}.li_left{width:610px;}.fnt-21{font-size:16pt;}table{width:90%;/*argin-left:25px;*/}div_cls{width:100%;text-align:center;}</style></head><body style="font-family: songti;width:100%;text-align:center;"><div style="text-align:center;"><b class="fnt-21"> 本组评审结果清单</b> </div> <table border="1" cellpadding="0" cellspacing="0" style="width:90%;margin-left:25px;"> <tr><td style="width:20%" align="center">申报单位</td><td style="width:10%" align="center">申报经费(万元)</td></tr></table><br/><div><ul style="float:right;margin-right:40px;"><li>$date</li><!--获取后天封装的数据--></ul></div></body></html>====================⼯具类======================package com.qgc.dzz.util;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;import java.io.PrintWriter;import .URL;import java.util.ArrayList;import java.util.List;import java.util.Map;import java.util.UUID;import org.apache.struts2.ServletActionContext;import org.apache.velocity.Template;import org.apache.velocity.VelocityContext;import org.apache.velocity.app.VelocityEngine;import org.xhtmlrenderer.pdf.ITextFontResolver;import org.xhtmlrenderer.pdf.ITextRenderer;import com.lowagie.text.Document;import com.lowagie.text.DocumentException;import com.lowagie.text.Font;import com.lowagie.text.Image;import com.lowagie.text.Rectangle;import com.lowagie.text.pdf.BaseFont;import com.lowagie.text.pdf.PdfImportedPage;import com.lowagie.text.pdf.PdfReader;import com.lowagie.text.pdf.PdfWriter;public class PdfUtil {private static List<String> fonts = new ArrayList();//字体路径/*** 使⽤vm导出word* @param localPath VM 模板路径* @param templateFileName vm 模板名称* @param docPath ⽣成⽂件的路径,包含⽂件如:d://temp.doc* @param map 参数,传递到vm* @return*/public static boolean createByVelocityDoc(String localPath, String templateFileName, String docPath, Map<String, Object> map) {try{createFile(localPath,templateFileName,docPath, map);return true;} catch (Exception e) {e.printStackTrace();}return false;}/*** 导出pdf* @param localPath VM 模板路径* @param templateFileName vm 模板名称* @param pdfPath ⽣成⽂件的路径,包含⽂件如:d://temp.pdf* @param map 参数,传递到vm* @return*/public static boolean createByVelocityPdf(String localPath, String templateFileName, String pdfPath, Map<String, Object> map) {try{String htmlPath = pdfPath + UUID.randomUUID().toString() + ".html";createFile(localPath, templateFileName, htmlPath, map);//⽣成html 临时⽂件HTML2OPDF(htmlPath, pdfPath, fonts);//html转成pdfFile file = new File(htmlPath);file.delete();return true;} catch (Exception e) {e.printStackTrace();}return false;}/*** 合并PDF* @param writer* @param document* @param reader* @throws DocumentException*/public void addToPdfUtil(PdfWriter writer, Document document,PdfReader reader) throws DocumentException {int n = reader.getNumberOfPages();Rectangle pageSize = document.getPageSize();float docHeight = pageSize.getHeight();float docWidth = pageSize.getWidth();for (int i = 1; i <= n; i++) {document.newPage();PdfImportedPage page = writer.getImportedPage(reader, i);Image image = Image.getInstance(page);float imgHeight = image.getPlainHeight();float imgWidth = image.getPlainWidth();if (imgHeight < imgWidth) {float temp = imgHeight;imgHeight = imgWidth;imgWidth = temp;image.setRotationDegrees(90.0F);}if ((imgHeight > docHeight) || (imgWidth > docWidth)) {float hc = imgHeight / docHeight;float wc = imgWidth / docHeight;float suoScale = 0.0F;if (hc > wc)suoScale = 1.0F / hc * 100.0F;else {suoScale = 1.0F / wc * 100.0F;}image.scalePercent(suoScale);}image.setAbsolutePosition(0.0F, 0.0F);document.add(image);}}/*** html 转成 pdf ⽅法* @param htmlPath html路径* @param pdfPath pdf路径* @param fontPaths 字体路径* @throws Exception*/public static void HTML2OPDF(String htmlPath, String pdfPath,List<String> fontPaths)throws Exception{String url = new File(htmlPath).toURI().toURL().toString();//获取⽣成html的路径OutputStream os = new FileOutputStream(pdfPath);//创建输出流ITextRenderer renderer = new ITextRenderer();//itext 对象ITextFontResolver fontResolver = renderer.getFontResolver();//字体// //⽀持中⽂显⽰字体// fontResolver.addFont(ServletActionContext.getServletContext().getRealPath("dzz/pdfFont/simsun_0.ttf"), // BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);if ((fontPaths != null) && (!fontPaths.isEmpty())) {URL classPath = PdfUtil.class.getResource("/");for (String font : fontPaths) {if (font.contains(":"))fontResolver.addFont(font, "Identity-H", false);else {fontResolver.addFont(classPath + "/" + font, "Identity-H",false);}}}renderer.setDocument(url);//设置html路径yout();renderer.createPDF(os);//html转换成pdfSystem.gc();os.close();System.gc();}public static boolean createFile(String localPath, String templateFileName,String newFilePath, Map<String, Object> map){try{VelocityEngine engine = new VelocityEngine();engine.setProperty("file.resource.loader.path", localPath);//指定vm路径Template template = engine.getTemplate(templateFileName, "UTF-8");//指定vm模板VelocityContext context = new VelocityContext();//创建上下⽂对象if (map != null){Object[] keys = map.keySet().toArray();for (Object key : keys) {String keyStr = key.toString();context.put(keyStr, map.get(keyStr));//传递参数到上下⽂对象}}PrintWriter writer = new PrintWriter(newFilePath, "UTF-8");//写⼊参数到vm template.merge(context, writer);writer.flush();writer.close();return true;} catch (Exception e) {e.printStackTrace();}return false;}public static Font FONT = getChineseFont();public static BaseFont BSAE_FONT = getBaseFont();/*** ⽀持显⽰中⽂* @return*/public static Font getChineseFont() {BaseFont bfChinese = null;try {bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", false);} catch (DocumentException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}Font fontChinese = new Font(bfChinese);return fontChinese;}public static BaseFont getBaseFont() {BaseFont bfChinese = null;try {bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", false);} catch (DocumentException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return bfChinese;}public void addFontAbsolutePath(String path) {this.fonts.add(path);}public void addFontClassPath(String path) {this.fonts.add(path);}public List<String> getFonts() {return this.fonts;}public void setFonts(List<String> fonts) {this.fonts = fonts;}}。
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⽂件的⽅法1234 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36package 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<String, Object> dataMap, String downloadType, StringsavePath){try{//加载需要装填的模板Templatetemplate = null;//加载模板⽂件configure.setClassForTemplateLoading(this.getClass(),"/com/favccxx/secret/templates"); //设置对象包装器configure.setObjectWrapper(newDefaultObjectWrapper());//设置异常处理器configure.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER); //定义Template对象,注意模板类型名字与downloadType要⼀致template= configure.getTemplate(downloadType + ".xml");//输出⽂档FileoutFile = new File(savePath);Writerout = null;3637 38 39 40 41 42 43 44 45 46 out= new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),"utf-8")); template.process(dataMap,out);outFile.delete();}catch(Exception e) {e.printStackTrace();}}} 6.⽤户根据⾃⼰的需要,调⽤使⽤getDataMap获取需要传递的变量,然后调⽤createDoc⽅法⽣成所需要的⽂档。
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。
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实现最简单的Java导出Word中的数据
PageOffice实现最简单的Java导出Word中的数据普通的MS Office Word只能在本地磁盘上打开和编辑保存,这使得程序员在开发项目时受到很多的约束,许多的功能无法实现或者无法达到理想的效果。
但是通过调用PageOffice开发平台,不仅可以在线打开并保存Word文件还可以提交Word中的数据。
下面我就简单的和大家分享一下如何实现Word文档的在线打开、编辑、保存和数据的提交。
第一步:拷贝文件到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 -->第三步:添加引用。
javaweb页面导出word
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"%>当点击“导出”按钮时,可以⽣成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)⽂件,并且可以显⽰图⽚。
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代码。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
java jacob 操作word 文档,进行写操作,如生成表格,添加图片jacob-1.15-M3.zipjacob-1.15-M3-x86.dll copy 到c:\\windows\system32引入jacob.jar示例代码import java.io.File;import com.jacob.activeX.ActiveXComponent;import .Dispatch;import .V ariant;class WordBean {// 代表一个word 程序private ActiveXComponent MsWordApp = null;// 代表进行处理的word 文档private Dispatch document = null;public WordBean() {// Open Word if we\'ve not done it alreadyif (MsWordApp == null) {MsWordApp = new ActiveXComponent("Word.Application");}}// 设置是否在前台打开word 程序,public void setVisible(boolean visible) {MsWordApp.setProperty("Visible", new V ariant(vis ible));// 这一句作用相同// Dispatch.put(MsWordApp, "Visible", new V ariant(visible));}// 创建一个新文档public void createNewDocument() {// Find the Documents collection object maintained by Word// documents表示word的所有文档窗口,(word是多文档应用程序)Dispatch documents = Dispatch.get(MsWordApp, "Documents").toDispatch();// Call the Add method of the Documents collection to create// a new document to editdocument = Dispatch.call(documents, "Add").toDispatch();}// 打开一个存在的word文档,并用document 引用引用它public void openFile(String wordFilePath) {// Find the Documents collection object maintained by Word// documents表示word的所有文档窗口,(word是多文档应用程序)Dispatch documents = Dispatch.get(MsWordApp, "Documents").toDispatch();document = Dispatch.call(documents, "Open", wordFilePath,new V ariant(true)/* 是否进行转换ConfirmConversions */,new V ariant(false)/* 是否只读*/).toDispatch();// document = Dispatch.invoke(documents, "Open", Dispatch.Method,// new Object[] { wordFilePath, new V ariant(true),// new V ariant(false)// }, new int[1]).toDispatch();}// 向document 中插入文本内容public void insertText(String textToInsert) {// Get the current selection within Word at the moment.// a new document has just been created then this will be at// the top of the new doc 获得选中的内容,如果是一个新创建的文件,因里面无内容,则光标应处于文件开头处Dispatch selection = Dispatch.get(MsWordApp, "Selection").toDispatch();// 取消选中,应该就是移动光标,否则新添加的内容会覆盖选中的内容Dispatch.call(selection, "MoveRight", new V ariant(1), new V ariant(1));// Put the specified text at the insertion pointDispatch.put(selection, "Text", textToInsert);// 取消选中,应该就是移动光标Dispatch.call(selection, "MoveRight", new V ariant(1), new V ariant(1));}// 向文档中添加一个图片,public void insertJpeg(String jpegFilePath) {Dispatch selection = Dispatch.get(MsWordApp, "Selection").toDispatch();Dispatch image = Dispatch.get(selection, "InLineShapes").toDispatch();Dispatch.call(image, "AddPicture", jpegFilePath);}// 段落的处理,插入格式化的文本public void insertFormatStr(String text) {Dispatch wordContent = Dispatch.get(document, "Content").toDispatch(); // 取得word 文件的内容Dispatch.call(wordContent, "InsertAfter", text);// 插入一个段落到最后Dispatch paragraphs = Dispatch.get(wordContent, "Paragraphs").toDispatch(); // 所有段落int paragraphCount = Dispatch.get(paragraphs, "Count").changeType(V ariant.V ariantInt).getInt();// 一共的段落数// 找到刚输入的段落,设置格式Dispatch lastParagraph = Dispatch.call(paragraphs, "Item",new V ariant(paragraphCount)).toDispatch(); // 最后一段(也就是刚插入的)// Range 对象表示文档中的一个连续范围,由一个起始字符位置和一个终止字符位置定义Dispatch lastParagraphRange = Dispatch.get(lastParagraph, "Range").toDispatch();Dispatch font = Dispatch.get(lastParagraphRange, "Font").toDispatch();Dispatch.put(font, "Bold", new V ariant(true)); // 设置为黑体Dispatch.put(font, "Italic", new V ariant(true)); // 设置为斜体Dispatch.put(font, "Name", new V ariant("宋体")); //Dispatch.put(font, "Size", new V ariant(12)); // 小四Dispatch selection = Dispatch.get(MsWordApp, "Selection").toDispatch();Dispatch.call(selection, "TypeParagraph");// 插入一个空行Dispatch alignment = Dispatch.get(selection, "ParagraphFormat").toDispatch();// 段落格式Dispatch.put(alignment, "Alignment", "2"); // (1:置中2:靠右3:靠左) }// word 中在对表格进行遍历的时候,是先列后行先column 后cell// 另外下标从1开始public void insertTable(String tableTitle, int row, int column) {Dispatch selection = Dispatch.get(MsWordApp, "Selection").toDispatch(); // 输入内容需要的对象Dispatch.call(selection, "TypeText", tableTitle); // 写入标题内容// 标题格行Dispatch.call(selection, "TypeParagraph"); // 空一行段落Dispatch.call(selection, "TypeParagraph"); // 空一行段落Dispatch.call(selection, "MoveDown"); // 游标往下一行// 建立表格Dispatch tables = Dispatch.get(document, "Tables").toDispatch();// int count = Dispatch.get(tables,// "Count").changeType(V ariant.V ariantInt).getInt(); // document中的表格数量// Dispatch table = Dispatch.call(tables, "Item", new V ariant(// 1)).toDispatch();//文档中第一个表格Dispatch range = Dispatch.get(selection, "Range").toDispatch();// /当前光标位置或者选中的区域Dispatch newTable = Dispatch.call(tables, "Add", range,new V ariant(row), new V ariant(column), new V ariant(1)).toDispatch(); // 设置row,column,表格外框宽度Dispatch cols = Dispatch.get(newTable, "Columns").toDispatch(); // 此表的所有列,int colCount = Dispatch.get(cols, "Count").changeType(V ariant.V ariantInt).getInt();// 一共有多少列实际上这个数==column System.out.println(colCount + "列");for (int i = 1; i <= colCount; i++) { // 循环取出每一列Dispatch col = Dispatch.call(cols, "Item", new V ariant(i)).toDispatch();Dispatch cells = Dispatch.get(col, "Cells").toDispatch();// 当前列中单元格int cellCount = Dispatch.get(cells, "Count").changeType(V ariant.V ariantInt).getInt();// 当前列中单元格数实际上这个数等于rowfor (int j = 1; j <= cellCount; j++) {// 每一列中的单元格数// Dispatch cell = Dispatch.call(cells, "Item", new// V ariant(j)).toDispatch(); //当前单元格// Dispatch cell = Dispatch.call(newTable, "Cell", new// V ariant(j) , new V ariant(i) ).toDispatch(); //取单元格的另一种方法// Dispatch.call(cell, "Select");//选中当前单元格// Dispatch.put(selection, "Text",// "第"+j+"行,第"+i+"列");//往选中的区域中填值,也就是往当前单元格填值putTxtToCell(newTable, j, i, "第" + j + "行,第" + i + "列");// 与上面四句的作用相同}}}/** *//*** 在指定的单元格里填写数据** @param tableIndex* @param cellRowIdx* @param cellColIdx* @param txt*/public void putTxtToCell(Dispatch table, int cellRowIdx, int cellColIdx,String txt) {Dispatch cell = Dispatch.call(table, "Cell", new V ariant(cellRowIdx),new V ariant(cellColIdx)).toDispatch();Dispatch.call(cell, "Select");Dispatch selection = Dispatch.get(MsWordApp, "Selection").toDispatch(); // 输入内容需要的对象Dispatch.put(selection, "Text", txt);}/** *//*** 在指定的单元格里填写数据** @param tableIndex* @param cellRowIdx* @param cellColIdx* @param txt*/public void putTxtToCell(int tableIndex, int cellRowIdx, int cellColIdx,String txt) {// 所有表格Dispatch tables = Dispatch.get(document, "Tables").toDispatch();// 要填充的表格Dispatch table = Dispatch.call(tables, "Item", new V ariant(tableIndex)).toDispatch();Dispatch cell = Dispatch.call(table, "Cell", new V ariant(cellRowIdx),new V ariant(cellColIdx)).toDispatch();Dispatch.call(cell, "Select");Dispatch selection = Dispatch.get(MsWordApp, "Selection").toDispatch(); // 输入内容需要的对象Dispatch.put(selection, "Text", txt);}// 合并两个单元格public void mergeCell(Dispatch cell1, Dispatch cell2) {Dispatch.call(cell1, "Merge", cell2);}public void mergeCell(Dispatch table, int row1, int col1, int row2, int col2) {Dispatch cell1 = Dispatch.call(table, "Cell", new V ariant(row1),new V ariant(col1)).toDispatch();Dispatch cell2 = Dispatch.call(table, "Cell", new V ariant(row2),new V ariant(col2)).toDispatch();mergeCell(cell1, cell2);}public void mergeCellTest() {Dispatch tables = Dispatch.get(document, "Tables").toDispatch();int tableCount = Dispatch.get(tables, "Count").changeType(V ariant.V ariantInt).getInt(); // document中的表格数量Dispatch table = Dispatch.call(tables, "Item", new V ariant(tableCount)).toDispatch();// 文档中最后一个tablemergeCell(table, 1, 1, 1, 2);// 将table 中x=1,y=1 与x=1,y=2的两个单元格合并}// ========================================================/** *//*** 把选定的内容或光标插入点向上移动** @param pos* 移动的距离*/public void moveUp(int pos) {Dispatch selection = Dispatch.get(MsWordApp, "Selection").toDispatch(); // 输入内容需要的对象for (int i = 0; i < pos; i++) {// MoveDown MoveLeft moveRight// moveStart ( Dispatch.call(selection, "HomeKey", new V ariant(6));// )// moveEnd Dispatch.call(selection, "EndKey", new V ariant(6));Dispatch.call(selection, "MoveUp");}}/** *//*** 从选定内容或插入点开始查找文本** @param toFindText* 要查找的文本* @return boolean true-查找到并选中该文本,false-未查找到文本*/public boolean find(String toFindText) {if (toFindText == null || toFindText.equals(""))return false;Dispatch selection = Dispatch.get(MsWordApp, "Selection").toDispatch(); // 输入内容需要的对象// 从selection所在位置开始查询Dispatch find = Dispatch.call(selection, "Find").toDispatch();// 设置要查找的内容Dispatch.put(find, "Text", toFindText);// 向前查找Dispatch.put(find, "Forward", "True");// 设置格式Dispatch.put(find, "Format", "True");// 大小写匹配Dispatch.put(find, "MatchCase", "True");// 全字匹配Dispatch.put(find, "MatchWholeWord", "True");// 查找并选中return Dispatch.call(find, "Execute").getBoolean();}/** *//*** 把选定选定内容设定为替换文本** @param toFindText* 查找字符串* @param newText* 要替换的内容* @returnpublic boolean replaceText(String toFindText, String newText) {if (!find(toFindText))return false;Dispatch selection = Dispatch.get(MsWordApp, "Selection").toDispatch(); // 输入内容需要的对象Dispatch.put(selection, "Text", newText);return true;}public void printFile() {// Just print the current document to the default printerDispatch.call(document, "PrintOut");}// 保存文档的更改public void save() {Dispatch.call(document, "Save");}public void saveFileAs(String filename) {Dispatch.call(document, "SaveAs", filename);}public void closeDocument() {// Close the document without saving changes// 0 = wdDoNotSaveChanges// -1 = wdSaveChanges// -2 = wdPromptToSaveChangesDispatch.call(document, "Close", new V ariant(0));document = null;}public void closeWord() {Dispatch.call(MsWordApp, "Quit");MsWordApp = null;document = null;}// 设置wordApp打开后窗口的位置public void setLocation() {Dispatch activeWindow = Dispatch.get(MsWordApp, "Application").toDispatch();Dispatch.put(activeWindow, "WindowState", new V ariant(1)); // 0=default// 1=maximize// 2=minimizeDispatch.put(activeWindow, "Top", new V ariant(0));Dispatch.put(activeWindow, "Left", new V ariant(0));Dispatch.put(activeWindow, "Height", new V ariant(600));Dispatch.put(activeWindow, "width", new V ariant(800));}public class JacobTest2 {public static void createANewFileTest() {WordBean wordBean = new WordBean();// word.openWord(true);// 打开word 程序wordBean.setVisible(true);wordBean.createNewDocument();// 创建一个新文档wordBean.setLocation();// 设置打开后窗口的位置wordBean.insertText("你好");// 向文档中插入字符wordBean.insertJpeg("D:" + File.separator + "a.jpg"); // 插入图片// 如果,想保存文件,下面三句// word.saveFileAs("d:\\a.doc");// word.closeDocument();// word.closeWord();}public static void openAnExistsFileTest() {WordBean wordBean = new WordBean();wordBean.setVisible(true); // 是否前台打开word 程序,或者后台运行wordBean.openFile("d:\\a.doc");wordBean.insertJpeg("D:" + File.separator + "a.jpg"); // 插入图片(注意刚打开的word// ,光标处于开头,故,图片在最前方插入)wordBean.save();wordBean.closeDocument();wordBean.closeWord();}public static void insertFormatStr(String str) {WordBean wordBean = new WordBean();wordBean.setVisible(true); // 是否前台打开word 程序,或者后台运行wordBean.createNewDocument();// 创建一个新文档wordBean.insertFormatStr(str);// 插入一个段落,对其中的字体进行了设置}public static void insertTableTest() {WordBean wordBean = new WordBean();wordBean.setVisible(true); // 是否前台打开word 程序,或者后台运行wordBean.createNewDocument();// 创建一个新文档wordBean.setLocation();wordBean.insertTable("表名", 3, 2);wordBean.saveFileAs("d:\\table.doc");wordBean.closeDocument();wordBean.closeWord();}public static void mergeTableCellTest() {insertTableTest();//生成d:\\table.docWordBean wordBean = new WordBean();wordBean.setVisible(true); // 是否前台打开word 程序,或者后台运行wordBean.openFile("d:\\table.doc");wordBean.mergeCellTest();}public static void main(String[] args) {// 进行测试前要保证d:\\a.jpg 图片文件存在// createANewFileTest();//创建一个新文件// openAnExistsFileTest();// 打开一个存在的文件// insertFormatStr("格式化字符串");//对字符串进行一定的修饰//insertTableTest();// 创建一个表格mergeTableCellTest();// 对表格中的单元格进行合并}}import java.io.File;import com.jacob.activeX.ActiveXComponent;import .Dispatch;import .V ariant;class WordBean {// 代表一个word 程序private ActiveXComponent MsWordApp = null;// 代表进行处理的word 文档private Dispatch document = null;public WordBean() {// Open Word if we\'ve not done it alreadyif (MsWordApp == null) {MsWordApp = new ActiveXComponent("Word.Application");}}// 设置是否在前台打开word 程序,public void setVisible(boolean visible) {MsWordApp.setProperty("Visible", new V ariant(visible));// 这一句作用相同// Dispatch.put(MsWordApp, "Visible", new V ariant(visible));}// 创建一个新文档public void createNewDocument() {// Find the Documents collection object maintained by Word// documents表示word的所有文档窗口,(word是多文档应用程序)Dispatch documents = Dispatch.get(MsWordApp, "Documents").toDispatch();// Call the Add method of the Documents collection to create// a new document to editdocument = Dispatch.call(documents, "Add").toDispatch();}// 打开一个存在的word文档,并用document 引用引用它public void openFile(String wordFilePath) {// Find the Documents collection object maintained by Word// documents表示word的所有文档窗口,(word是多文档应用程序)Dispatch documents = Dispatch.get(MsWordApp, "Documents").toDispatch();document = Dispatch.call(documents, "Open", wordFilePath,new V ariant(true)/* 是否进行转换ConfirmConversions */,new V ariant(false)/* 是否只读*/).toDispatch();// document = Dispatch.invoke(documents, "Open", Dispatch.Method,// new Object[] { wordFilePath, new V ariant(true),// new V ariant(false)// }, new int[1]).toDispatch();}// 向document 中插入文本内容public void insertText(String textToInsert) {// Get the current selection within Word at the moment.// a new document has just been created then this will be at// the top of the new doc 获得选中的内容,如果是一个新创建的文件,因里面无内容,则光标应处于文件开头处Dispatch selection = Dispatch.get(MsWordApp, "Selection").toDispatch();// 取消选中,应该就是移动光标,否则新添加的内容会覆盖选中的内容Dispatch.call(selection, "MoveRight", new V ariant(1), new V ariant(1));// Put the specified text at the insertion pointDispatch.put(selection, "Text", textToInsert);// 取消选中,应该就是移动光标Dispatch.call(selection, "MoveRight", new V ariant(1), new V ariant(1));}// 向文档中添加一个图片,public void insertJpeg(String jpegFilePath) {Dispatch selection = Dispatch.get(MsWordApp, "Selection").toDispatch();Dispatch image = Dispatch.get(selection, "InLineShapes").toDispatch();Dispatch.call(image, "AddPicture", jpegFilePath);}// 段落的处理,插入格式化的文本public void insertFormatStr(String text) {Dispatch wordContent = Dispatch.get(document, "Content").toDispatch(); // 取得word 文件的内容Dispatch.call(wordContent, "InsertAfter", text);// 插入一个段落到最后Dispatch paragraphs = Dispatch.get(wordContent, "Paragraphs").toDispatch(); // 所有段落int paragraphCount = Dispatch.get(paragraphs, "Count").changeType(V ariant.V ariantInt).getInt();// 一共的段落数// 找到刚输入的段落,设置格式Dispatch lastParagraph = Dispatch.call(paragraphs, "Item",new V ariant(paragraphCount)).toDispatch(); // 最后一段(也就是刚插入的)// Range 对象表示文档中的一个连续范围,由一个起始字符位置和一个终止字符位置定义Dispatch lastParagraphRange = Dispatch.get(lastParagraph, "Range").toDispatch();Dispatch font = Dispatch.get(lastParagraphRange, "Font").toDispatch();Dispatch.put(font, "Bold", new V ariant(true)); // 设置为黑体Dispatch.put(font, "Italic", new V ariant(true)); // 设置为斜体Dispatch.put(font, "Name", new V ariant("宋体")); //Dispatch.put(font, "Size", new V ariant(12)); // 小四Dispatch selection = Dispatch.get(MsWordApp, "Selection").toDispatch();Dispatch.call(selection, "TypeParagraph");// 插入一个空行Dispatch alignment = Dispatch.get(selection, "ParagraphFormat").toDispatch();// 段落格式Dispatch.put(alignment, "Alignment", "2"); // (1:置中2:靠右3:靠左) }// word 中在对表格进行遍历的时候,是先列后行先column 后cell// 另外下标从1开始public void insertTable(String tableTitle, int row, int column) {Dispatch selection = Dispatch.get(MsWordApp, "Selection").toDispatch(); // 输入内容需要的对象Dispatch.call(selection, "TypeText", tableTitle); // 写入标题内容// 标题格行Dispatch.call(selection, "TypeParagraph"); // 空一行段落Dispatch.call(selection, "TypeParagraph"); // 空一行段落Dispatch.call(selection, "MoveDown"); // 游标往下一行// 建立表格Dispatch tables = Dispatch.get(document, "Tables").toDispatch();// int count = Dispatch.get(tables,// "Count").changeType(V ariant.V ariantInt).getInt(); // document中的表格数量// Dispatch table = Dispatch.call(tables, "Item", new V ariant(// 1)).toDispatch();//文档中第一个表格Dispatch range = Dispatch.get(selection, "Range").toDispatch();// /当前光标位置或者选中的区域Dispatch newTable = Dispatch.call(tables, "Add", range,new V ariant(row), new V ariant(column), new V ariant(1)).toDispatch(); // 设置row,column,表格外框宽度Dispatch cols = Dispatch.get(newTable, "Columns").toDispatch(); // 此表的所有列,int colCount = Dispatch.get(cols, "Count").changeType(V ariant.V ariantInt).getInt();// 一共有多少列实际上这个数==column System.out.println(colCount + "列");for (int i = 1; i <= colCount; i++) { // 循环取出每一列Dispatch col = Dispatch.call(cols, "Item", new V ariant(i)).toDispatch();Dispatch cells = Dispatch.get(col, "Cells").toDispatch();// 当前列中单元格int cellCount = Dispatch.get(cells, "Count").changeType(V ariant.V ariantInt).getInt();// 当前列中单元格数实际上这个数等于rowfor (int j = 1; j <= cellCount; j++) {// 每一列中的单元格数// Dispatch cell = Dispatch.call(cells, "Item", new// V ariant(j)).toDispatch(); //当前单元格// Dispatch cell = Dispatch.call(newTable, "Cell", new// V ariant(j) , new V ariant(i) ).toDispatch(); //取单元格的另一种方法// Dispatch.call(cell, "Select");//选中当前单元格// Dispatch.put(selection, "Text",// "第"+j+"行,第"+i+"列");//往选中的区域中填值,也就是往当前单元格填值putTxtToCell(newTable, j, i, "第" + j + "行,第" + i + "列");// 与上面四句的作用相同}}}/** *//*** 在指定的单元格里填写数据** @param tableIndex* @param cellRowIdx* @param cellColIdx* @param txt*/public void putTxtToCell(Dispatch table, int cellRowIdx, int cellColIdx,String txt) {Dispatch cell = Dispatch.call(table, "Cell", new V ariant(cellRowIdx),new V ariant(cellColIdx)).toDispatch();Dispatch.call(cell, "Select");Dispatch selection = Dispatch.get(MsWordApp, "Selection").toDispatch(); // 输入内容需要的对象Dispatch.put(selection, "Text", txt);}/** *//*** 在指定的单元格里填写数据** @param tableIndex* @param cellRowIdx* @param cellColIdx* @param txt*/public void putTxtToCell(int tableIndex, int cellRowIdx, int cellColIdx,String txt) {// 所有表格Dispatch tables = Dispatch.get(document, "Tables").toDispatch();// 要填充的表格Dispatch table = Dispatch.call(tables, "Item", new V ariant(tableIndex)).toDispatch();Dispatch cell = Dispatch.call(table, "Cell", new V ariant(cellRowIdx),new V ariant(cellColIdx)).toDispatch();Dispatch.call(cell, "Select");Dispatch selection = Dispatch.get(MsWordApp, "Selection").toDispatch(); // 输入内容需要的对象Dispatch.put(selection, "Text", txt);}// 合并两个单元格public void mergeCell(Dispatch cell1, Dispatch cell2) {Dispatch.call(cell1, "Merge", cell2);}public void mergeCell(Dispatch table, int row1, int col1, int row2, int col2) {Dispatch cell1 = Dispatch.call(table, "Cell", new V ariant(row1),new V ariant(col1)).toDispatch();Dispatch cell2 = Dispatch.call(table, "Cell", new V ariant(row2),new V ariant(col2)).toDispatch();mergeCell(cell1, cell2);}public void mergeCellTest() {Dispatch tables = Dispatch.get(document, "Tables").toDispatch();int tableCount = Dispatch.get(tables, "Count").changeType(V ariant.V ariantInt).getInt(); // document中的表格数量Dispatch table = Dispatch.call(tables, "Item", new V ariant(tableCount)).toDispatch();// 文档中最后一个tablemergeCell(table, 1, 1, 1, 2);// 将table 中x=1,y=1 与x=1,y=2的两个单元格合并}// ========================================================/** *//*** 把选定的内容或光标插入点向上移动** @param pos* 移动的距离*/public void moveUp(int pos) {Dispatch selection = Dispatch.get(MsWordApp, "Selection").toDispatch(); // 输入内容需要的对象for (int i = 0; i < pos; i++) {// MoveDown MoveLeft moveRight// moveStart ( Dispatch.call(selection, "HomeKey", new V ariant(6));// )// moveEnd Dispatch.call(selection, "EndKey", new V ariant(6));Dispatch.call(selection, "MoveUp");}}/** *//*** 从选定内容或插入点开始查找文本** @param toFindText* 要查找的文本* @return boolean true-查找到并选中该文本,false-未查找到文本*/public boolean find(String toFindText) {if (toFindText == null || toFindText.equals(""))return false;Dispatch selection = Dispatch.get(MsWordApp, "Selection").toDispatch(); // 输入内容需要的对象// 从selection所在位置开始查询Dispatch find = Dispatch.call(selection, "Find").toDispatch();// 设置要查找的内容Dispatch.put(find, "Text", toFindText);// 向前查找Dispatch.put(find, "Forward", "True");// 设置格式Dispatch.put(find, "Format", "True");// 大小写匹配Dispatch.put(find, "MatchCase", "True");// 全字匹配Dispatch.put(find, "MatchWholeWord", "True");// 查找并选中return Dispatch.call(find, "Execute").getBoolean();}/** *//*** 把选定选定内容设定为替换文本** @param toFindText* 查找字符串* @param newText* 要替换的内容* @return*/public boolean replaceText(String toFindText, String newText) {if (!find(toFindText))return false;Dispatch selection = Dispatch.get(MsWordApp, "Selection").toDispatch(); // 输入内容需要的对象Dispatch.put(selection, "Text", newText);return true;}public void printFile() {// Just print the current document to the default printerDispatch.call(document, "PrintOut");}// 保存文档的更改public void save() {Dispatch.call(document, "Save");}public void saveFileAs(String filename) {Dispatch.call(document, "SaveAs", filename);}public void closeDocument() {// Close the document without saving changes// 0 = wdDoNotSaveChanges// -1 = wdSaveChanges// -2 = wdPromptToSaveChangesDispatch.call(document, "Close", new V ariant(0));document = null;}public void closeWord() {Dispatch.call(MsWordApp, "Quit");MsWordApp = null;document = null;}// 设置wordApp打开后窗口的位置public void setLocation() {Dispatch activeWindow = Dispatch.get(MsWordApp, "Application").toDispatch();Dispatch.put(activeWindow, "WindowState", new V ariant(1)); // 0=default// 1=maximize// 2=minimizeDispatch.put(activeWindow, "Top", new V ariant(0));Dispatch.put(activeWindow, "Left", new V ariant(0));Dispatch.put(activeWindow, "Height", new V ariant(600));Dispatch.put(activeWindow, "width", new V ariant(800));}}public class JacobTest2 {public static void createANewFileTest() {WordBean wordBean = new WordBean();// word.openWord(true);// 打开word 程序wordBean.setVisible(true);wordBean.createNewDocument();// 创建一个新文档wordBean.setLocation();// 设置打开后窗口的位置wordBean.insertText("你好");// 向文档中插入字符wordBean.insertJpeg("D:" + File.separator + "a.jpg"); // 插入图片// 如果,想保存文件,下面三句// word.saveFileAs("d:\\a.doc");// word.closeDocument();// word.closeWord();}public static void openAnExistsFileTest() {WordBean wordBean = new WordBean();wordBean.setVisible(true); // 是否前台打开word 程序,或者后台运行wordBean.openFile("d:\\a.doc");wordBean.insertJpeg("D:" + File.separator + "a.jpg"); // 插入图片(注意刚打开的word// ,光标处于开头,故,图片在最前方插入)wordBean.save();wordBean.closeDocument();wordBean.closeWord();}public static void insertFormatStr(String str) {WordBean wordBean = new WordBean();wordBean.setVisible(true); // 是否前台打开word 程序,或者后台运行wordBean.createNewDocument();// 创建一个新文档wordBean.insertFormatStr(str);// 插入一个段落,对其中的字体进行了设置}public static void insertTableTest() {WordBean wordBean = new WordBean();wordBean.setVisible(true); // 是否前台打开word 程序,或者后台运行wordBean.createNewDocument();// 创建一个新文档wordBean.setLocation();wordBean.insertTable("表名", 3, 2);wordBean.saveFileAs("d:\\table.doc");wordBean.closeDocument();wordBean.closeWord();}public static void mergeTableCellTest() {insertTableTest();//生成d:\\table.docWordBean wordBean = new WordBean();wordBean.setVisible(true); // 是否前台打开word 程序,或者后台运行wordBean.openFile("d:\\table.doc");wordBean.mergeCellTest();}public static void main(String[] args) {// 进行测试前要保证d:\\a.jpg 图片文件存在// createANewFileTest();//创建一个新文件// openAnExistsFileTest();// 打开一个存在的文件// insertFormatStr("格式化字符串");//对字符串进行一定的修饰//insertTableTest();// 创建一个表格mergeTableCellTest();// 对表格中的单元格进行合并}}出处:/jixiuffff/archive/2010/05/23/5618287.aspx。