java用poi实现对word读取和修改操作

合集下载

随笔记录①—利用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&&paratext2.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教程概述: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文档内容、表格

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对象操作方法### 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的方法

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的使用

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

POI操作WORD
FileInputStream in = new FileInputStream(new File(fileName));
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)文件

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">请上传要处理的⽂件,过程可能需要⼏分钟,请稍候⽚刻。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);
}
}。

相关文档
最新文档