一、HWPFDocument 获取word目录与链接,形成(key,value)的形式
/* * 文 件 名: MSWordPoi4.java * 版 权: Sunny Technologies Co., Ltd. Copyright YYYY-YYYY, All rights reserved * 描 述: <描述> * 修 改 人: L.Hao * 修改时间: 2014-8-8 * 跟踪单号: <跟踪单号> * 修改单号: <修改单号> * 修改内容: <修改内容> */package com.test;/** * <一句话功能简述> * <功能详细描述> * * @author L.Hao * @version [版本号, 2014-8-8] * @see [相关类/方法] * @since [产品/模块版本] */import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import org.apache.poi.hwpf.HWPFDocument;import org.apache.poi.hwpf.model.FieldsDocumentPart;import org.apache.poi.hwpf.usermodel.Field;import org.apache.poi.hwpf.usermodel.Fields;import org.apache.poi.hwpf.usermodel.Paragraph;import org.apache.poi.hwpf.usermodel.Range;import org.apache.poi.hwpf.usermodel.Table;import org.apache.poi.hwpf.usermodel.TableCell;import org.apache.poi.hwpf.usermodel.TableIterator;import org.apache.poi.hwpf.usermodel.TableRow;public class MSWordPoi4{ /** * @param args */ public static void main(String[] args) { Map 。."); //迭代行,默认从0开始 for (int i = 0; i < tb.numrows();="" i++)="" {="" tablerow="" tr="tb.getRow(i);" 只读前8行,标题部分="" if(i="">=8) break; //迭代列,默认从0开始 for (int j = 0; j < tr.numcells();="" j++)="" {="" tablecell="" td="tr.getCell(j);//取得单元格" 取得单元格的内容="" for(int="" k="">
ueditor实现word文档的导入和下载功能的方法:1、UEditor没有提供word的导入功能,只能说是粘贴复制。 2、方案:用poi来提供word导入,思路是将word转换为html输出,再用UEditor提供的setContent()方法将html的内容添加到编辑器中。方案缺点,一是poi对word文本的格式获取必须按setContent()可接受的方式进行;二是我暂时没发现poi可以提供获取段落格式(对齐方式、缩进量)的方法。 代码如下:package demo;import java.io.BufferedWriter; import java.io.ByteArrayOutputStream;import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.util.List; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.apache.poi.hwpf.HWPFDocument; import org.apache.poi.hwpf.converter.PicturesManager; import org.apache.poi.hwpf.converter.WordToHtmlConverter; import org.apache.poi.hwpf.usermodel.Picture; import org.apache.poi.hwpf.usermodel.PictureType; import org.w3c.dom.Document; public class Word2Html { public static void main(String argv[]) { String htmlContent = new String(); try { htmlContent = convert2Html("D://test//1.doc","D://test//1.html"); } catch (Exception e) { e.printStackTrace(); } System.out.println(htmlContent); } /** * 将内容写入指定路径下的html文件 * @param content * @param path */ public static void writeFile(String content, String path) { FileOutputStream fos = null; BufferedWriter bw = null; try { File file = new File(path); fos = new FileOutputStream(file); bw = new BufferedWriter(new OutputStreamWriter(fos,"UTF-8")); bw.write(content); } catch (FileNotFoundException fnfe) { fnfe.printStackTrace(); } catch (IOException ioe) { ioe.printStackTrace(); } finally { try { if (bw != null) bw.close(); if (fos != null) fos.close(); } catch (IOException ie) { } } } /** * 转换为html * @param fileName * @param outPutFile * @throws TransformerException * @throws IOException * @throws ParserConfigurationException */ public static String convert2Html(String fileName, String outPutFile) throws TransformerException, IOException, ParserConfigurationException { HWPFDocument wordDocument = new HWPFDocument(new FileInputStream(fileName)); //WordToHtmlUtils.loadDoc(new FileInputStream(inputFile)); WordToHtmlConverter wordToHtmlConverter = new WordToHtmlConverter(DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument()); wordToHtmlConverter.setPicturesManager(new PicturesManager() { /** * 按建议名称保存图片 */ public String savePicture( byte[] content, PictureType pictureType, String suggestedName, float widthInches, float heightInches ) { return "D:/test/"+suggestedName; } } ); wordToHtmlConverter.processDocument(wordDocument); //save pictures List pics = wordDocument.getPicturesTable().getAllPictures(); if( pics!=null ){ for(int i=0; i。 关键代码如下: FileInputStream fileInputStream = new FileInputStream( soureFile); POIFSFileSystem pfs = new POIFSFileSystem( fileInputStream ); HWPFDocument hwpf = new HWPFDocument(pfs);// make a HWPFDocument object OutputStream output = new FileOutputStream( targetFile ); hwpf.write(output);// write to the target file output.close(); (2)再word中插入表格。HWPF的情况: Table tcDataTable = range.insertTableBefore( (short)column , row);//column and row列数和行数 tcDataTable.getRow(i).getCell(j).getParagraph(0).getCharacterRun(0).insertBefore("插入i行j列的内容" ); XWPF的情况: String outputFile = "D:\\test.doc"; XWPFDocument document = new XWPFDocument(); XWPFTable tableOne = document.createTable(); XWPFTableRow tableOneRowOne = tableOne.getRow(0); tableOneRowOne.getCell(0).setText("11"); XWPFTableCell cell12 = tableOneRowOne.createCell(); cell12.setText("12"); // tableOneRowOne.addNewTableCell().setText("第1行第2列"); // tableOneRowOne.addNewTableCell().setText("第1行第3列"); // tableOneRowOne.addNewTableCell().setText("第1行第4列"); XWPFTableRow tableOneRowTwo = tableOne.createRow(); tableOneRowTwo.getCell(0).setText("21"); tableOneRowTwo.getCell(1).setText("22"); // tableOneRowTwo.getCell(2).setText("第2行第3列"); XWPFTableRow tableOneRow3 = tableOne.createRow(); tableOneRow3.addNewTableCell().setText("31"); tableOneRow3.addNewTableCell().setText("32"); FileOutputStream fOut; try { fOut = new FileOutputStream(outputFile); document.write(fOut); fOut.flush(); // 操作结束,关闭文件 fOut.close(); } catch (Exception e) { e.printStackTrace(); } [C:\\doc.doc]内容:我是$[name];Word.java-writeWord方法: Java代码 public void writeWord(HttpServletResponse response) { String URL = "C:\\doc.doc"; File file = new File(URL); try { FileInputStream in = new FileInputStream(file); POIFSFileSystem pfs = new POIFSFileSystem(in); HWPFDocument hwpf = new HWPFDocument(pfs); Range range = hwpf.getRange(); String str = range.text(); str = str.replace("$[name]", "黄锋"); System.out.println(str); response.setCharacterEncoding("GB2312"); response.setContentType("application/ms-word"); response.setHeader("Content-disposition", "attachment; filename=1.doc"); PrintWriter out = response.getWriter(); out.println(str); out.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void writeWord(HttpServletResponse response) { String URL = "C:\\doc.doc"; File file = new File(URL); try { FileInputStream in = new FileInputStream(file); POIFSFileSystem pfs = new POIFSFileSystem(in); HWPFDocument hwpf = new HWPFDocument(pfs); Range range = hwpf.getRange(); String str = range.text(); str = str.replace("$[name]", "黄锋"); System.out.println(str); response.setCharacterEncoding("GB2312"); response.setContentType("application/ms-word"); response.setHeader("Content-disposition", "attachment; filename=1.doc"); PrintWriter out = response.getWriter(); out.println(str); out.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }。 以制做田字格为例 利用“表格与边框”里面的功能设置。 1、先制作一个有很多方格(比如20行,25列)的表格,具体的得试一下看结果是否呈方形再确定多少行和列。 2、再根据“田”字的形状将某些行分次选中,将框线设置为“无边框”。 3、同理,将某些列也设置为无边框。 预览看一下。 是不是很方便,很神奇?! 这里的关键是要掌握表格快捷菜单中的那个像“田”字的按钮和它右边的小小的向下箭头,所有的奥秘都在里边了,当然,还要结合前面的“线型”的有无、粗细、虚实。 如果你掌握了方法,四线格、米字格照此办理。 这个法子是可行的,就是麻烦一点。 1、打开一个空白的Word文档。 2、选择菜单栏“插入”中的插入表格按钮,插入一个2行2列的表格。 3、选中表格,单击鼠标右键,选择“边框和底纹”选项。 4、把右侧预览处表格内部的实线去掉,去掉的方法就是直接鼠标单击要去掉的实线,并选中红框处标出的虚线。 5、在上一步去掉的内部实线处,以去掉实线相同的方法加上虚线,单击“确定”按钮。 6、还是选中表格,单击鼠标右键,选择“表格属性”选项。 7、在弹出的对话框中作出的设置,共三处,设置完成后,单击“确定”按钮。 8、这样我们就完成了一个田字格。 9、我们可以用复制的方法,粘贴出更多的田字格。 它们都是字处理软件,都用于办公。区别: 1、wps是国人开发,使用起来更符合我们中国人的排版习惯,而word是微软的,全世界范围内使通用,有些功能不符合我们的排版习惯 2、个人认为wps中的表格功能很强大,比word的表格功能要全一些,同时更符合我们中国人制作表格的标准。 3、在对对象处理上,各有优劣,这要看你的工作性质来决定是使用哪一个。WPS中的对象功能上比Word要少一些,但WPS中的单行文字可以进行对文字旋转和镜像,而Word不行,无法对对象内的文字进行旋转操作。 可根据需求导入对应的jar。 一、HWPFDocument类的使用 用HWPFDocument类将数据写到指定的word文档中,基本思路是这样的: - 首先,建立一个HWPFDocument类的实例,关联到一个临时的word文档; - 然后,通过Range类实例,将数据写入这个word文档中; - 接着,将这个临时的word文档通过write函数写入指定的word文档中。 - 最后,关闭所有资源。 下面详细说明各个步骤。 1.构造函数 这里要说明一下,经过试验,暂时还没找到直接在程序中新建一个word文档并读取的方法,只能先创建好temp.doc,然后在程序中读取。 (用File-createNewFile和POIFSFileSystem.create创建出来的.doc文件,都不能被正确读取) 另外,其实选择哪种参数传入都是一样的,毕竟HWPFDocument关联的word文档是无法写入的,只是当作一个临时文件。所以,选择最为熟悉的InputStream较为合适。 参数1:InputStream。可将word文档用FileInputStream流读取,然后传入HWPFDocument类。 主要用于读取word文档中的数据。 参数2:POIFSFileSystem。 POIFSFileSystem的构造函数参数可以是(File,boolean)【这样的话file必须是已经存在的】,后者为false时可读写。这里可以写为 HWPFDocument doc = new HWPFDocument(new POIFSFileSystem(new File("temp.doc"),false));2.Range类 (1)获取Range类实例。 HWPFDocument类中有一系列获取Range类实例以操作word文档的方法。比较常用的是getRange(),这个方法可以获取涵盖整个文档的范围,但不包括任何页眉和页脚。 Range range = doc.getRange(); 此外,还有获取所有文本范围的getOverallRange()、获取所有文本框的getMainTextboxRange()等等,具体可以根据需求查阅文档。(2)Range类操作word文档 Range类中有大量获取文档数据的方法,若有需要可以查阅文档。 这里只说明与写入数据有关的方法。 1. insertBefore(String),将字符串插入到此range的开头。 返回值类型:CharacterRun 2. insertAfter(String),将字符串插入到此range的结尾。返回值类型:CharacterRun 3. insertTableBefore(short列数, int行数),在此range的开头插入一个指定行列数的表。 返回值类型:Table 4. text(),获取当前range的所有文本。返回值类型:String。 虽然不是写入数据的方法,但是在调试过程中比较好用。3.write方法 HWPFDocument类中的write方法有三种重载形式:(实际上可以理解为writeTo) 参数1:空参数。 将本对象关联的word文档写入另一个打开的可写的POIFSFileSystem文件中。 参数2:File。 将本对象关联的word文档写入指定的文件(newFile)中。如果该文件不存在,则创建;若存在,则覆盖。 参数3:OutputStream。将本对象关联的word文档写入指定的字节输出流中。 可以根据需求选择,但是最好还是选择OutputStream,因为输出流的操作空间更大。参数2的newFile不能续写,只能覆盖。 可以将其直接写入目标文件的输出流,也可以先写入一个字节数组输出流,在通过字节数组输出流写入到目标文件输出流中。4.关闭资源 - 关闭doc.close();,也即是关闭doc所使用的资源”temp.doc” - 关闭将数据写入指定word文档的输出流 二、代码示例 复制代码 三、调试记录 1.关于创建临时temp.doc的尝试 目的:在程序开始时创建一个temp.doc,程序结束后删除。 尝试1:用File-createNewFile创建出文件,然后用POIFSFileSystem构造函数打开这个文件, 然后用HWPFDocument关联到这个POIFSFileSystem类实例。 结果:org.apache.poi.EmptyFileException: The supplied file was empty (zero bytes long)。 创建出的文件是0字节空文件,不能被POIFSFileSystem打开。尝试2:用POIFSFileSystem.create(file)静态函数创建POIFSFileSystem实例,然后用 HWPFDocument关联。 结果:java.io.FileNotFoundException: no such entry: “WordDocument”, had: []。文件 是创建成功了,也用POIFSFileSystem成功载入,但是HWPFDocument无法接收这个参数。 结论:目前只能用Office软件创建的word文档才行。也就是说暂时还没找到直接在程序中新建 一个word文档的方法,只能先创建好temp.doc,然后在程序中读取。 2.无法写入temp.doc 描述:用doc.getRange()方法获取文件的整个范围,然后用range.insertAfter(String)方法 插入数据。编译运行没有任何异常,但是打开文件发现还是原样。 尝试:插入数据后用range.text()获取当前range的所有文本并显示在控制台上,发现数据的 确是成功插入到了range中,但是temp.doc依然没有任何变化。猜测:可能是文件读取到HWPFDocument的方式不对,只读不可写入。 也有可能是range中的内容并不会改变.doc的内容,必须doc.write(*)写入到另一个文件中才 行。 尝试:通过各种方式(inputstream,poifsfilesystem,(poifs,readonly))载入temp.doc,结 果都是一样。 于是开始尝试第二种猜测。3.加入doc.write(*)方法后,运行报错,找不到需要的类文件(编译正常)。 详情:只加了这一句话,这句话报错:doc.write(out):java.lang.NoClassDefFoundError错 误 分析:。 转载请注明出处51数据库 » hwpfdocumentword二、ueditor如何实现word文档的导入和下载功能
三、nopi 操作word hwpf在哪个dll中
四、如何解决POI生成WORD中文乱码问题
五、在word中如何打"田字格"
六、怎样在word里打田字格
七、WPSG与word有什么区别
八、花火read在哪写文