java用poi实现对word读取和修改操作
随笔记录①—利用poi读取Word中的标题和内容

随笔记录①—利⽤poi读取Word中的标题和内容使⽤时间:4⼩时使⽤poi⽅法将word中的内容提取出来,并输出到控制台或者存储到数据库poi.jar下载地址:需要导⼊的包根据标题和内容字体⼤⼩的不同,寻找所需要的段落和标题,并判断是标题还是内容。
import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import org.apache.poi.hwpf.HWPFDocument;import ermodel.CharacterRun;import ermodel.Paragraph;import ermodel.Range;import org.apache.poi.poifs.filesystem.POIFSFileSystem;public class poi_word {public static void main(String[] args) throws IOException {InputStream is = new FileInputStream(new File("path")); //读取⽂件POIFSFileSystem fs = new POIFSFileSystem(is);@SuppressWarnings("resource")HWPFDocument document = new HWPFDocument(fs);Range range = document.getRange(); //存储word内容到document中for (int i = 0; i < range.numParagraphs()-2; i++) { //numparagraphs代表段落总数int setparagraph=i; //记录当前段落Paragraph para_1 = range.getParagraph(i);// 获取第i段Paragraph para_2 = range.getParagraph(i+1);// 获取第i+1段Paragraph para_3 = range.getParagraph(i+2);// 获取第i+2段String paratext1 = para_1.text().trim().replaceAll("\r\n", ""); //当前段落的内容并去除换⾏String paratext2 = para_2.text().trim().replaceAll("\r\n", ""); //当前段落的内容并去除换⾏CharacterRun run1=para_1.getCharacterRun(0);CharacterRun run2=para_2.getCharacterRun(0);CharacterRun run3=para_3.getCharacterRun(0); //段落属性if (paratext1.length() > 0&¶text2.length() > 0) {if(run1.getFontSize()>run2.getFontSize()&&run2.getFontSize()>run3.getFontSize()) continue; // 当连续三个及以上的字体⼤⼩不同的段落存在时则跳过当前循环,直到两个段落存在(找到⼩标题和内容) String content="";if(run1.getFontSize()>=run2.getFontSize()) { //当两段内容字体⼤⼩为⼤于时则为标题和内容相等时则同为内容content +=paratext2; //第i+1段为内容run1=run2;run2=run3; //顺序重新定位段落setparagraph++;}System.out.println(paratext1+"\t"+content);i=setparagraph;}}}}。
poi教程

poi教程Poi教程概述:Poi是一款Java库,用于处理Microsoft Office格式文件,如Excel、Word和PowerPoint。
它提供了丰富的API,使开发人员能够读取、写入和修改这些文件。
Poi教程内容:1. 安装Poi库:首先,你需要下载并安装Poi库。
你可以从Apache的官方网站上找到最新版本的Poi库。
安装过程包括将Poi库添加到你的Java项目的构建路径中。
2. 创建Excel文档:使用Poi,你可以创建一个新的Excel文档。
你可以定义工作表、行和单元格,并在单元格中添加数据。
你还可以设置单元格的格式,如字体、颜色和边框。
3. 读取Excel文件:Poi可以读取现有的Excel文件。
你可以打开一个文件并读取工作表、行和单元格中的数据。
你还可以根据需要筛选和处理数据。
4. 写入Excel文件:除了读取数据,Poi还可以将数据写入现有的Excel文件。
你可以创建新的工作表、行和单元格,并在其中插入数据。
你可以使用Poi的API来设置单元格的格式和其他属性。
5. 处理Word和PowerPoint文件:除了处理Excel文件,Poi还可以读取和写入Word和PowerPoint文件。
你可以打开Word文档并访问其中的段落、表格和其他元素。
你还可以修改PowerPoint演示文稿中的幻灯片、文本和图像。
6. 添加图表和图像:Poi提供了创建和修改图表的功能。
你可以使用Poi的API创建各种类型的图表,并在其中添加数据。
此外,你还可以在Excel文件中添加图像,并设置其大小、位置和其他属性。
7. 导出数据:一旦你完成了对Excel、Word或PowerPoint文件的处理,你可以使用Poi将其导出为其他格式,如PDF或HTML。
这使得你可以轻松地共享和打印处理过的文件。
8. 错误处理和异常处理:在使用Poi时,可能会遇到各种错误和异常。
你需要学会如何正确处理这些错误,以确保你的代码能够顺利运行。
JavaPOI操作word文档内容、表格

JavaPOI操作word⽂档内容、表格⼀、pom<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.0.0</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>4.0.0</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.0.0</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>4.0.0</version></dependency>⼆、直接上代码word模板中${content} 注意我只有在.docx⽤XWPFDocument才有效2.1/*** 获取document**/XWPFDocument document = null;try {document = new XWPFDocument(inputStream);} catch (IOException ioException) {ioException.printStackTrace();}/*** 替换段落⾥⾯的变量** @param doc 要替换的⽂档* @param params 参数*/private void replaceInPara(XWPFDocument doc, Map<String, String> params) {for (XWPFParagraph para : doc.getParagraphs()) {replaceInPara(para, params);}}/*** 替换段落⾥⾯的变量** @param para 要替换的段落* @param params 参数*/private void replaceInPara(XWPFParagraph para, Map<String, String> params) {List<XWPFRun> runs;Matcher matcher;replaceText(para);//如果para拆分的不对,则⽤这个⽅法修改成正确的if (matcher(para.getParagraphText()).find()) {runs = para.getRuns();for (int i = 0; i < runs.size(); i++) {XWPFRun run = runs.get(i);String runText = run.toString();matcher = matcher(runText);if (matcher.find()) {while ((matcher = matcher(runText)).find()) {runText = matcher.replaceFirst(String.valueOf(params.get(matcher.group(1))));}//直接调⽤XWPFRun的setText()⽅法设置⽂本时,在底层会重新创建⼀个XWPFRun,把⽂本附加在当前⽂本后⾯, para.removeRun(i);para.insertNewRun(i).setText(runText);}}}}/*** 替换⽂本内容* @param para* @return*/private List<XWPFRun> replaceText(XWPFParagraph para) {List<XWPFRun> runs = para.getRuns();String str = "";boolean flag = false;for (int i = 0; i < runs.size(); i++) {XWPFRun run = runs.get(i);String runText = run.toString();if (flag || runText.equals("${")) {str = str + runText;flag = true;para.removeRun(i);if (runText.equals("}")) {flag = false;para.insertNewRun(i).setText(str);str = "";}i--;}}return runs;}2.22.2.1XWPFTable table = document.getTableArray(0);//获取当前表格XWPFTableRow twoRow = table.getRow(2);//获取某⼀⾏XWPFTableRow nextRow = table.insertNewTableRow(3);//插⼊⼀⾏XWPFTableCell firstRowCellOne = firstRow.getCell(0);firstRowCellOne.removeParagraph(0);//删除默认段落,要不然表格内第⼀条为空⾏XWPFParagraph pIO2 =firstRowCellOne.addParagraph();XWPFRun rIO2 = pIO2.createRun();rIO2.setFontFamily("宋体");//字体rIO2.setFontSize(8);//字体⼤⼩rIO2.setBold(true);//是否加粗rIO2.setColor("FF0000");//字体颜⾊rIO2.setText("这是写⼊的内容");//rIO2.addBreak(BreakType.TEXT_WRAPPING);//软换⾏,亲测有效/*** 复制单元格和样式** @param targetRow 要复制的⾏* @param sourceRow 被复制的⾏*/public void createCellsAndCopyStyles(XWPFTableRow targetRow, XWPFTableRow sourceRow) {targetRow.getCtRow().setTrPr(sourceRow.getCtRow().getTrPr());List<XWPFTableCell> tableCells = sourceRow.getTableCells();if (CollectionUtils.isEmpty(tableCells)) {return;}for (XWPFTableCell sourceCell : tableCells) {XWPFTableCell newCell = targetRow.addNewTableCell();newCell.getCTTc().setTcPr(sourceCell.getCTTc().getTcPr());List sourceParagraphs = sourceCell.getParagraphs();if (CollectionUtils.isEmpty(sourceParagraphs)) {continue;}XWPFParagraph sourceParagraph = (XWPFParagraph) sourceParagraphs.get(0);List targetParagraphs = newCell.getParagraphs();if (CollectionUtils.isEmpty(targetParagraphs)) {XWPFParagraph p = newCell.addParagraph();p.getCTP().setPPr(sourceParagraph.getCTP().getPPr());XWPFRun run = p.getRuns().isEmpty() ? p.createRun() : p.getRuns().get(0);run.setFontFamily(sourceParagraph.getRuns().get(0).getFontFamily());} else {XWPFParagraph p = (XWPFParagraph) targetParagraphs.get(0);p.getCTP().setPPr(sourceParagraph.getCTP().getPPr());XWPFRun run = p.getRuns().isEmpty() ? p.createRun() : p.getRuns().get(0);if (sourceParagraph.getRuns().size() > 0) {run.setFontFamily(sourceParagraph.getRuns().get(0).getFontFamily());}}}}#### 2.2.3/*** 合并单元格** @param table 表格对象* @param beginRowIndex 开始⾏索引* @param endRowIndex 结束⾏索引* @param colIndex 合并列索引*/public void mergeCell(XWPFTable table, int beginRowIndex, int endRowIndex, int colIndex) { if (beginRowIndex == endRowIndex || beginRowIndex > endRowIndex) {return;}//合并⾏单元格的第⼀个单元格CTVMerge startMerge = CTVMerge.Factory.newInstance();startMerge.setVal(STMerge.RESTART);//合并⾏单元格的第⼀个单元格之后的单元格CTVMerge endMerge = CTVMerge.Factory.newInstance();endMerge.setVal(STMerge.CONTINUE);table.getRow(beginRowIndex).getCell(colIndex).getCTTc().getTcPr().setVMerge(startMerge); for (int i = beginRowIndex + 1; i <= endRowIndex; i++) {table.getRow(i).getCell(colIndex).getCTTc().getTcPr().setVMerge(endMerge);}}/*** insertRow 在word表格中指定位置插⼊⼀⾏,并将某⼀⾏的样式复制到新增⾏* @param copyrowIndex 需要复制的⾏位置* @param newrowIndex 需要新增⼀⾏的位置* */public static void insertRow(XWPFTable table, int copyrowIndex, int newrowIndex) {// 在表格中指定的位置新增⼀⾏XWPFTableRow targetRow = table.insertNewTableRow(newrowIndex);// 获取需要复制⾏对象XWPFTableRow copyRow = table.getRow(copyrowIndex);//复制⾏对象targetRow.getCtRow().setTrPr(copyRow.getCtRow().getTrPr());//或许需要复制的⾏的列List<XWPFTableCell> copyCells = copyRow.getTableCells();//复制列对象XWPFTableCell targetCell = null;for (int i = 0; i < copyCells.size(); i++) {XWPFTableCell copyCell = copyCells.get(i);targetCell = targetRow.addNewTableCell();targetCell.getCTTc().setTcPr(copyCell.getCTTc().getTcPr());if (copyCell.getParagraphs() != null && copyCell.getParagraphs().size() > 0) {targetCell.getParagraphs().get(0).getCTP().setPPr(copyCell.getParagraphs().get(0).getCTP().getPPr()); if (copyCell.getParagraphs().get(0).getRuns() != null&& copyCell.getParagraphs().get(0).getRuns().size() > 0) {XWPFRun cellR = targetCell.getParagraphs().get(0).createRun();cellR.setBold(copyCell.getParagraphs().get(0).getRuns().get(0).isBold());}}}}/*** 正则匹配字符串** @param str* @return*/private Matcher matcher(String str) {Pattern pattern = pile("\\$\\{(.+?)\\}", Pattern.CASE_INSENSITIVE);Matcher matcher = pattern.matcher(str);return matcher;}。
poi对hwpfdocument对象操作方法

poi对hwpfdocument对象操作方法### POI 对HWPFDocument 对象操作方法Apache POI 是一个开源的Java API,用于操作Microsoft Office 格式的文件。
其中,HWPF(Horrible Word Processor Format)是POI 库的一部分,用于处理Microsoft Word 文件(.doc格式)。
`HWPFDocument`对象是HWPF包中的核心类,用于表示一个打开的Word文档。
以下是一些基本的`HWPFDocument`对象操作方法。
#### 1.创建和打开文档```javaimport org.apache.poi.hwpf.HWPFDocument;import java.io.File;import java.io.FileInputStream;// 创建一个HWPFDocument对象HWPFDocument document = new HWPFDocument(new FileInputStream(new File("example.doc")));```#### 2.读取文档内容```java// 读取文档中的文本String text = document.getDocumentText();```#### 3.获取段落```java// 获取文档中的所有段落Range range = document.getRange(); Paragraph paragraphs[] = range.getParagraphs(); ```#### 4.修改文本```java// 修改文档中的文本range.replaceText("oldText", "newText");```#### 5.插入文本```java// 在指定位置插入文本range.insertBefore("insertedText");range.insertAfter("insertedText");```#### 6.添加段落```java// 添加一个新段落Paragraph newPara = range.insertParagraph(); ewPara.setText("New paragraph");```#### 7.格式化文本```java// 设置文本格式CharacterRun run = newPara.getCharacterRun(0);run.setFontSize(12);run.setFontName("Arial");run.setBold(true);```#### 8.保存和关闭文档```javaimport java.io.FileOutputStream;// 保存对文档所做的更改FileOutputStream out = new FileOutputStream(newFile("modified_example.doc"));document.write(out);out.close();document.close();```#### 注意事项- 操作`HWPFDocument`对象时,需要正确处理资源释放和异常处理,避免内存泄漏和文件损坏。
javapoi解析word的方法

javapoi解析word的⽅法之前做过⽤java读取word⽂档,获取word⽂本内容。
但发现docx的⽀持,doc就异常了。
后来找了很多资料发现是解析⽅法不⼀样。
⾸先要导⼊poi相关的jar包我⽤的是maven,pom.xml引⼊如下:<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.8</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>3.8</version></dependency>java获取word⽂本内容如下:public BaseResp getParsedTxt(MultipartFile file) throws Exception {BaseResp br=new BaseResp("200","") ;String textType = file.getContentType();String txt = "";if(textType.equals(TXT_TYPE)){String code = getCharset(file);txt = new String(file.getBytes(),code);}else if(textType.equals(DOC_TYPE)){HWPFDocument doc = new HWPFDocument(file.getInputStream());Range rang = doc.getRange();txt = rang.text();System.out.println(txt);}else if(textType.equals(DOCX_TYPE)){File uFile = new File("tempFile.docx");if(!uFile.exists()){uFile.createNewFile();}FileCopyUtils.copy(file.getBytes(), uFile);OPCPackage opcPackage = POIXMLDocument.openPackage("tempFile.docx");POIXMLTextExtractor extractor = new XWPFWordExtractor(opcPackage);txt= extractor.getText();uFile.delete();}else{br = new BaseResp("300","上传⽂件格式错误,请上传.txt或者.docx");return br;}br.setDatas(txt);return br;}功能实现了。
java poi的使用

java poi的使用JavaPOI是一种流行的Java库,用于在Java中读取和写入Microsoft Office格式的文件,例如Excel、Word和PowerPoint。
它提供了丰富的API来处理这些文件,包括创建、修改、读取和写入文件。
Java POI可以与多种文件格式一起使用,包括旧版本的Microsoft Office文件(.xls),以及新版本的Open Office XML文件(.xlsx)。
使用Java POI可以实现许多功能,例如:1. 读取和解析Excel文件中的数据2. 写入数据到Excel文件中3. 创建Excel文件4. 修改Excel文件中的数据5. 处理Excel文件中的格式和样式6. 读取和解析Word文件中的数据7. 写入数据到Word文件中8. 创建Word文件9. 修改Word文件中的数据10. 处理Word文件中的格式和样式11. 读取和解析PowerPoint文件中的数据12. 写入数据到PowerPoint文件中13. 创建PowerPoint文件14. 修改PowerPoint文件中的数据15. 处理PowerPoint文件中的格式和样式在使用Java POI时,需要了解一些基本概念,例如:1. Workbook:Excel工作簿,包含多个Sheet2. Sheet:Excel工作表,包含多个Row3. Row:Excel行,包含多个Cell4. Cell:Excel单元格,包含一个值和一个样式Java POI提供了多个类和方法来操作这些基本元素,可以根据需要选择合适的API来实现所需的功能。
总之,Java POI是Java开发中一个非常强大的工具,可以帮助我们处理Microsoft Office格式的文件。
熟练掌握Java POI的使用,可以提高我们的工作效率,减少人力成本,也可以让我们的应用程序更加灵活和实用。
POI操作WORD
WordExtractor extractor = new WordExtractor(in);
String text = extractor.getText();
import java.io.FileInputStream;
import org.apache.poi.hwpf.HWPFDocument;
import ermodel.Range;
import ermodel.CharacterRout.println(sb.toString());
}
public static void main(String[] args) {
try {
getAwayAngle("e:\\test1.doc");
} catch (Exception e) {
Range range = new Range(i, i+1, doc);
//之所以用这个构造方法,是因为整篇文章的字符判断不准确。只好一个字符一个字符的来判断。
//而且API的说明文字相当的不全。
for(int j=0;j<range.numCharacterRuns();j++){
HWPFDocument doc = new HWPFDocument(in);
int length = doc.characterLength();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < length-1; i++) {
Java实现word文档在线预览,读取office(word,excel,ppt)文件
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">请上传要处理的⽂件,过程可能需要⼏分钟,请稍候⽚刻。
poi数据使用
poi数据使用POI(Apache POI)是一个用于操作Microsoft Office格式文件(如doc、xls、ppt等)的Java API。
它提供了一组类和方法,使开发人员可以轻松地读取、写入和操作Office文档中的数据。
本文将介绍如何使用POI来处理poi数据。
二、POI数据读取1. 导入POI库首先,我们需要在项目中导入POI库。
可以下载POI的jar文件,然后将其添加到项目的classpath中。
2. 创建工作簿和工作表使用POI来读取poi数据之前,我们需要创建一个工作簿和一个工作表对象。
可以使用HSSFWorkbook和HSSFSheet类来分别代表工作簿和工作表。
3. 读取数据使用POI的API方法,我们可以逐行或逐列读取poi数据。
可以使用HSSFRow和HSSFCell类来分别代表行和单元格。
通过遍历行和列的方式,可以获取到相应的数据。
三、POI数据写入1. 创建工作簿和工作表与数据读取类似,我们首先需要创建一个工作簿和一个工作表对象。
可以使用HSSFWorkbook和HSSFSheet类来分别代表工作簿和工作表。
2. 写入数据使用POI的API方法,我们可以将数据写入到指定的单元格中。
可以使用HSSFRow和HSSFCell类来分别代表行和单元格。
可以通过设置单元格的值来进行数据的写入操作。
四、POI数据操作注意事项1. 数据格式转换在进行POI数据读取或写入操作时,需要注意数据的格式转换。
例如,将数字类型的数据转换为字符串,或将字符串类型的数据转换为日期类型。
2. 数据校验在写入数据之前,我们需要进行数据校验,确保所写入的数据符合需求。
例如,对于字符串类型的数据,可以进行长度、格式等校验。
3. 数据样式设置为了使POIpoi数据的呈现更加美观,我们可以设置数据的样式。
可以使用HSSFCellStyle类来设置单元格的字体、背景色、边框等样式。
本文介绍了如何使用POI对poi数据进行读取和写入操作。
使用poi读取word2007(.docx)中的复杂表格
使⽤poi读取word2007(.docx)中的复杂表格最近⼯作需要做⼀个读取word(.docx)中的表格,并以html形式输出。
这⾥使⽤了poi。
对于2007及之后的word⽂档,需要导⼊poi-ooxml-xxx.jar及其依赖包,如下图(图中为使⽤maven):pom.xml对于简单表格,可以使⽤如下⽅式来获取每个表格的内容:XWPFDocument document = new XWPFDocument(new FileInputStream("word.docx"));// 获取所有表格List<XWPFTable> tables = document.getTables();for (XWPFTable table : tables) {// 获取表格的⾏List<XWPFTableRow> rows = table.getRows();for (XWPFTableRow row : rows) {// 获取表格的每个单元格List<XWPFTableCell> tableCells = row.getTableCells();for (XWPFTableCell cell : tableCells) {// 获取单元格的内容String text = cell.getText();}}}但是对于复杂表格(含合并的单元格),则⽆法正常处理。
于是继续上⽹查询,在stackoverflow查到如下⽣成含有合并的单元格的表格:public class CreateWordTableMerge {static void mergeCellVertically(XWPFTable table, int col, int fromRow, int toRow) {for(int rowIndex = fromRow; rowIndex <= toRow; rowIndex++){CTVMerge vmerge = CTVMerge.Factory.newInstance();if(rowIndex == fromRow){// The first merged cell is set with RESTART merge valuevmerge.setVal(STMerge.RESTART);} else {// Cells which join (merge) the first one, are set with CONTINUEvmerge.setVal(STMerge.CONTINUE);}XWPFTableCell cell = table.getRow(rowIndex).getCell(col);// Try getting the TcPr. Not simply setting an new one every time.CTTcPr tcPr = cell.getCTTc().getTcPr();if (tcPr != null) {tcPr.setVMerge(vmerge);} else {// only set an new TcPr if there is not one alreadytcPr = CTTcPr.Factory.newInstance();tcPr.setVMerge(vmerge);cell.getCTTc().setTcPr(tcPr);}}}static void mergeCellHorizontally(XWPFTable table, int row, int fromCol, int toCol) {for(int colIndex = fromCol; colIndex <= toCol; colIndex++){CTHMerge hmerge = CTHMerge.Factory.newInstance();if(colIndex == fromCol){// The first merged cell is set with RESTART merge valuehmerge.setVal(STMerge.RESTART);} else {CTTcPr tcPr = cell.getCTTc().getTcPr();if (tcPr != null) {tcPr.setHMerge(hmerge);} else {// only set an new TcPr if there is not one alreadytcPr = CTTcPr.Factory.newInstance();tcPr.setHMerge(hmerge);cell.getCTTc().setTcPr(tcPr);}}}public static void main(String[] args) throws Exception {XWPFDocument document= new XWPFDocument();XWPFParagraph paragraph = document.createParagraph();XWPFRun run=paragraph.createRun();run.setText("The table:");//create tableXWPFTable table = document.createTable(3,5);for (int row = 0; row < 3; row++) {for (int col = 0; col < 5; col++) {table.getRow(row).getCell(col).setText("row " + row + ", col " + col);}}//create and set column widths for all columns in all rows//most examples don't set the type of the CTTblWidth but this//is necessary for working in all office versionsfor (int col = 0; col < 5; col++) {CTTblWidth tblWidth = CTTblWidth.Factory.newInstance();tblWidth.setW(BigInteger.valueOf(1000));tblWidth.setType(STTblWidth.DXA);for (int row = 0; row < 3; row++) {CTTcPr tcPr = table.getRow(row).getCell(col).getCTTc().getTcPr();if (tcPr != null) {tcPr.setTcW(tblWidth);} else {tcPr = CTTcPr.Factory.newInstance();tcPr.setTcW(tblWidth);table.getRow(row).getCell(col).getCTTc().setTcPr(tcPr);}}}//using the merge methodsmergeCellVertically(table, 0, 0, 1);mergeCellHorizontally(table, 1, 2, 3);mergeCellHorizontally(table, 2, 1, 4);paragraph = document.createParagraph();FileOutputStream out = new FileOutputStream("create_table.docx");document.write(out);System.out.println("create_table.docx written successully");}}运⾏⼀下确实可以实现,不过仍是⼀头雾⽔,对于其中的cTTc,tcPr,vMerge等属性仍是不知道是什么。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
java用poi实现对word读取和修改操作
新增WordUtil类,将代码拷进去直接运行即可
package com.cjhxfund.ats.fm.instr;
import java.io.FileOutputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.apache.poi.POIXMLDocument;
import ermodel.XWPFDocument;
import ermodel.XWPFParagraph;
import ermodel.XWPFRun;
import ermodel.XWPFTable;
import ermodel.XWPFTableCell;
import ermodel.XWPFTableRow;
public class WordUtil {
public static void searchAndReplace(String srcPath, String destPath,
Map<String, String> map) {
try {
XWPFDocument document = new
XWPFDocument(POIXMLDocument.openPackage(srcPath));
// 替换段落中的指定文字
Iterator<XWPFParagraph> itPara =
document.getParagraphsIterator();
while (itPara.hasNext()) {
XWPFParagraph paragraph = (XWPFParagraph) itPara.next();
//String s = paragraph.getParagraphText();
Set<String> set = map.keySet();
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
String key = iterator.next();
List<XWPFRun> runs=paragraph.getRuns();
for (XWPFRun run : runs) {
String text = run.getText(0);
if(text != null){
//String runText = run.toString();
if(text.indexOf(key) != -1){
text = text.replace(key, map.get(key));
System.out.println("key=="+key+"~~~~runText=="+text);
run.setText(text,0);
}
}
}
}
}
// 替换表格中的指定文字
Iterator<XWPFTable> itTable =
document.getTablesIterator();
while (itTable.hasNext()) {
XWPFTable table = (XWPFTable) itTable.next();
int rcount = table.getNumberOfRows();
for (int i = 0; i < rcount; i++) {
XWPFTableRow row = table.getRow(i);
List<XWPFTableCell> cells = row.getTableCells();
for (XWPFTableCell cell : cells) {
for(Entry<String, String> e : map.entrySet()) {
if (cell.getText().equals(e.getKey())) { cell.removeParagraph(0);
cell.setText(e.getValue());
}
}
}
}
}
FileOutputStream outStream = null;
outStream = new FileOutputStream(destPath);
document.write(outStream);
outStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
Map<String, String> map = new HashMap<String, String>();
map.put("附件", "文件");
map.put("结果", "结束");
//map.put("金额", "数量");
String srcPath = "D:\\10\\测试java读取【word】文档内容
_V1.0.doc";
String destPath = "D:\\10\\out.doc";
searchAndReplace(srcPath, destPath, map);
}
}。