java导出word
- 格式:doc
- 大小:111.50 KB
- 文档页数:17
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两种⽅式说明,不论使⽤哪种⽅式,都不能引⽤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(⽂字)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⽂档(保持模板格式)导出数据到具体的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 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.总结优点:使⽤⽅法很简单,使⽤⼯具类的⽅法,⽅便复⽤于其他模块。
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⽂档需要导⼊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文档很多情况下,软件开发者需要从数据库读取数据,然后将数据动态填充到手工预先准备好的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前⾔最近做了⼀个调查问卷导出的功能,需求是将维护的题⽬,答案,导出成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时添加或勾选复选框最近项⽬导出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 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。