java txt 转word
- 格式:doc
- 大小:107.00 KB
- 文档页数:27
用Java读取Word文档由于Word的编码方式比较复杂,所以Word文档不可能通过流的方式直接读取;当然如果Word可以转化成TXT文件就可以直接读取了;目前读取Word比较好的开源工具是Poi及Jacob,感觉Poi读取功能要比Jacob略逊一筹,毕竟Jacob可以直接调用Word的COM组件;但是微软产品不开放源码,所以Jacob读取Word文档也只能是摸着石头过河,一点一点破解了。
Jacob读取Word内容,由于Word内容的复杂性,读取也是非常不方便的,目前可以有"按段落读取","按书签读取"及"按照表格读取"等几种形式。
示例讲解(通过Java FileReader,Jacob两种方式读取Word内容)一.通过java流读取Word内容复制代码1.import java.io.BufferedReader;2.import java.io.FileReader;3.import java.io.IOException;4.5.public class ReadWordByStream {6.public static void main(String[] args) throws IOException {7. String rowContent = new String();8. String content = new String();9. BufferedReader in = new BufferedReader(new FileReader("d:\\test3.doc"));10. while ((rowContent = in.readLine()) != null) {11.content = content + rowContent + "\n";12. }13. System.out.println(content.getBytes());14. System.out.println(new String(content.getBytes(),"utf-8"));//因为编码方式不同,不容易解析15. in.close();16.}17.18.}二.通过Jacob读取Word内容复制代码1.import com.jacob.activeX.ActiveXComponent;2.import Thread;3.import .Dispatch;4.import .Variant;5.6.public class WordReader {7.public static void main(String args[]) {8. ComThread.InitSTA();// 初始化com的线程9. ActiveXComponent wordApp = new ActiveXComponent("Word.Application"); // 启动word10. // Set the visible property as required.11. Dispatch.put(wordApp, "Visible", new Variant(true));// //设置word可见12. Dispatch docs = wordApp.getProperty("Documents").toDispatch();//所有文档窗口13.// String inFile = "d:\\test.doc";14.// Dispatch doc = Dispatch.invoke(docs,"Open",Dispatch.Method,15.// new Object[] { inFile, new Variant(false),new Variant(false) },//参数3,false:可写,true:只读16.// new int[1]).toDispatch();//打开文档17.18. Dispatch doc = Dispatch.call(docs, "Add").toDispatch(); //创建一个新文档19. Dispatch wordContent = Dispatch.get(doc, "Content").toDispatch(); //取得word文件的内容20. Dispatch font = Dispatch.get(wordContent, "Font").toDispatch();21. Dispatch.put(font, "Bold", new Variant(true)); // 设置为粗体22.Dispatch.put(font, "Italic", new Variant(true)); // 设置为斜体23.Dispatch.put(font, "Underline", new Variant(true));24.Dispatch.put(font, "Name", new Variant("宋体"));25.Dispatch.put(font, "Size", new Variant(14));26. for(int i=0;i<10;i++){//作为一个段落27.Dispatch.call(wordContent, "InsertAfter", "current paragraph"+i+" ");28. }29. for(int j=0;j<10;j++){//作为十个段落30. Dispatch.call(wordContent, "InsertAfter", "current paragraph"+j+"\r");31.}32. Dispatch paragraphs = Dispatch.get(wordContent, "Paragraphs")33. .toDispatch(); //所有段落34. int paragraphCount = Dispatch.get(paragraphs, "Count").getInt();35. System.out.println("paragraphCount:"+paragraphCount);36.37. for (int i = 1; i <= paragraphCount; i++) {38.Dispatch paragraph = Dispatch.call(paragraphs, "Item",39.new Variant(i)).toDispatch();40.Dispatch paragraphRange = Dispatch.get(paragraph, "Range")41..toDispatch();42.String paragraphContent = Dispatch.get(paragraphRange, "Text")43..toString();44.System.out.println(paragraphContent);45.//Dispatch.call(selection, "MoveDown");46. }47. // WordReader.class.getClass().getResource("/").getPath().substring+"test.doc";48. Dispatch.call(doc, "SaveAs","d:\\wordreader.doc");49. // Close the document without saving changes50. // 0 = wdDoNotSaveChanges51. // -1 = wdSaveChanges52. // -2 = wdPromptToSaveChanges53. ComThread.Release();//释放com线程54. Dispatch.call(docs, "Close", new Variant(0));55. docs = null;56. Dispatch.call(wordApp,"Quit");57. wordApp = null;58.}59.}用Java简单的读取word文档中的数据:第一步:下载tm-extractors-0.4.jar下载地址:/browser/elated-core/trunk/lib/tm-extractors-0.4.jar?rev =46并把它放到你的classpath路径下面。
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⽂档,兼容富⽂本、图⽚Java⾃动⽣成带图⽚、富⽂本、表格等的word⽂档使⽤技术 freemark+jsoup ⽣成mht格式的伪word⽂档,已经应⽤项⽬中,确实是可⾏的,⽆论是富⽂本中是图⽚还是表格,都能在word中展现出来使⽤jsoup解析富⽂本框,将其中的图⽚进⾏Base64位转码,使⽤freemark替换模板的占位符,将变量以及图⽚资源放⼊模板中在输出⽂件maven地址<!--freemarker--><!--<dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.23</version></dependency><!--JavaHTMLParser--><!--<dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.10.2</version></dependency>制作word的freemark模板1. 先将wrod的格式内容定义好,如果需要插⼊参数的地⽅以${xxx}为表⽰,例:${product}模板例⼦: 2. 将模板另存为mht格式的⽂件,打开该⽂件检查每个变量(${product})是否完整,有可能在${}中出现其他代码,需要删除。
3. 将mht⽂件变更⽂件类型,改成ftl为结尾的⽂件,引⼊到项⽬中 4. 修改ftl模板⽂件,在⽂件中加上图⽚资源占位符${imagesBase64String},${imagesXmlHrefString}具体位置如下图所⽰: 5. ftl⽂件中由⼏个关键配置需要引⼊到代码中:docSrcParent = word.filesdocSrcLocationPrex =nextPartId = 01D2C8DD.BC13AF60上⾯三个参数,在模板⽂件中可以找到,需要进⾏配置,如果配置错误,图⽚⽂件将不会显⽰下⾯这三个参数固定,切换模板也不会改变shapeidPrex = _x56fe__x7247__x0020typeid = #_x0000_t75spidPrex = _x0000_i 6. 模板引⼊之后进⾏代码编辑源码地址为:下载源码后需要进⾏调整下内容:1. 录⼊步骤5中的6个参数2. 修改freemark获取模板⽅式下⾯这种⽅式能获取模板,但是在项⽬打包之后⽆法获取jar包内的⽂件Configuration configuration=newConfiguration(Configuration.getVersion());configuration.setDefaultEncoding(StandardCharsets.UTF_8.toString());configuration.setDirectoryForTemplateLoading(newFile(templatePath));Template template=configuration.getTemplate("xxx.ftl");通过流的形式直接创建模板对象Configuration configuration=newConfiguration(Configuration.getVersion());configuration.setDefaultEncoding(StandardCharsets.UTF_8.toString());configuration.setDirectoryForTemplateLoading(newFile(templatePath));InputStream inputStream=newFileInputStream(newFile(templatePath+"/"+templateName)); InputStreamReader inputStreamReader=newInputStreamReader(inputStream,StandardCharsets.UTF_8); Template template=newTemplate(templateName,inputStreamReader,configuration);。
Java实现word⽂档在线预览,读取office(word,excel,ppt)⽂件想要实现word或者其他office⽂件的在线预览,⼤部分都是⽤的两种⽅式,⼀种是使⽤openoffice转换之后再通过其他插件预览,还有⼀种⽅式就是通过POI读取内容然后预览。
⼀、使⽤openoffice⽅式实现word预览主要思路是:1.通过第三⽅⼯具openoffice,将word、excel、ppt、txt等⽂件转换为pdf⽂件2.通过swfTools将pdf⽂件转换成swf格式的⽂件3.通过FlexPaper⽂档组件在页⾯上进⾏展⽰我使⽤的⼯具版本:openof:3.4.1swfTools:1007FlexPaper:这个关系不⼤,我随便下的⼀个。
推荐使⽤1.5.1JODConverter:需要jar包,如果是maven管理直接引⽤就可以操作步骤:1.office准备下载openoffice:从过往⽂件,其他语⾔中找到中⽂版3.4.1的版本下载后,解压缩,安装然后找到安装⽬录下的program ⽂件夹在⽬录下运⾏soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard如果运⾏失败,可能会有提⽰,那就加上 .\ 在运⾏试⼀下这样openoffice的服务就开启了。
2.将flexpaper⽂件中的js⽂件夹(包含了flexpaper_flash_debug.js,flexpaper_flash.js,jquery.js,这三个js⽂件主要是预览swf⽂件的插件)拷贝⾄⽹站根⽬录;将FlexPaperViewer.swf拷贝⾄⽹站根⽬录下(该⽂件主要是⽤在⽹页中播放swf⽂件的播放器)项⽬结构:页⾯代码:fileUpload.jsp<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>⽂档在线预览系统</title><style>body {margin-top:100px;background:#fff;font-family: Verdana, Tahoma;}a {color:#CE4614;}#msg-box {color: #CE4614; font-size:0.9em;text-align:center;}#msg-box .logo {border-bottom:5px solid #ECE5D9;margin-bottom:20px;padding-bottom:10px;}#msg-box .title {font-size:1.4em;font-weight:bold;margin:0 0 30px 0;}#msg-box .nav {margin-top:20px;}</style></head><body><div id="msg-box"><form name="form1" method="post" enctype="multipart/form-data" action="docUploadConvertAction.jsp"><div class="title">请上传要处理的⽂件,过程可能需要⼏分钟,请稍候⽚刻。
Java实现上传txt,doc,docx⽂件并且读取内容1,前端上传/导⼊⽂件:var uploaderXls = new plupload.Uploader({//创建实例的构造⽅法runtimes: 'gears,html5,html4,silverlight,flash', //上传插件初始化选⽤那种⽅式的优先级顺序browse_button: 'btnImportXls', // 上传按钮url: "resumeController.do?importExcel", //远程上传地址flash_swf_url: 'plug-in/plupload/js/Moxie.swf', //flash⽂件地址silverlight_xap_url: 'plug-in/plupload/js/Moxie.xap', //silverlight⽂件地址filters: {max_file_size: '10mb', //最⼤上传⽂件⼤⼩(格式100b, 10kb, 10mb, 1gb)mime_types: [//允许⽂件上传类型{title: "files", extensions: "txt,doc,docx"}]},multipart_params:{isup:"1"},multi_selection: false, //true:ctrl多⽂件上传, false 单⽂件上传init: {FilesAdded: function(up, files) { //⽂件上传前debugger;uploaderXls.start();},FileUploaded: function(up, file, info) { //⽂件上传成功的时候触发info1 = JSON.parse(info.response);$("#resumeList").datagrid();layer.alert(info1.msg);//console.log(info.message);},Error: function(up,info, err) { //上传出错的时候触发layer.alert(err.message);}}});uploaderXls.init();2,后台接收⽂件,并读取:MultipartFile是spring的⼀个接⼝,通常我们可以在controller定义⽅法使⽤MultipartFile接收form表单提交的⽂件,然后将MultipartFile可以转化成⼀个⽂件。
java 注解数字转换成文字的方法【原创实用版4篇】目录(篇1)I.Java注解概述A.注解定义及作用B.Java注解发展历程II.数字转换成文字的方法A.使用Java内置方法B.使用第三方库C.自定义注解实现正文(篇1)Java注解是一种在Java程序中添加元数据的方法,用于在编译时或运行时对代码进行标记和处理。
Java注解的发展历程可以追溯到Java 1.5版本,自那时以来,注解已经成为Java编程语言的一个重要组成部分。
A.使用Java内置方法在Java中,可以使用内置的NumberFormat类将数字转换成文字。
NumberFormat类提供了许多静态方法,可以将数字转换成不同格式的字符串,例如货币、百分比、科学计数法等。
例如,以下代码将一个整数转换成货币格式的字符串:```javaimport java.text.NumberFormat;public class NumberToText {public static void main(String[] args) {int number = 12345;NumberFormat formatter =NumberFormat.getInstance(); // 使用美国本地化设置 String text = formatter.format(number);System.out.println(text); // 输出:$12,345}}```B.使用第三方库除了Java内置的方法之外,还可以使用第三方库将数字转换成文字。
其中最常用的是Apache Commons Lang库中的MessageFormat类。
MessageFormat类提供了一种格式化字符串的方式,可以插入变量和表达式,并将它们转换成指定的格式。
例如,以下代码将一个整数转换成带有占位符的字符串:```javaimport ng3.text.WordUtils;import java.text.MessageFormat;import java.util.Locale;public class NumberToText {public static void main(String[] args) {int number = 12345;String pattern = "{0,number,currency}{0,number,percent}"; // 货币和百分比的格式化字符串Locale locale = ; // 使用美国本地化设置MessageFormat formatter = new MessageFormat(pattern, locale);String text = formatter.format(new Object[]{number}); // 格式化字符串并插入变量numberSystem.out.println(text); // 输出:$12,345 100%}}```C.自定义注解实现除了使用内置方法和使用第三方库之外,还可以自定义注解来实现数字转换成文字的功能。
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(⼆)===============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文档:完美解决方案Word文档是一种广泛使用的文件格式,用于创建和编辑文本文档。
在Java编程中,读写Word文档是一个常见的需求。
本文将介绍一种完美解决方案,帮助您在Java中实现对Word文档的读写操作。
一、引入依赖要在Java中读写Word文档,我们需要使用Apache POI库。
Apache POI是一个Java类库,可用于读取和编写Microsoft Office文件格式,包括Word文档。
在您的Java项目中,您需要将以下依赖项添加到您的构建文件中,以便使用Apache POI库:```java<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency>```二、读取Word文档要读取一个Word文档,您可以使用Apache POI提供的XWPFDocument类。
以下是一个简单的示例代码,演示如何使用XWPFDocument读取Word文档:```javaimport ermodel.XWPFDocument;import org.apache.poi.xwpf.extractor.XWPFWordExtractor;import java.io.FileInputStream;import java.io.IOException;public class ReadWordDocument {public static void main(String[] args) {try {FileInputStream fis = newFileInputStream("path/to/your/word/document.docx");XWPFDocument document = new XWPFDocument(fis);XWPFWordExtractor extractor = new XWPFWordExtractor(document);String content = extractor.getText();System.out.println(content);fis.close();} catch (IOException e) {e.printStackTrace();}}}```在上面的代码中,您需要将"path/to/your/word/document.docx"替换为您实际的Word文档路径。
Java实现⽤Freemarker完美导出word⽂档(带图⽚)前⾔最近在项⽬中,因客户要求,将页⾯内容(如合同协议)导出成word,在⽹上翻了好多,感觉太乱了,不过最后还是较好解决了这个问题。
准备材料1.word原件2.编辑器(推荐Firstobject free XML editor)实现步骤1.⽤Microsoft Office Word打开word原件;2.把需要动态修改的内容替换成***,如果有图⽚,尽量选择较⼩的图⽚⼏⼗K左右,并调整好位置;3.另存为,选择保存类型Word 2003 XML ⽂档(*.xml)【这⾥说⼀下为什么⽤Microsoft Office Word打开且要保存为Word2003XML,本⼈亲测,⽤WPS找不到Word 2003XML选项,如果保存为Word XML,会有兼容问题,避免出现导出的word⽂档不能⽤Word 2003打开的问题】;4.⽤Firstobject free XML editor打开⽂件,选择Tools下的Indent【或者按快捷键F8】格式化⽂件内容。
左边是⽂档结构,右边是⽂档内容;5. 将⽂档内容中需要动态修改内容的地⽅,换成freemarker的标识。
其实就是Map<String, Object>中key,如${landName};6.在加⼊了图⽚占位的地⽅,会看到⼀⽚base64编码后的代码,把base64替换成${image},也就是Map<String, Object>中key,值必须要处理成base64;代码如:<w:binData w:name="wordml://⾃定义.png" xml:space="preserve">${image}</w:binData>注意:“>${image}<”这尖括号中间不能加任何其他的诸如空格,tab,换⾏等符号。
Java实现WordExcelTXT转PDF的⽅法引⾔:前段时间公司做的教育系统,系统需要实时记录⽤户学习课程的情况和时间,所以对⼀些除视频课程之外,对⼀些⽂本⽂档型课件同样如此,初次的⽅案是讲office相关类型的⽂件进⾏转换Html⽂件,然后展⽰对应的html⽂件,PC端差不多没问题了,但是个别⽂件再转换html之后,样式出现了错乱,即时做了编码转换处理,但是还是有个别乱码,最后改变⽅案,最后统⼀将⽂件转为pdf,然后通过流的⽅式在前端展⽰,其中包括Word Excel PPT TXT PDF等⽂件,代码如下:备注:本来是可以直接展⽰pdf的,但是Andior上pdf展⽰不了,最后统⼀就⽤IO流的⽅式进⾏读取展⽰了.1:添加maven依赖<!--excel word txt ppt转pdf依赖--><dependency><groupId>aspose</groupId><artifactId>pdf</artifactId><version>11.5.0</version></dependency><dependency><groupId>aspose</groupId><artifactId>words</artifactId><version>16.4.0</version></dependency><dependency><groupId>aspose</groupId><artifactId>cell</artifactId><version>8.9.2</version></dependency><dependency><groupId>aspose</groupId><artifactId>pdf</artifactId><version>11.5.0</version></dependency>2:添加license-excel.xml⽂件(Resource⽂件夹下)<License><Data><Products><Product>Aspose.Total for Java</Product><Product>Aspose.Words for Java</Product></Products><EditionType>Enterprise</EditionType><SubscriptionExpiry>20991231</SubscriptionExpiry><LicenseExpiry>20991231</LicenseExpiry><SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber></Data><Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature> </License>3:代码如下:3.1获取License⽂件public static boolean getLicense(){boolean result = false;InputStream is = null;try{is =UploadFiles.class.getClassLoader().getResourceAsStream("license-excel.xml");License aposeLic = new License();aposeLic.setLicense(is);result = true;}catch(Exception e){e.printStackTrace();}finally{try {is.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}return result;}3.2:⽂本⽂件转码/* 将txt 转换编码* @param file* @author zsqing*/public File saveAsUTF8(File file){String code = "gbk";byte[] head = new byte[3];try {InputStream inputStream = new FileInputStream(file);inputStream.read(head);if (head[0] == -1 && head[1] == -2) {code = "UTF-16";} else if (head[0] == -2 && head[1] == -1) {code = "Unicode";} else if (head[0] == -17 && head[1] == -69 && head[2] == -65) {code = "UTF-8";}inputStream.close();System.out.println(code);if (code.equals("UTF-8")) {return file;}String str = FileUtils.readFileToString(file, code);FileUtils.writeStringToFile(file, str, "UTF-8");System.out.println("转码结束");} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return file;}3.3:word和txt转换pdf/*** 将word txt转换成pdf* @param inPath* @param outPath* @author zsqing*/public void wordAndTextToPdf(String inPath, String outPath ,String localIP,HttpServletRequest request){String fileToPdfUrl="";boolean flag = false;File file = null;FileOutputStream os = null;try{//long old = System.currentTimeMillis();// 新建⼀个空⽩⽂档file = new File(outPath);file = saveAsUTF8(file);os = new FileOutputStream(file);// InPath是将要被转化的⽂档com.aspose.words.Document doc = new com.aspose.words.Document(inPath);/** 全⾯⽀持DOC,DOCX进⾏OOXML,RTF,HTML,OpenDocument,PDF,EPUB,XPS,SWF间转换*/doc.save(os, SaveFormat.PDF);flag = true;//long now = System.currentTimeMillis();//System.out.println("共耗时:" + ((now - old) / 1000.0) + "秒"); // 转化⽤时}catch (Exception e){e.printStackTrace();}finally{try{if (os != null){os.close();}}catch (Exception e){e.printStackTrace();}if (!flag){file.deleteOnExit();}}}3.4:Excel转换pdf/*** 将docx转换成pdf* @param inPath* @param outPath* @author zsqing*/public void wordToPdf(String inPath, String outPath ,String localIP,HttpServletRequest request){String fileToPdfUrl="";boolean flag = false;File file = null;FileOutputStream os = null;try{//long old = System.currentTimeMillis();// 新建⼀个空⽩⽂档file = new File(outPath);file = saveAsUTF8(file);os = new FileOutputStream(file);// InPath是将要被转化的⽂档com.aspose.words.Document doc = new com.aspose.words.Document(inPath);/** 全⾯⽀持DOC,DOCX进⾏OOXML,RTF,HTML,OpenDocument,PDF,EPUB,XPS,SWF间转换*/doc.save(os, SaveFormat.PDF);flag = true;//long now = System.currentTimeMillis();//System.out.println("共耗时:" + ((now - old) / 1000.0) + "秒"); // 转化⽤时}catch (Exception e){e.printStackTrace();}finally{try{if (os != null){os.close();}}catch (Exception e){e.printStackTrace();}if (!flag){file.deleteOnExit();}}}总结以上所述是⼩编给⼤家介绍的Java实现Word/Excel/TXT转PDF的⽅法,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。
一、把PPT转WORD形式的方法1.利用"大纲"视图打开PPT演示文稿,单击"大纲",在左侧"幻灯片/大纲”任务窗格的“大纲”选项卡里单击一下鼠标,按"Ctrl+A"组合健全选内容,然后使用"Ctrl+C"组合键或右键单击在快捷菜单中选择"复制"命令,然后粘贴到Word里。
提示:这种方法会把原来幻灯片中的行标、各种符号原封不动的复制下来。
2.利用"发送"功能巧转换打开要转换的PPT幻灯片,单击"文件"→"发送"→"MicrosoftWord"菜单命令。
然后选择"只使用大纲"单选按钮并单击"确定"按钮,等一会就发现整篇PPT文档在一个Word文档里被打开。
提示:在转换后会发现Word有很多空行。
在Word里用替换功能全部删除空行可按"Ctrl+H"打开"替换"对话框,在"查找内容"里输入"^p^p",在"替换为"里输入"^p",多单击几次"全部替换"按钮即可。
("^"可在英文状态下用"Shift+6"键来输入。
)3.利用"另存为"直接转换打开需要转换的幻灯片,点击"文件"→"另存为",然后在"保存类型"列表框里选择存为"rtf"格式。
现在用Word打开刚刚保存的rtf文件,再进行适当的编辑即可实现转换。
4.PPTConverttoDOC软件转换PPTConverttoDOC是绿色软,解压后直接运行,在运行之前请将Word和PPT程序都关闭。
Java如何实现读取txt⽂件内容并⽣成Word⽂档⽬录导⼊Jar包1. Maven仓库下载导⼊2. ⼿动导⼊读取txt⽣成Word注意事项本⽂将以Java程序代码为例介绍如何读取txt⽂件中的内容,⽣成Word⽂档。
在编辑代码前,可参考如下代码环境进⾏配置:IntelliJ IDEAFree Spire.Doc for JavaTxt⽂档导⼊Jar包两种⽅法可在Java程序中导⼊jar⽂件1. Maven仓库下载导⼊在pom.xml中配置如下:<repositories><repository><id>com.e-iceblue</id><url>https:///repository/maven-public/</url></repository></repositories><dependencies><dependency><groupId>e-iceblue</groupId><artifactId>spire.doc.free</artifactId><version>3.9.0</version></dependency></dependencies>2. ⼿动导⼊需先下载jar包到本地,解压,找到lib路径下的jar⽂件。
然后在Java程序中打开“Project Structure”窗⼝,然后执⾏如下步骤导⼊:找到本地路径下的jar⽂件,添加到列表,然后导⼊:读取txt⽣成Word代码⼤致步骤如下:1. 实例化Document类的对象。
然后通过Document.addSection()⽅法和Section.addParagraph()⽅法添加节和段落。
2. 读取txt⽂件:创建InputStreamReader类的对象,构造⽅法中传递输⼊流和指定的编码表名称。
java中高效获取txt所有文本内容的方法Java中高效获取txt所有文本内容的方法在Java编程中,我们经常需要读取文件的内容并进行处理。
在某些情况下,我们需要读取一个txt文件的所有文本内容,并且希望能够以高效的方式实现。
本文将介绍一种高效获取txt所有文本内容的方法,并逐步回答中括号内的问题。
第一步:使用Java的File类首先,我们需要使用Java的File类来表示我们要读取的txt文件。
File类提供了很多与文件相关的常用方法,比如判断文件是否存在、获取文件路径等。
javaFile file = new File("file.txt");在上面的代码中,我们创建了一个名为file的File对象,表示文件名为file.txt的文本文件。
你可以将file.txt替换为你要读取的txt文件名。
问题1:如何创建File类对象?答:通过在File类的构造函数中传入文件名(包括路径)来创建File对象。
问题2:如何表示要读取的txt文件的路径?答:可以使用相对路径或绝对路径来表示要读取的txt文件的路径。
相对路径是相对于当前Java程序的工作目录的路径,而绝对路径是该txt文件在文件系统中的完整路径。
第二步:使用Java的BufferedReader类接下来,我们需要使用Java的BufferedReader类来读取txt文件的内容。
BufferedReader类提供了按行读取文本内容的方法,非常适合读取txt 文件。
javatry {BufferedReader reader = new BufferedReader(new FileReader(file));String line;while ((line = reader.readLine()) != null) {处理文本内容}reader.close();} catch (IOException e) {e.printStackTrace();}在上面的代码中,我们首先创建一个BufferedReader对象reader,它使用FileReader对象来读取文件内容。
java 使用注解数字转换成文字的方法文章标题:深度探讨Java中使用注解实现数字转换成文字的方法在Java编程中,有时候我们需要将数字转换成对应的文字,比如将1转换成"一",将100转换成"一百"等。
这在很多场景下都是非常有用的,比如在金融系统中将数字金额转换成大写金额,或者在报表显示中将数字转换成对应的中文表示。
在本文中,将着重探讨如何利用注解在Java中实现数字转换成对应的文字表示的方法。
1. 简介在Java中,我们可以使用注解来实现数字转换成对应文字的功能。
注解是Java语言中的一种特殊标记,它可以在编译时或运行时对程序进行解释和处理,提供了更灵活、更强大的功能扩展机制。
2. 注解的定义我们需要定义一个注解来表示数字转换成文字的功能。
我们可以定义一个名为@NumberToWord的注解,用来标记需要进行转换的数字字段或方法。
```java@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.FIELD, ElementType.METHOD})public @interface NumberToWord {}```通过以上定义,我们可以在需要进行数字转换的字段或方法上标记@NumberToWord注解。
3. 实现转换逻辑接下来,我们需要编写转换逻辑的代码。
我们可以创建一个工具类,用来处理数字到文字的转换逻辑。
```javapublic class NumberToWordUtils {private static final String[] CN_NUMERIC = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"};private static final String[] CN_NUMERIC_UNIT = {"", "十", "百", "千", "万"};public static String convertToChineseNumber(int number) {// 实现具体的转换逻辑,将数字转换成对应的中文表示// ...}```在convertToChineseNumber方法中,我们可以编写具体的转换逻辑,将传入的数字转换成对应的中文表示。
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。
1、向wor d中写入内容首先在word中设置书签,如书签名为book mark,javas cript中可以这样写va rword;wor d=new Activ eXObj ect("Word.Appli catio n");varra nge=w ord.R ange;word.Visi ble=t rue;varpa th="f ilepa th";word.Docum ents.Open(path);ran ge=wo rd.Ac tiveD ocume nt.Bo okmar ks("b ookma rk").Range;ran ge.In sertB efore("哈哈哈哈哈哈");庸-人发表于2010-07-0612:48:38Zm j一起聊2、把wo rd文件转成html文件<scrip tlang uage=javas cript>fun ction savew ord(){var oWord App=n ewAct iveXO bject("Wor d.App licat ion");var oDocu ment=oWord App.D ocume nts.O pen("C:\\d oc2ht ml\\x.doc");oD ocume nt.Sa veAs("C:\\test.htm",8)oW ordAp p.Qui t();}</s cript></H EAD><BODY>Cli ckthe"save"butt ontos aveth efile"C:\t est.d oc"to"C:\t est.h tm":<inpu ttype=butt ononc lick="save word()"val ue=sa ve></BOD Y></HTML>庸-人发表于2010-07-06 12:53:09Zmj一起聊拷贝tabl e1内的内容到wor d<s cript langu age="javas cript">fu nctio nOpen Word(){//导出wordLaye r1.st yle.b order=0;E xcelS heet=newAc tiveX Objec t('Wo rd.Ap plica tion');Ex celSh eet.A pplic ation.Visi ble=t rue;varmy doc=E xcelS heet.Docum ents.Add('',0,0);my Range=mydo c.Ran ge(0,1);m yRang e=myd oc.Ra nge(m yRang e.End-1,my Range.End);//设定起始点v arsel=Laye r1.do cumen t.bod y.cre ateTe xtRan ge();sel.moveT oElem entTe xt(ta ble1);sel.sele ct();Laye r1.do cumen t.exe cComm and('Copy');se l.mov eEnd('char acter');m yRang e.Pas te();myR ange=mydoc.Rang e(myR ange.End-1,myRa nge.E nd);myRan ge.In sertA fter("\n");Exc elShe et.Ac tiveW indow.View.Tabl eGrid lines=fals e;}</scr ipt>庸-人发表于2010-07-06 12:57:43Zmj一起聊操作excel:<%@page c%><h1>co ntent</h1><htm l><h ead><scri ptlan guage="jav ascri pt"ty pe="t ext/j avasc ript">fun ction MakeE xcel(){va ri,j,n;tr y{va rxls=newAc tiveX Objec t("Ex cel.A pplic ation");}catc h(e){aler t("要打印该表,您必须安装E xcel电子表格软件,同时浏览器须使用“Activ eX控件”,您的浏览器须允许执行控件。
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)⽂件,并且可以显⽰图⽚。
使用JACOB进行Word编程示例2015年7月2日13:44Jacob项目的官方地址:/projects/jacob-project/官方介绍:JACOB is a JAVA-COM Bridge that allows you to call COM Automation components from Java. It uses JNI to make native calls to the COM libraries. JACOB runs on x86 and x64 environments supporting 32 bit and 64 bit JVMs它是一个使用jni来调用com组件及其库文件的工具。
这里仅介绍处理word文档。
首先要部署其dll文件。
jacob-1.14.3-x86.dll 或 jacob-1.14.3-x64.dll,下载的文件解压后即可看到。
我是直接将dll文件放在windows\system32目录下的,方便,当然也有其他做法。
其次,就是把其jar文件路径加入Windows路径中。
接着就可以在你的Java程序中调用了。
我总结下大概有下面几个阶段:1. 初始化相关参数,代码如下:// 打开Word应用程序ActiveXComponent app = new ActiveXComponent("Word.Application");// 设置word不可见app.setProperty("Visible", new Variant(false));// 打开word文件Dispatch word = app.getProperty("Documents").toDispatch();Dispatch doc = Dispatch.invoke(word, "Open", Dispatch.Method, new Object[] {" File Name", new Variant(false), new Variant(false) }, new int[1]).toDispatch();//获取指针Dispatch cursor = app.getProperty("Selection").toDispatch();如上,我们打开了一个名为File Name的word文件,你可能会觉得最后那句看起来很繁琐,是的,有更好的代替方式,如下:Dispatch doc = Dispatch.call(word, "Open", new Variant(false), new Variant(false) ).toDisptach();这正是Jacob给我们提供的两种调用方式。
2. 处理word文档,如果你先前有VBA相关开发经验,那就简单了。
没有的也没事,打开office程序目录下的2052\VBAWD10.chm,这里有Word的对象模型的所有记录。
接着讲述下Jacob中两种最常用的类型:Variant:这是一种可变的类型,用于Jacob中几乎所有函数的返回值,并可转换为其他任何类型,包括Java基本类型。
当然,应该按需要与规则来。
Dispatch:Object represents MS level dispatch object. Each instance of this points at some data structure on the MS windows side.就是说可以代表所有对象模型。
import java.util.ArrayList;import java.util.List;import com.jacob.activeX.ActiveXComponent;import Thread;import .Dispatch;import .Variant;import org.apache.log4j.Logger;/****作用:利用jacob插件生成word 文件!***/public class DOCWriter {/** 日志记录器 */static private Logger logger = Logger.getLogger(DOCWriter.class);/** word文档** 在本类中有两种方式可以进行文档的创建,<br>* 第一种调用 createNewDocument* 第二种调用 openDocument*/private Dispatch document = null;/** word运行程序对象 */private ActiveXComponent word = null;/** 所有word文档 */private Dispatch documents = null;/*** Selection 对象代表窗口或窗格中的当前所选内容。
所选内容代表文档中选定(或突出显示)的区域,如果文档中没有选定任何内容,则代表插入点。
* 每个文档窗格只能有一个Selection 对象,并且在整个应用程序中只能有一个活动的Selection 对象。
*/private Dispatch selection = null;/**** Range 对象代表文档中的一个连续区域。
每个 Range 对象由一个起始字符位置和一个终止字符位置定义。
* 说明:与书签在文档中的使用方法类似,Range 对象在 Visual Basic 过程中用来标识文档的特定部分。
* 但与书签不同的是,Range对象只在定义该对象的过程运行时才存在。
* Range对象独立于所选内容。
也就是说,您可以定义和处理一个范围而无需更改所选内容。
还可以在文档中定义多个范围,但每个窗格中只能有一个所选内容。
*/private Dispatch range = null;/*** PageSetup 对象该对象包含文档的所有页面设置属性(如左边距、下边距和纸张大小)。
*/private Dispatch pageSetup = null;/** 文档中的所有表格对象 */private Dispatch tables = null;/** 一个表格对象 */private Dispatch table = null;/** 表格所有行对象 */private Dispatch rows = null;/** 表格所有列对象 */private Dispatch cols = null;/** 表格指定行对象 */private Dispatch row = null;/** 表格指定列对象 */private Dispatch col = null;/** 表格中指定的单元格 */private Dispatch cell = null;/** 字体 */private Dispatch font = null;/** 对齐方式 */private Dispatch alignment = null;/*** 构造方法*/public DOCWriter() {if(this.word == null){/* 初始化应用所要用到的对象实例 */this.word = new ActiveXComponent("Word.Application");/* 设置Word文档是否可见,true-可见false-不可见 */this.word.setProperty("Visible",new Variant(true));/* 禁用宏 */this.word.setProperty("AutomationSecurity", new Variant(3)); }if(this.documents == null){this.documents = word.getProperty("Documents").toDispatch(); }}/*** 设置页面方向和页边距** @param orientation* 可取值0或1,分别代表横向和纵向* @param leftMargin* 左边距的值* @param rightMargin* 右边距的值* @param topMargin* 上边距的值* @param buttomMargin* 下边距的值*/public void setPageSetup(int orientation, int leftMargin,int rightMargin, int topMargin, int buttomMargin) {logger.debug("设置页面方向和页边距...");if(this.pageSetup == null){this.getPageSetup();}Dispatch.put(pageSetup, "Orientation", orientation);Dispatch.put(pageSetup, "LeftMargin", leftMargin);Dispatch.put(pageSetup, "RightMargin", rightMargin);Dispatch.put(pageSetup, "TopMargin", topMargin);Dispatch.put(pageSetup, "BottomMargin", buttomMargin);}/*** 打开文件** @param inputDoc* 要打开的文件,全路径* @return Dispatch* 打开的文件*/public Dispatch openDocument(String inputDoc) {logger.debug("打开Word文档...");this.document = Dispatch.call(documents,"Open",inputDoc).toDispatch();this.getSelection();this.getRange();this.getAlignment();this.getFont();this.getPageSetup();return this.document;}/*** 创建新的文件** @return Dispache 返回新建文件*/public Dispatch createNewDocument(){logger.debug("创建新的文件...");this.document = Dispatch.call(documents,"Add").toDispatch(); this.getSelection();this.getRange();this.getPageSetup();this.getAlignment();this.getFont();return this.document;}/*** 选定内容* @return Dispatch 选定的范围或插入点*/public Dispatch getSelection() {logger.debug("获取选定范围的插入点...");this.selection = word.getProperty("Selection").toDispatch();return this.selection;}/*** 获取当前Document内可以修改的部分<p><br>* 前提条件:选定内容必须存在** @param selectedContent 选定区域* @return 可修改的对象*/public Dispatch getRange() {logger.debug("获取当前Document内可以修改的部分...");this.range = Dispatch.get(this.selection, "Range").toDispatch();return this.range;}/*** 获得当前文档的文档页面属性*/public Dispatch getPageSetup() {logger.debug("获得当前文档的文档页面属性...");if(this.document == null){logger.warn("document对象为空...");return this.pageSetup;}this.pageSetup = Dispatch.get(this.document, "PageSetup").toDispatch(); return this.pageSetup;}/*** 把选定内容或插入点向上移动* @param count 移动的距离*/public void moveUp(int count) {logger.debug("把选定内容或插入点向上移动...");for(int i = 0;i < count;i++) {Dispatch.call(this.selection,"MoveUp");}/*** 把选定内容或插入点向下移动* @param count 移动的距离*/public void moveDown(int count) {logger.debug("把选定内容或插入点向下移动..."); for(int i = 0;i < count;i++) {Dispatch.call(this.selection,"MoveDown");}}/*** 把选定内容或插入点向左移动* @param count 移动的距离*/public void moveLeft(int count) {logger.debug("把选定内容或插入点向左移动..."); for(int i = 0;i < count;i++) {Dispatch.call(this.selection,"MoveLeft");}}/*** 把选定内容或插入点向右移动* @param count 移动的距离*/public void moveRight(int count) {logger.debug("把选定内容或插入点向右移动..."); for(int i = 0;i < count;i++) {Dispatch.call(this.selection,"MoveRight");}/*** 回车键*/public void enterDown(int count){logger.debug("按回车键...");for(int i = 0;i < count;i++) {Dispatch.call(this.selection, "TypeParagraph");}}/*** 把插入点移动到文件首位置*/public void moveStart() {logger.debug("把插入点移动到文件首位置...");Dispatch.call(this.selection,"HomeKey",new Variant(6));}/*** 从选定内容或插入点开始查找文本* @param selection 选定内容* @param toFindText 要查找的文本* @return boolean true-查找到并选中该文本,false-未查找到文本*/public boolean find(String toFindText) {logger.debug("从选定内容或插入点开始查找文本"+" 要查找内容: "+toFindText); /* 从selection所在位置开始查询 */Dispatch find = Dispatch.call(this.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 selection 选定内容* @param newText 替换为文本*/public void replace(String newText) {logger.debug("把选定内容替换为设定文本...");/* 设置替换文本 */Dispatch.put(this.selection,"Text",newText);}/*** 全局替换* @param selection 选定内容或起始插入点* @param oldText 要替换的文本* @param replaceObj 替换为文本*/public void replaceAll(String oldText,Object replaceObj) {logger.debug("全局替换...");/* 移动到文件开头 */moveStart();/* 表格替换方式 */String newText = (String) replaceObj;/* 图片替换方式 */if(oldText.indexOf("image") != -1 || stIndexOf(".bmp") != -1 ||stIndexOf(".jpg") != -1 || stIndexOf(".gif") != -1){while (find(oldText)) {insertImage(newText);Dispatch.call(this.selection,"MoveRight");}/* 正常替换方式 */} else {while (find(oldText)) {replace(newText);Dispatch.call(this.selection,"MoveRight");}}}/*** 插入图片* @param selection 图片的插入点* @param imagePath 图片文件(全路径)*/public void insertImage(String imagePath) {logger.debug("插入图片...");Dispatch.call(this.selection, "TypeParagraph");Dispatch.call(Dispatch.get(this.selection,"InLineShapes").toDispatch(),"AddPicture",i magePath);}/*** 合并表格** @param selection 操作对象* @param tableIndex 表格起始点* @param fstCellRowIdx 开始行* @param fstCellColIdx 开始列* @param secCellRowIdx 结束行* @param secCellColIdx 结束列*/public void mergeCell(int tableIndex, int fstCellRowIdx, int fstCellColIdx, int secCellRowIdx, int secCellColIdx){logger.debug("合并单元格...");if(this.table == null){logger.warn("table对象为空...");return;}Dispatch fstCell = Dispatch.call(table, "Cell",new Variant(fstCellRowIdx), new Variant(fstCellColIdx)).toDispatch();Dispatch secCell = Dispatch.call(table, "Cell",new Variant(secCellRowIdx), new Variant(secCellColIdx)).toDispatch();Dispatch.call(fstCell, "Merge", secCell);}/*** 想Table对象中插入数值<p>* 参数形式:ArrayList<String[]>List.size()为表格的总行数<br>* String[]的length属性值应该与所创建的表格列数相同** @param selection 插入点* @param tableIndex 表格起始点* @param list 数据内容*/public void insertToTable(List<String[]> list){System.out.println("向Table对象中插入数据...");logger.debug("向Table对象中插入数据...");if(list == null || list.size() <= 0){logger.warn("写出数据集为空...");return;}if(this.table == null){logger.warn("table对象为空...");return;}for(int i = 0; i < list.size(); i++){String[] strs = list.get(i);for(int j = 0; j<strs.length; j++){/* 遍历表格中每一个单元格,遍历次数与所要填入的内容数量相同 */ Dispatch cell = this.getCell(i+1, j+1);/* 选中此单元格 */Dispatch.call(cell, "Select");/* 写出内容到此单元格中 */Dispatch.put(this.selection, "Text", strs[j]);/* 移动游标到下一个位置 */}this.moveDown(1);}this.enterDown(1);}/*** 在文档中正常插入文字内容** @param selection 插入点* @param list 数据内容*/public void insertToDocument(List<String> list){logger.debug("向Document对象中插入数据...");if(list == null || list.size() <= 0){logger.warn("写出数据集为空...");return;}if(this.document == null){logger.warn("document对象为空...");return;}for(String str : list){/* 写出至word中 */this.applyListTemplate(3, 2);Dispatch.put(this.selection, "Text", str);this.moveDown(1);this.enterDown(1);}}/*** 创建新的表格** @param selection 插入点* @param document 文档对象* @param rowCount 行数* @param colCount 列数* @param width 边框数值 0浅色1深色* @return 新创建的表格对象*/public Dispatch createNewTable(int rowCount, int colCount, int width){logger.debug("创建新的表格...");if(this.tables == null){this.getTables();}this.getRange();if(rowCount > 0 && colCount > 0){this.table = Dispatch.call(this.tables,"Add",this.range,new Variant(rowCount),new Variant(colCount),new Variant(width)).toDispatch();}/* 返回新创建表格 */return this.table;}/*** 获取Document对象中的所有Table对象** @return 所有Table对象*/public Dispatch getTables(){logger.debug("获取所有表格对象...");if(this.document == null){logger.warn("document对象为空...");return this.tables;}this.tables = Dispatch.get(this.document, "Tables").toDispatch(); return this.tables;}/*** 获取Document中Table的数量** @return 表格数量*/public int getTablesCount(){logger.debug("获取文档中表格数量...");if(this.tables == null){this.getTables();}return Dispatch.get(tables, "Count").getInt();}/*** 获取指定序号的Table对象** @param tableIndex Table序列* @return*/public Dispatch getTable(int tableIndex){logger.debug("获取指定表格对象...");if(this.tables == null){this.getTables();}if(tableIndex >= 0){this.table = Dispatch.call(this.tables, "Item", new Variant(tableIndex)).toDispatch();}return this.table;}/*** 获取表格的总列数** @return 总列数*/public int getTableColumnsCount() {logger.debug("获取表格总行数...");if(this.table == null){logger.warn("table对象为空...");return 0;}return Dispatch.get(this.cols,"Count").getInt(); }/*** 获取表格的总行数** @return 总行数*/public int getTableRowsCount(){logger.debug("获取表格总行数...");if(this.table == null){logger.warn("table对象为空...");return 0;}return Dispatch.get(this.rows,"Count").getInt();}/*** 获取表格列对象** @return 列对象*/public Dispatch getTableColumns() {logger.debug("获取表格行对象...");if(this.table == null){logger.warn("table对象为空...");return this.cols;}this.cols = Dispatch.get(this.table,"Columns").toDispatch(); return this.cols;}/*** 获取表格的行对象** @return 总行数*/public Dispatch getTableRows(){logger.debug("获取表格总行数...");if(this.table == null){logger.warn("table对象为空...");return this.rows;}this.rows = Dispatch.get(this.table,"Rows").toDispatch();}/*** 获取指定表格列对象** @return 列对象*/public Dispatch getTableColumn(int columnIndex) {logger.debug("获取指定表格行对象...");if(this.cols == null){this.getTableColumns();}if(columnIndex >= 0){this.col = Dispatch.call(this.cols, "Item", newVariant(columnIndex)).toDispatch();}return this.col;}/*** 获取表格中指定的行对象** @param rowIndex 行序号* @return 行对象*/public Dispatch getTableRow(int rowIndex){logger.debug("获取指定表格总行数...");if(this.rows == null){this.getTableRows();}if(rowIndex >= 0){this.row = Dispatch.call(this.rows, "Item", new Variant(rowIndex)).toDispatch(); }}/*** 自动调整表格*/public void autoFitTable() {logger.debug("自动调整表格...");int count = this.getTablesCount();for (int i = 0; i < count; i++) {Dispatch table = Dispatch.call(tables, "Item", new Variant(i + 1)).toDispatch(); Dispatch cols = Dispatch.get(table, "Columns").toDispatch();Dispatch.call(cols, "AutoFit");}}/*** 获取当前文档中,表格中的指定单元格** @param CellRowIdx 单元格所在行* @param CellColIdx 单元格所在列* @return 指定单元格对象*/public Dispatch getCell(int cellRowIdx, int cellColIdx) {logger.debug("获取当前文档中,表格中的指定单元格...");if(this.table == null){logger.warn("table对象为空...");return this.cell;}if(cellRowIdx >= 0 && cellColIdx >=0){this.cell = Dispatch.call(this.table, "Cell", new Variant(cellRowIdx),newVariant(cellColIdx)).toDispatch();}}/*** 设置文档标题** @param title 标题内容*/public void setTitle(String title){logger.debug("设置文档标题...");if(title == null || "".equals(title)){logger.warn("文档标题为空...");return;}Dispatch.call(this.selection, "TypeText", title);}/*** 设置当前表格线的粗细** @param width* width范围:1<w<13,如果是0,就代表没有框*/public void setTableBorderWidth(int width) {logger.debug("设置当前表格线的粗细...");if(this.table == null){logger.warn("table对象为空...");return;}/** 设置表格线的粗细 1:代表最上边一条线 2:代表最左边一条线 3:最下边一条线4:最右边一条线 5:除最上边最下边之外的所有横线* 6:除最左边最右边之外的所有竖线 7:从左上角到右下角的斜线 8:从左下角到右上角的斜线*/Dispatch borders = Dispatch.get(table, "Borders").toDispatch();Dispatch border = null;for (int i = 1; i < 7; i++) {border = Dispatch.call(borders, "Item", new Variant(i)).toDispatch();if (width != 0) {Dispatch.put(border, "LineWidth", new Variant(width));Dispatch.put(border, "Visible", new Variant(true));} else if (width == 0) {Dispatch.put(border, "Visible", new Variant(false));}}}/*** 对当前selection设置项目符号和编号* @param tabIndex* 1: 项目编号* 2: 编号* 3: 多级编号* 4: 列表样式* @param index* 0:表示没有 ,其它数字代表的是该Tab页中的第几项内容*/public void applyListTemplate(int tabIndex,int index){logger.debug("对当前selection设置项目符号和编号...");/* 取得ListGalleries对象列表 */Dispatch listGalleries = Dispatch.get(this.word, "ListGalleries").toDispatch();/* 取得列表中一个对象 */Dispatch listGallery = Dispatch.call(listGalleries, "Item", newVariant(tabIndex)).toDispatch();Dispatch listTemplates = Dispatch.get(listGallery, "ListTemplates").toDispatch(); if(this.range == null){this.getRange();}Dispatch listFormat = Dispatch.get(this.range, "ListFormat").toDispatch();Dispatch.call(listFormat,"ApplyListTemplate",Dispatch.call(listTemplates, "Item", new Variant(index)), new Variant(true),new Variant(1),new Variant(0));}/*** 增加文档目录** 目前采用固定参数方式,以后可以动态进行调整*/public void addTablesOfContents(){/* 取得ActiveDocument、TablesOfContents、range对象 */Dispatch ActiveDocument = word.getProperty("ActiveDocument").toDispatch(); Dispatch TablesOfContents =Dispatch.get(ActiveDocument,"TablesOfContents").toDispatch();Dispatch range = Dispatch.get(this.selection, "Range").toDispatch();/* 增加目录 */Dispatch.call(TablesOfContents,"Add",range,new Variant(true),new Variant(1),new Variant(3),new Variant(true),new Variant(""),new Variant(true),new Variant(true));}/*** 设置当前Selection 位置方式* @param selectedContent 0-居左;1-居中;2-居右。